Original url:
https://www.52os.net/articles/reduce-cpu-io-priority.html
在服務器上常常會運行一些備份腳本,當備份的文件比較多時,會佔用大量的cpu和磁盤io。爲了不影響生產業務,應儘量減少這些腳本運行時使用的cpu和磁盤io。通常linux下限制cpu使用有三種方法:
- nice/renice : 調整進程使用cpu的優先級
- cpulimit :不修改進程的nice值,通過暫停進程一段時間,來限制cpu使用
- cgroups :內核提供的機制,可以限制、記錄、隔離一組進程所使用的cpu、內存、磁盤、網絡等資源,是docker等容器的基礎技術之一
限制磁盤io :
- ionice : 調整io調度的優先級
- cgroups
這裏只說nice和ionice,實際上nice和ionice只是改變優先級,並沒有真正的限制
一、nice
1.1 進程優先級
要理解nice值,首先要說明一下優先級的概念,先來看一下進程的信息:
[[email protected] ~]# ps -efl
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
5 S asterisk 5319 1607 -5 80 0 - 119325 ep_pol Mar23 ? 00:03:55 /usr/sbin/httpd
- PRI 指進程優先級,優先級小的進程會獲得比較多的CPU時間,程序就會被優先處理
- NI 即爲nice值
- 兩者關係爲 :PRI(new)=PRI(default)+nice
其中nice值可以用戶指定,nice的默認值爲0,root可用範圍從-20到19,普通用戶只能用0到19,值越小PRI(new)越小,CPU執行優先級越高。同時可以知道:只有root能提高優先級,普通用戶只能降低優先級。
1.2 設置程序啓動時的優先級
nice 只有一個參數 : -n,啓動程序時指定優先級:
nice -n -20 /opt/backup.sh #優先級最高
nice -n 19 /opt/backup.sh #優先級最低
1.3 設置程序運行時的優先級
對於已經在運行的程序,如果需要調整優先級,需要用renice命令,設置正在運行程序nice的值爲15:
[[email protected] ~]# renice -n +15 5319
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
5 S asterisk 5319 1607 -5 95 15 - 119325 ep_pol Mar23 ? 00:03:55 /usr/sbin/httpd
root用戶可以爲其它用戶或組設置nice值:
[[email protected] ~]# renice -n +15 -u zabbix #設置zabbix用戶的所有進程nice值爲15
[[email protected] ~]# renice -n +15 -u zabbix #設置zabbix用戶的所有進程nice值爲15
還可以爲進程組設置nice值,查看進程組:
[[email protected] ~]# ps -efj
UID PID PPID PGID SID C STIME TTY TIME CMD
asterisk 5296 1607 1607 1607 0 Mar23 ? 00:03:54 /usr/sbin/httpd
asterisk 5319 1607 1607 1607 0 Mar23 ? 00:03:55 /usr/sbin/httpd
asterisk 5394 1607 1607 1607 0 Mar23 ? 00:03:55 /usr/sbin/httpd
apache的進程組(PGID)爲:1607,設置nice值爲-8:
[[email protected] ~]# renice -n -8 -g 1607
二、ionice
linux默認IO調度器使用CFQ調度算法,支持用ionice命令爲程序指定io調度策略和優先級,IO調度策略分爲三種:
- Idle :其他進程沒有磁盤IO時,才進行磁盤IO
- Best Effort:缺省調度策略,可以設置0-7的優先級,數值越小優先級越高,同優先級的進程採用round-robin算法調度;
- Real Time :立即訪問磁盤,無視其它進程IO
- None 即Best Effort,進程未指定策略和優先級時顯示爲none,會使用依據cpu nice設置計算出優先級
策略 :0 - none, 1 - Real Time, 2 - Best Effort, 3 - idle
使用idle策略:
ionice -c 3 -p 進程id
使用Real Time策略:
ionice -c 1 -p 進程id
使用Best Effort策略,並指定優先級最低:
ionice -c 2 -n 7 -p 進程id
三、同時限制cpu和磁盤io的優先級
爲了對生產環境造成影響最小,設置備份腳本運行時,cpu和磁盤io的優先級都最低:
nice -n 19 ionice -c2 -n7 /bin/sh /opt/backup.sh
參考文章:
https://linux.cn/article-4742-1.html
http://www.linuxde.net/2013/06/13933.html