如何修改一組程序?
lb build
可以建構實時系統映像,並且在建構映像時會呼叫許多程序。如果我按以下方式啟動它:# nice -n 19 ionice -n 7 -c 3 lb build
所有子程序都獲得相同的良好級別:
PID USER IORR IOWR IO IO PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 26196 morfik 0 0 0 B4 20 0 23888 672 668 S 0.0 0.1 0:00.24 │ ├─ -bash 30926 root 0 0 0 B4 20 0 53668 536 536 S 0.0 0.1 0:00.02 │ │ └─ su - 31008 root 0 0 0 B4 20 0 34656 6260 1144 S 0.0 0.6 0:02.60 │ │ └─ -su 11784 root 0 0 0 ?? 39 19 4496 796 524 S 0.0 0.1 0:00.01 │ │ └─ /bin/sh /usr/lib/live/build/build 11797 root 0 0 0 ?? 39 19 4328 612 512 S 0.0 0.1 0:00.00 │ │ └─ /bin/sh ./auto/build 11806 root 0 0 0 ?? 39 19 7028 604 504 S 0.0 0.1 0:00.00 │ │ ├─ tee build.log 11798 root 0 0 0 ?? 39 19 4496 824 532 S 0.0 0.1 0:00.01 │ │ └─ /bin/sh /usr/lib/live/build/build noauto 11915 root 0 0 0 ?? 39 19 4496 836 544 S 0.0 0.1 0:00.01 │ │ └─ /bin/sh /usr/lib/live/build/bootstrap 12753 root 0 0 0 ?? 39 19 4496 856 548 S 0.0 0.1 0:00.02 │ │ └─ /bin/sh /usr/lib/live/build/bootstra 12867 root 0 0 0 ?? 39 19 62980 3508 2132 S 11.2 0.3 0:07.00 │ │ └─ aptitude --assume-yes update 12943 root 0 0 0 ?? 39 19 24296 1916 1568 S 0.0 0.2 0:00.14 │ │ ├─ /usr/lib/apt/methods/xz 12927 root 0 0 0 ?? 39 19 53280 30688 30172 R 86.5 3.0 0:28.65 │ │ ├─ /usr/lib/apt/methods/rred 12891 root 0 0 0 ?? 39 19 24304 1784 1440 S 0.0 0.2 0:00.00 │ │ ├─ /usr/lib/apt/methods/gpgv 12889 root 0 0 0 ?? 39 19 24292 1624 1384 S 0.0 0.2 0:00.00 │ │ ├─ /usr/lib/apt/methods/copy 12887 root 0 0 0 ?? 39 19 32860 1956 1560 S 0.0 0.2 0:00.17 │ │ ├─ /usr/lib/apt/methods/http 12886 root 0 0 0 ?? 39 19 24292 1696 1444 S 0.0 0.2 0:00.00 │ │ └─ /usr/lib/apt/methods/fil
但我忘了添加這個
nice -n 19 ionice -n 7 -c 3
,就跑了lb build
。所以,我嘗試renice
了父程序:# renice -n 19 -p 6187
但這並沒有削弱其他程序。所以,它看起來像這樣:
26196 morfik 0 0 0 B4 20 0 23888 668 664 S 0.0 0.1 0:00.24 │ ├─ -bash 30926 root 0 0 0 B4 20 0 53668 528 528 S 0.0 0.1 0:00.02 │ │ └─ su - 31008 root 0 0 0 B4 20 0 34656 5952 1224 S 0.0 0.6 0:02.62 │ │ └─ -su 6187 root 0 0 0 B7 39 19 4496 800 524 S 0.0 0.1 0:00.00 │ │ └─ /bin/sh /usr/lib/live/build/build 6349 root 0 0 0 B4 20 0 4328 612 512 S 0.0 0.1 0:00.00 │ │ └─ /bin/sh ./auto/build 6351 root 0 0 0 B4 20 0 7028 592 488 S 0.0 0.1 0:00.00 │ │ ├─ tee build.log 6350 root 0 0 0 B4 20 0 4496 828 532 S 0.0 0.1 0:00.01 │ │ └─ /bin/sh /usr/lib/live/build/build noauto 6445 root 0 0 0 B4 20 0 4496 840 548 S 0.0 0.1 0:00.00 │ │ └─ /bin/sh /usr/lib/live/build/bootstrap 7580 root 0 0 0 B4 20 0 4496 856 552 S 0.0 0.1 0:00.02 │ │ └─ /bin/sh /usr/lib/live/build/bootstra 7692 root 0 0 0 B4 20 0 62924 5236 3848 S 15.5 0.5 0:03.78 │ │ └─ aptitude --assume-yes update 7932 root 0 0 0 B4 20 0 54776 16480 15916 R 84.1 1.6 0:16.60 │ │ ├─ /usr/lib/apt/methods/rred 7912 root 0 0 0 B4 20 0 24296 2036 1648 S 0.0 0.2 0:01.62 │ │ ├─ /usr/lib/apt/methods/gzip 7733 root 0 0 0 B4 20 0 27948 5552 1632 S 0.0 0.5 0:02.85 │ │ ├─ /usr/lib/apt/methods/bzip2 7711 root 0 0 0 B4 20 0 24304 1780 1436 S 0.0 0.2 0:00.00 │ │ ├─ /usr/lib/apt/methods/gpgv 7709 root 0 0 0 B4 20 0 30800 2200 1812 S 0.0 0.2 0:01.01 │ │ └─ /usr/lib/apt/methods/http
我可以手動修改所有流程,但它們正在發生變化。
編輯#1
以下命令:
# nice -n 19 ionice -n 7 -c 3 lb build
還設置:
ionice - 設置或獲取程序 io 調度類和優先級。…
-c, –class 調度類名或編號 0:無,1:實時,2:盡力而為,3:空閒
-n, –classdata 調度類數據 0-7 用於實時和盡力而為的類
如何設置
-c
和-n
選擇ionice
流程?
由於所有子程序仍然是會話 ID 的一部分(
sess
在ps
輸出中),我們可以使用以下命令利用該事實:$ parent=6187 $ ps -eo sess:1=,pid:1= |sed -n "s/^$parent //p"
這應該返回給我們從
lb load
. 我們也可以直接從 獲取這個pgrep
,也可以使用-s
開關。$ pgrep -s $parent
然後我們可以
renice
像這樣:$ renice $(pgrep -s $parent)
例子
這是一個人為的例子,希望能說明這一切是如何工作的。我們從一個shell開始,“PID=10515”。
1.確認會話ID
$ ps -j PID PGID SID TTY TIME CMD 10515 10515 10515 pts/8 00:00:00 bash 30781 30781 10515 pts/8 00:00:00 ps
2. 假工作 然後我們開始做一些我們忘記做的假工作
renice
。$ sleep 10000 & $ sleep 10000 &
我們確認它們在我們 shell 的會話 ID (
SID
) 下。$ ps -j PID PGID SID TTY TIME CMD 10515 10515 10515 pts/8 00:00:00 bash 31107 31107 10515 pts/8 00:00:00 sleep 31111 31111 10515 pts/8 00:00:00 sleep 31140 31140 10515 pts/8 00:00:00 ps
3. 獲取與 SID 關聯的 PID 我們可以得到一個所有程序的列表,它
SID
是 10515。$ pgrep -s 10515 10515 31107 31111
4.確認目前nice 現在大家nice的水平是多少?使用此命令檢查:
$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515 10515 10515 0 10515 31107 0 10515 31111 0 10515 31354 0 10515 31355 0
5.更改所有SID後代的nice 好的,所以每個人
nice
都是 0,讓我們改變它。$ renice $(pgrep -s 10515) 31107 (process ID) old priority 0, new priority 19 31111 (process ID) old priority 0, new priority 19
6. 確認 檢查我們的工作:
$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515 10515 10515 0 10515 31107 19 10515 31111 19 10515 31426 0 10515 31427 0
PID 31107 和 31111 是我們的睡眠程序,我們只是將它們的 nice 批量更改為 19,並僅提供有關
SID
它們關聯的資訊。7. 仔細檢查
ps
如果你真的很偏執,你也可以檢查輸出:$ ps -eaf | grep -E "31107|31111" saml 31107 10515 0 22:30 pts/8 00:00:00 sleep 10000 saml 31111 10515 0 22:30 pts/8 00:00:00 sleep 10000 saml 31531 10515 0 22:35 pts/8 00:00:00 grep --color=auto -E 31107|31111
參考
ionice
如果您試圖控制程序的 I/O 優先級以及它們的 nice 級別,您應該能夠將上面的命令範例更改為如下所示:
$ renice -n 19 $(pgrep -s $parent) $ ionice -c 3 -p $(pgrep -s $parent)
如果您查看手冊頁,
ionice
則無法-c 3
與-n
.-c, --class class Specify the name or number of the scheduling class to use; 0 for none, 1 for realtime, 2 for best-effort, 3 for idle. -n, --classdata level Specify the scheduling class data. This only has an effect if the class accepts an argument. For realtime and best-effort, 0-7 are valid data (priority levels).