在与 Quickbox 用户的闲聊中我注意到有人反应 dashboard 在 BT 客户端有大量 IO 的时候容易出现超时问题,为此我尝试了一些解决方案。此日志主要是针对一些计算资源 / IO 资源较为紧张,需要提高部分服务进程 (例如 nginx、mysql、php) 响应速度的情况,在 Systemd 管理进行进程管理的平台上加入默认的优先级参数一定程度上优化响应速度。
Contents
计算优先级:
比较通用的是计算优先级的调整,一个 linux 进程的优先级会参照 “nice” 值来决定, nice 的准许范围是 -20 到 19。数字越大,优先级就越低,默认优先级为 0。
我们可以在 top 或者 ps 中查看一个进程的优先级:
root@VM:~# ps -o pid,comm,nice -p 552 PID COMMAND NI 552 deluged 0
对于一个进程,我们可以通过类似下列代码的方法设置启动优先级:
nice -n 10 apt-get upgrade
对于已经在运行的进程我们也可以设置它的优先级:
root@VM:~# renice 5 -p 569 569 (process ID) old priority 0, new priority 5
由于我们使用 Systemd 管理进程,因此我们可以在 Systemd 的配置文件中加入相关的参数,让这些进程在启动的时候就获得默认的优先级:
[Unit] Description=Deluge Bittorrent Client Daemon After=network.target [Service] Type=simple User=%I LimitNICE=10 ExecStart=/usr/bin/deluged -d ExecStop=/usr/bin/killall -w -s 9 /usr/bin/deluged Restart=on-failure TimeoutStopSec=300 [Install] WantedBy=multi-user.target
IO优先级:
对于一些还在使用单盘 HDD 的使用环境,IO依然会成为服务响应速度的瓶颈,如果使用 CFQ 作为系统的 IO 调度方案,则可以使用 ionice 对进程优先级进行调节。
一个进程的优先级分为 Idle (3)、Best-effort (2)、Realtime(1) 和 none(0)。
我们可以通过如下方法获得进程的 IO 优先级参数:
root@VM:~# ionice -p 552 none: prio 0
通过如下指令设定一个进程的 IO 优先级:
root@VM:~# ionice -p 552 -c 2 root@VM:~# ionice -p 552 best-effort: prio 4
对于 Best-effort 这种优先级,还有 0-7 的优先级可以用 “-n” 设置,数字越小,优先级越高。
依然是在 Systemd 中增加启动参数来设置默认的进程 IO 优先级:
[Unit] Description=Deluge Bittorrent Client Daemon After=network.target [Service] Type=simple User=%I ExecStart=/usr/bin/deluged -d ExecStop=/usr/bin/ionice -c 2 /usr/bin/killall -w -s 9 /usr/bin/deluged Restart=on-failure TimeoutStopSec=300 [Install] WantedBy=multi-user.target
由于不是 Systemd 的参数,因此直接使用 ionice 对启动的进程进行设定。
总结
在 Systemd 中对优先级进行一定的优化可以在一定程度上缓解 CPU 或者 IO 资源的紧张,但是并不能从根本上解决问题,因此最好的办法是对程序本身进行一定的优化,或者提升硬件平台的性能。此外一切的微调都有一定的风险,请勿随意在生产环境中实验。
Reference:
https://www.ibm.com/developerworks/cn/linux/l-lo-io-scheduler-optimize-performance/index.html
https://www.nixtutor.com/linux/changing-priority-on-linux-processes/
https://www.freedesktop.org/software/systemd/man/systemd.exec.html