進程調度器可粗略分為兩類:
實時調度器(kernel),系統中重要的進程由實時調度器調度,獲得CPU能力強。
非實時調度器(user),系統中大部分進程由非實時調度器調度,獲得CPU能力弱。
實時調度器
實時調度器支持的調度策略:數字越大優先級越高
非實時調度器
非實時調度器支持的調度策略:
SCHED_NORMAL,標準的輪詢方式時間共享調度,也稱為SCHED_OTHER。
SCHED_BATCH,針對批量方式執行的進程策略。不像 SCHED_NORMAL 頻繁競爭,任務可以長時間運行。
SCHED_IDLE,用于執行非常低的優先級應用。使用 SCHED_IDLE 調度策略運行的進程比nice 19運行的進程優先級還低。
常規系統上運行的大多數進程都使用 SCHED_OTHER 調度策略。由于并非所有進程都同等重要,因此可以為使用SCHED_OTHER調度策略運行的程序指定相對優先級,稱為nice值。
有40種不同級別的nice值,范圍 -20(最高優先級)到 19(最低優先級):
nice 值越高,代表優先級越低,獲取CPU能力越弱。
nice 值越低,代表優先級越高,獲取CPU能力越強。
注意: 當不存在CPU資源競爭時,即使nice值高的進程也可以獲得足夠CPU資源。
ps命令
[root@server ~ 13:54:23]# ps -o nice,cmd $(pgrep systemd)NI CMD0 /usr/lib/systemd/systemd --switched-root --system --deserialize 220 /usr/lib/systemd/systemd-journald0 /usr/lib/systemd/systemd-udevd0 /usr/lib/systemd/systemd-logind?
默認情況下,子進程將繼承父進程的nice值,通常為0。
[lyk@centos7 ~]$ md5sum /dev/zero &[1] 55725[lyk@centos7 ~]$ ps -o pid,nice,command $$ 55725PID NI COMMAND52751 ? 0 -bash55725 ? 0 md5sum /dev/zero# $$ 代表當前終端中運行的 shell 程序 PID
結論: 優先級最低的實時調度器進程的優先級高于優先級最高的非實時調度器進程的優先級。
以下示例通過top命令查看進程
nice 命令
# nice值默認是10[root@server ~ 18:42:32]# nice md5sum /dev/zero &[1] 2255[root@server ~ 18:43:13]# ps -o pid,nice,commandPID NI COMMAND2163 ? 0 -bash2255 ?10 md5sum /dev/zero2256 ? 0 ps -o pid,nice,command
普通用戶僅允許使用正數的nice值運行程序。
#正數的nice值普通用戶可以設置[lyk@server ~ 18:44:04]$ nice -n 2 md5sum /dev/zero &[1] 2309[lyk@server ~ 18:45:54]$ ps -o pid,nice,command 2255PID NI COMMAND2255 ?10 md5sum /dev/zero[lyk@server ~ 18:44:19]$ nice -n -2 md5sum /dev/zero &[2] 2311#無法設置負數的優先級[lyk@server ~ 18:44:24]$ nice: 無法設置優先級: 權限不夠
renice 命令
#普通用戶只能 降低優先級(提高nice值)[lyk@server ~ 18:51:47]$ sleep 300 &[4] 2436[lyk@server ~ 18:54:45]$ ps -l -p 2436F S ? UID ? PID ? PPID C PRI NI ADDR SZ WCHAN TTY ? ? ? ? TIME CMD0 S ?1000 ? 2436 ? 2266 ?0 ?80 ? 0 - 27013 hrtime pts/0 ? ?00:00:00 sleep[lyk@server ~ 18:54:56]$ renice -n 5 24362436 (進程 ID) 舊優先級為 0,新優先級為 5?#普通用戶改其他擁有者創建的進程失敗2436 (進程 ID) 舊優先級為 0,新優先級為 5[lyk@server ~ 18:55:12]$ renice -n -2 2255renice: 設置 2255 的優先級失敗(進程 ID): 不允許的操作[lyk@server ~ 18:57:06]$ ps -o pid,nice,command 2255PID NI COMMAND2255 ?10 md5sum /dev/zero#進入root修改優先級[root@server ~ 18:57:22]# renice -n -2 22552255 (進程 ID) 舊優先級為 10,新優先級為 -2[root@server ~ 18:57:28]# ps -o pid,nice,command 2255PID NI COMMAND2255 ?-2 md5sum /dev/zero[root@centos7 ~]$ pkill md5sum[1] ? 已終止 ? ? ? ? ? ? ? nice md5sum /dev/zero[2]- 已終止 ? ? ? ? ? ? ? nice -n -2 md5sum /dev/zero[3]+ 已終止 ? ? ? ? ? ? ? nice -n 2 md5sum /dev/zero
管理進程優先級-實時調度策略
chrt 命令用于獲取和設置實時調度器進程優先級,以及更改進程調度器。
示例
# 查看進程優先級范圍,chrt不能用于調整非實時進程nice值優先級。[root@centos7 ~]# chrt -mSCHED_OTHER min/max priority : 0/0SCHED_FIFO min/max priority : 1/99SCHED_RR min/max priority : 1/99SCHED_BATCH min/max priority : 0/0SCHED_IDLE min/max priority : 0/0SCHED_DEADLINE min/max priority : 0/0?# 以SCHED_RR調度器和優先級為5運行md5sum進程[root@server ~ 14:20:59]# chrt -r 5 md5sum /dev/zero &[1] 2020[root@server ~ 14:24:10]# ps -o pid,cls,rtprio,command 2020PID CLS RTPRIO COMMAND2020 RR ? ? ?5 md5sum /dev/zero# 修改進程調度器和優先級[root@server ~ 14:21:53]# chrt -f --pid 10 2020[root@server ~ 14:23:16]# ps -o pid,cls,rtprio,command 2020PID CLS RTPRIO COMMAND2020 FF ? ? 10 md5sum /dev/zero?# 修改進程調度器為非實時[root@server ~ 14:23:25]# chrt -o --pid 0 2020[root@server ~ 14:24:03]# ps -o pid,cls,rtprio,command 2020PID CLS RTPRIO COMMAND2020 TS ? ? ?- md5sum /dev/zero