在 Linux 中,線程是由進(jìn)程來(lái)實(shí)現(xiàn)的,可以認(rèn)為線程就是一個(gè)輕量級(jí)的進(jìn)程,因此,線程調(diào)度是按照進(jìn)程調(diào)度的方式來(lái)進(jìn)行的。這樣設(shè)計(jì),線程調(diào)度流程可以直接復(fù)用進(jìn)程調(diào)度流程,沒(méi)必要再設(shè)計(jì)一個(gè)進(jìn)程內(nèi)的線程調(diào)度器了。
為合江等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及合江網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、合江網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
在 Linux 中,進(jìn)程調(diào)度器是基于進(jìn)程的調(diào)度策略與調(diào)度優(yōu)先級(jí)來(lái)決定調(diào)度哪個(gè)進(jìn)程運(yùn)行。
調(diào)度策略主要包括:
調(diào)度優(yōu)先級(jí)的范圍是 0~99,數(shù)值越大,表示優(yōu)先級(jí)越高。
其中,SCHED_OTHER、SCHED_IDLE、SCHED_BACH 為非實(shí)時(shí)調(diào)度策略,其調(diào)度優(yōu)先級(jí)為 0。而 SCHED_FIFO、SCHED_RR 是實(shí)時(shí)調(diào)度策略,其調(diào)度優(yōu)先級(jí)范圍為 1~99。
實(shí)時(shí)調(diào)度策略的進(jìn)程總是比非實(shí)時(shí)調(diào)度策略的進(jìn)程優(yōu)先級(jí)高。
在 Linux 內(nèi)部實(shí)現(xiàn)中,調(diào)度器會(huì)為每個(gè)可能的調(diào)度優(yōu)先級(jí)維護(hù)一個(gè)可運(yùn)行的進(jìn)程列表,以最高優(yōu)先級(jí)列表頭部的進(jìn)程作為下一次調(diào)度的進(jìn)程,所有的調(diào)度都是搶占式的,如果一個(gè)具有更高調(diào)度優(yōu)先級(jí)的進(jìn)程轉(zhuǎn)換為可運(yùn)行狀態(tài),那么當(dāng)前運(yùn)行的進(jìn)程將被強(qiáng)制進(jìn)入其等待的隊(duì)列中。
SCHED_OTHER
該調(diào)度策略是默認(rèn)的 Linux 分時(shí)調(diào)度策略,該調(diào)度策略為非實(shí)時(shí)的,其調(diào)度優(yōu)先級(jí)總是為 0。
對(duì)于該調(diào)度策略類型的進(jìn)程,調(diào)度器是基于動(dòng)態(tài)優(yōu)先級(jí)來(lái)調(diào)度的。動(dòng)態(tài)優(yōu)先級(jí)跟屬性 nice 有關(guān),nice 的值會(huì)隨著進(jìn)程的運(yùn)行時(shí)間而動(dòng)態(tài)改變,以確保所有具有 SCHED_OTHER 策略的進(jìn)程公平地得到調(diào)度。
在 Linux 中,nice 的值范圍為-20 ~ +19,默認(rèn)值為 0。nice 值越大,則優(yōu)先級(jí)越低,因此相對(duì)較低 nice 值的進(jìn)程可以獲得更多的處理器時(shí)間。
通過(guò)命令 ps -el 查看系統(tǒng)中的進(jìn)程列表,其中 NI 列就是進(jìn)程對(duì)應(yīng)的 nice 值。
使用 top 命令,看到的 NI 列也是進(jìn)程的 nice 值。
調(diào)整 nice 值,可以通過(guò) shell 命令 nice ,該命令可以按照指定的 nice 值運(yùn)行 cmd ,命令的幫助信息為:
重新調(diào)整已運(yùn)行進(jìn)程的 nice 值,可通過(guò) renice 命令實(shí)現(xiàn),命令的幫助信息為:
另外,可以執(zhí)行 top 命令,輸入 r ,根據(jù)提示輸入進(jìn)程的 pid ,再輸入 nice 數(shù)值,也可以調(diào)整進(jìn)程的 nice 值。
SCHED_FIFO
該調(diào)度策略為先入先出調(diào)度策略,簡(jiǎn)單概括,就是一旦進(jìn)程占用了 CPU,則一直運(yùn)行,直到有更高優(yōu)先級(jí)的任務(wù)搶占,或者進(jìn)程自己放棄占用 CPU。
SCHED_RR
該調(diào)度策略為時(shí)間片輪轉(zhuǎn)調(diào)度策略,該調(diào)度策略是基于 SCHED_FIFO 策略的演進(jìn),其在每個(gè)進(jìn)程上增加一個(gè)時(shí)間片限制,當(dāng)時(shí)間片使用完成后,調(diào)度器將該進(jìn)程置于隊(duì)列的尾端,放在尾端保證了所有具有相同調(diào)度優(yōu)先級(jí)的進(jìn)程的調(diào)度公平。
使用 top 命令,如果 PR 列的值為 RT ,則說(shuō)明該進(jìn)程采用的是實(shí)時(shí)調(diào)度策略,其調(diào)度策略為 SCHED_FIFO 或者 SCHED_RR,而對(duì)于非實(shí)時(shí)調(diào)度策略的進(jìn)程,該列的值為 NI + 20 。
可以通過(guò)命令 ps -eo state,uid,pid,ppid,rtprio,time,comm 來(lái)查看進(jìn)程對(duì)應(yīng)的實(shí)時(shí)優(yōu)先級(jí),實(shí)時(shí)優(yōu)先級(jí)位于 RTPRIO 列下,如果進(jìn)程對(duì)應(yīng)的列顯示為 - ,說(shuō)明該進(jìn)程不是實(shí)時(shí)進(jìn)程。
chrt 命令可以用來(lái)很簡(jiǎn)單地更改進(jìn)程的調(diào)度策略與調(diào)度優(yōu)先級(jí)。在 Linux 下查看 chrt 命令的幫助信息:
比如,獲取某個(gè)進(jìn)程的調(diào)度策略,使用如下命令:
在比如,設(shè)置某個(gè)進(jìn)程的調(diào)度策略為 SCHED_FIFO,調(diào)度優(yōu)先級(jí)為 70,使用如下命令:
綁定cpu方式:
c語(yǔ)言:
sched_setaffinity(0, sizeof(mask), mask)
shell命令:
在grup啟動(dòng)時(shí)傳給內(nèi)核參數(shù): isolcpus=2-15, 這里表示隔離第3到16個(gè)CPU, Linux程序只跑在第一和第二個(gè)CPU上, 空閑的CPU我們可以指定跑進(jìn)程了.
這是內(nèi)核文檔里對(duì)內(nèi)核參數(shù)的解釋:
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
Format:
cpu number,...,cpu number
or
cpu number-cpu number
(must be a positive range in ascending order)
or a mixture
cpu number,...,cpu number-cpu number
This option can be used to specify one or more CPUs
to isolate from the general SMP balancing and scheduling
algorithms. You can move a process onto or off an
"isolated" CPU via the CPU affinity syscalls or cpuset.
cpu number begins at 0 and the maximum value is
"number of CPUs in system - 1".
This option is the preferred way to isolate CPUs. The
alternative -- manually setting the CPU mask of all
tasks in the system -- can cause problems and
suboptimal load balancer performance.
linux nice 命令詳解
功能說(shuō)明:設(shè)置優(yōu)先權(quán)。
語(yǔ)法:nice [-n 優(yōu)先等級(jí)][--help][--version][執(zhí)行指令]
補(bǔ)充說(shuō)明:nice指令可以改變程序執(zhí)行的優(yōu)先權(quán)等級(jí)。
參數(shù):-n優(yōu)先等級(jí)或-優(yōu)先等級(jí)或--adjustment=優(yōu)先等級(jí) 設(shè)置欲執(zhí)行的指令的優(yōu)先權(quán)等級(jí)。等級(jí)的范圍從-20-19,其中-20最高,19最低,只有系統(tǒng)管理者可以設(shè)置負(fù)數(shù)的等級(jí)。
--help 在線幫助。
--version 顯示版本信息。
linux renice 命令詳解
功能說(shuō)明:調(diào)整優(yōu)先權(quán)。
語(yǔ)法:renice [優(yōu)先等級(jí)][-g 程序群組名稱...][-p 程序識(shí)別碼...][-u 用戶名稱...]
補(bǔ)充說(shuō)明:renice指令可重新調(diào)整程序執(zhí)行的優(yōu)先權(quán)等級(jí)。預(yù)設(shè)是以程序識(shí)別碼指定程序調(diào)整其優(yōu)先權(quán),您亦可以指定程序群組或用戶名稱調(diào)整優(yōu)先權(quán)等級(jí),并修改所有隸屬于該程序群組或用戶的程序的優(yōu)先權(quán)。等級(jí)范圍從-20--19,只有系統(tǒng)管理者可以改變其他用戶程序的優(yōu)先權(quán),也僅有系統(tǒng)管理者可以設(shè)置負(fù)數(shù)等級(jí)。
參數(shù):
-g 程序群組名稱 使用程序群組名稱,修改所有隸屬于該程序群組的程序的優(yōu)先權(quán)。
-p 程序識(shí)別碼 改變?cè)摮绦虻膬?yōu)先權(quán)等級(jí),此參數(shù)為預(yù)設(shè)值。
-u 用戶名稱 指定用戶名稱,修改所有隸屬于該用戶的程序的優(yōu)先權(quán)。
taskset設(shè)定cpu親和力,cpu親和力是指
CPU調(diào)度程序?qū)傩躁P(guān)聯(lián)性是“鎖定”一個(gè)進(jìn)程,使他只能在一個(gè)或幾個(gè)cpu線程上運(yùn)行。對(duì)于一個(gè)給定的系統(tǒng)上設(shè)置的cpu。給定CPU親和力和進(jìn)程不會(huì)運(yùn)行在任何其他CPU。注意,Linux調(diào)度器還支持自然CPU關(guān)聯(lián):(不能讓這個(gè)cpu只為這一個(gè)進(jìn)程服務(wù))
這里要注意的是我們可以把某個(gè)程序限定在某一些CPU上運(yùn)行,但這并不意味著該程序可以獨(dú)占這些CPU,其實(shí)其他程序還是可以利用這些CPU運(yùn)行。如果要精確控制CPU,taskset就略嫌不足,cpuset才是可以
-a, --all-tasks 操作所有的任務(wù)線程-p, --pid 操作已存在的pid-c, --cpu-list 通過(guò)列表顯示方式設(shè)置CPU
(1)指定1和2號(hào)cpu運(yùn)行25718線程的程序
taskset -cp 1,2 25718
(2),讓某程序運(yùn)行在指定的cpu上 taskset -c 1,2,4-7 tar jcf test.tar.gz test
(3)指定在1號(hào)CPU上后臺(tái)執(zhí)行指定的perl程序
taskset –c 1 nohup perl pi.pl
NICE值. nice值應(yīng)該是熟悉Linux/UNIX的人很了解的概念了,我們都知它是反應(yīng)一個(gè)進(jìn)程“優(yōu)先級(jí)”狀態(tài)的值,其取值范圍是-20至19,一共40個(gè)級(jí)別。. 這個(gè)值越小,表示進(jìn)程”優(yōu)先級(jí)”越高,而值越大“優(yōu)先級(jí)”越低。. 我們可以通過(guò)nice命令來(lái)對(duì)一個(gè)將要執(zhí)行的命令進(jìn)行nice值設(shè)置,方法是:. [root@zorrozou-pc0 zorro]# nice -n 10 bash. 這樣我就又打開(kāi)了一個(gè)bash,并且其nice值設(shè)置為10,而默認(rèn)情況下,進(jìn)程的優(yōu)先級(jí)應(yīng)該是從父進(jìn)程繼承來(lái)的,這個(gè)值一般是0。. 我們可以通過(guò)nice命令直接查看到當(dāng)前shell的nice值.
一,使用taskset充分利用多核cpu,讓cpu的使用率均衡到每個(gè)cpu上
#taskset
-p, 設(shè)定一個(gè)已存在的pid,而不是重新開(kāi)啟一個(gè)新任務(wù)
-c, 指定一個(gè)處理,可以指定多個(gè),以逗號(hào)分隔,也可指定范圍,如:2,4,5,6-8。
1,切換某個(gè)進(jìn)程到指定的cpu上
taskset -cp 3 13290
2,讓某程序運(yùn)行在指定的cpu上
taskset -c 1,2,4-7 tar jcf test.tar.gz test
需要注意的是,taskset -cp 3 13290在設(shè)定一個(gè)已經(jīng)存在的pid時(shí),子進(jìn)程并不會(huì)繼承父進(jìn)程的,
因此像tar zcf xxx.tar.gz xxx這樣的命令,最好在啟動(dòng)時(shí)指定cpu,如果在已經(jīng)啟動(dòng)的情況下,則需要指定tar調(diào)用的gzip進(jìn)程。
二,使用nice和renice設(shè)置程序執(zhí)行的優(yōu)先級(jí)
格式:nice [-n 數(shù)值] 命令
nice 指令可以改變程序執(zhí)行的優(yōu)先權(quán)等級(jí)。指令讓使用者在執(zhí)行程序時(shí),指定一個(gè)優(yōu)先等級(jí),稱之為 nice 值。
這個(gè)數(shù)值從最高優(yōu)先級(jí)的-20到最低優(yōu)先級(jí)的19。負(fù)數(shù)值只有 root 才有權(quán)力使。
一般使用者,也可使用 nice 指令來(lái)做執(zhí)行程序的優(yōu)先級(jí)管理,但只能將nice值越調(diào)越高。
可以通過(guò)二種方式來(lái)給某個(gè)程序設(shè)定nice值:
1,開(kāi)始執(zhí)行程序時(shí)給定一個(gè)nice值,用nice命令
2,調(diào)整某個(gè)運(yùn)行中程序的PID的nice值,用renice命令
通常通過(guò)調(diào)高nice值來(lái)備份,為的是不占用非常多的系統(tǒng)資源。
例:
nice -n 10 tar zcf test.tar.gz test
由nice啟動(dòng)的程序,其子進(jìn)程會(huì)繼承父進(jìn)程的nice值。
查看nice值
# nice -n -6 vim test.txt
# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 19427 2637 0 75 0 – 16551 wait pts/6 00:00:00 bash
4 T 0 21654 19427 0 71 -6 – 23464 finish pts/6 00:00:00 vim
renice調(diào)整運(yùn)行中程序的nice值
格式:renice [nice值] PID
三,使用ulimit限制cpu占用時(shí)間
注意,ulimit 限制的是當(dāng)前shell進(jìn)程以及其派生的子進(jìn)程。因此可以在腳本中調(diào)用ulimit來(lái)限制cpu使用時(shí)間。
例如,限制tar的cpu占用時(shí)間,單位秒。
# cat limit_cpu.sh
ulimit -SHt 100
tar test.tar.gz test
如果tar占用時(shí)間超過(guò)了100秒,tar將會(huì)退出,這可能會(huì)導(dǎo)致打包不完全,因此不推薦使用ulimit對(duì)cpu占用時(shí)間進(jìn)行限制。
另外,通過(guò)修改系統(tǒng)的/etc/security/limits配置文件,可以針對(duì)用戶進(jìn)行限制。
四,使用程序自帶的對(duì)cpu使用調(diào)整的功能
某些程序自帶了對(duì)cpu使用調(diào)整的功能,比如nginx服務(wù)器,通過(guò)其配置文件,可以為工作進(jìn)程指定cpu,如下:
worker_processes 3;
worker_cpu_affinity 0001 0010 0100 1000;
這里0001 0010 0100 1000是掩碼,分別代表第1、2、3、4顆cpu核心,這就使得cpu的使用比較平均到每個(gè)核心上。
nice是在進(jìn)程還沒(méi)有運(yùn)行的時(shí)候運(yùn)行一個(gè)進(jìn)程,指定優(yōu)先級(jí)。
renice是改變已運(yùn)行進(jìn)程的優(yōu)先級(jí)。