systemd攻略
相關(guān)文檔
紅帽7官方文檔 SYSTEM ADMINISTRATOR'S GUIDE
帶著疑惑看文檔
第一關(guān):基礎(chǔ)問題
- systemd背景基礎(chǔ)命令有哪些获讳?
- jounalctl日志管理命令知多少?
- 如何開機(jī)啟動httpd.service蜘渣?
- systemctl list-units 和 systemctl list-unit-files 輸出有什么區(qū)別?
- systemctl --failed 輸出的是什么?
- static invalid 是什么意思纸镊?
#systemctl list-unit-files
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
crond.service enabled
dbus-org.freedesktop.network1.service invalid
cpupower.service disabled
第二關(guān):中級問題
- systemd中的unit是什么概念悉尾?
- unit文件類型有哪些世澜?
- 如何編寫一個unit文件怔昨?
- unit文件中哪些參數(shù)是常見的雀久,重要的?
第三關(guān):進(jìn)階問題
- DBUS是什么趁舀?
- Target是什么岸啡?Target 與 傳統(tǒng) RunLevel 的對應(yīng)關(guān)系?
#systemctl list-units
slices.target
dbus.socket
test.slice
sshd.service
sys-devices-platform-serial8250-tty-ttyS3.device
brandbot.path
logstore.mount
systemd-journald.socket
systemd-tmpfiles-clean.timer
proc-sys-fs-binfmt_misc.automount
- 6u的cgroup和7u的cgroup有哪些區(qū)別赫编?
- 7u的cgroup中的slice,scope奋隶,service的概念區(qū)別是什么擂送?
- 如何在6u上管理cgroup?libcgroup
- 如何在7u上管理cgroup唯欣?systemd-run
- 在7u上從臨時創(chuàng)建cgroup到永久創(chuàng)建cgroup需要做什么嘹吨?
- cgroup中cpu管理中的CPUShares,cpu.cfs_period_us 和 cpu.cfs_quota_us 你需要清楚
- cgroup中mem管理中的memory.max_usage_in_bytes 參數(shù)你需要清楚
- cgroup中cpuacct管理中cpuacct.stat統(tǒng)計使用量境氢,你需要知道
- cpu蟀拷,mem,等等的管理萍聊,你需要對
/sys/fs/cgroup/memory/
有大致的了解
[root@jiangyi02.sqa.zmf /usr/lib/systemd/system]
#cat /proc/1049/cgroup
10:memory:/
9:cpuset:/
8:hugetlb:/
7:perf_event:/
6:cpuacct,cpu:/
5:blkio:/
4:freezer:/
3:devices:/
2:net_cls:/
1:name=systemd:/system.slice/syslog-ng.service
- 一些命令
#systemd-cgls
#mount|awk '$5=="cgroup" {print $0}'
如何讀man手冊
在linux上问芬,其實很多知識在man手冊里的都可以獲得的,但是寿桨,對于新鮮的systemd此衅,也許作為小白,可能一開始還真不太知道該man什么亭螟?強(qiáng)大的man手冊本身背后的邏輯和關(guān)聯(lián)性很好的反映了systemd背后知識體系的關(guān)系
首先挡鞍,應(yīng)該先#man 1 systemd 這里入手 ,你將對systemd有一個全面的了解预烙,并且知道systemd有12種類型的unit:
-
看完#man 1 systemd墨微,你肯定會對12種類型的unit有很多的疑問,究竟這些unit的細(xì)節(jié)扁掸;
man systemd.service man systemd.socket man systemd.target man systemd.device man systemd.mount man systemd.automount man systemd.snapshot man systemd.timer man systemd.swap man systemd.path man systemd.slice man systemd.scope
最為特殊的是systemd.special翘县,從這里你將獲知很多的系統(tǒng)特殊的東西:
man systemd.special
basic.target, bluetooth.target, ctrl-alt-del.target, cryptsetup.target, cryptsetup-pre.target, dbus.service, dbus.socket, default.target,
display-manager.service, emergency.target, exit.target, final.target, getty.target, graphical.target, halt.target, hibernate.target,
hybrid-sleep.target, initrd-fs.target, kbrequest.target, kexec.target, local-fs.target, local-fs-pre.target, multi-user.target, network.target,
network-online.target, network-pre.target, nss-lookup.target, nss-user-lookup.target, paths.target, poweroff.target, printer.target, reboot.target,
remote-fs.target, remote-fs-pre.target, rescue.target, initrd-root-fs.target, rpcbind.target, runlevel2.target, runlevel3.target, runlevel4.target,
runlevel5.target, shutdown.target, sigpwr.target, sleep.target, smartcard.target, sockets.target, sound.target, suspend.target, swap.target,
sysinit.target, syslog.socket, system-update.target, time-sync.target, timers.target, umount.target, -.slice, system.slice, user.slice,
machine.slice
- 然后最域,你將開始對每一類型的unit文件的語法和參數(shù)使用有疑問,此時炼蹦,你應(yīng)該#man 5 systemd.unit
systemd全面了解:about unit types
#man 1 systemd
systemd provides a dependency system between various entities called "units" of 12 different types.
majority of units are configured in unit configuration files, whose syntax and basic set of options is described in systemd.unit(5)
The following unit types are available:
1. Service units, which start and control daemons and the processes they consist of. For details see systemd.service(5).
2. Socket units, which encapsulate local IPC or network sockets in the system, useful for socket-based activation. For details about socket units
see systemd.socket(5), for details on socket-based activation and other forms of activation, see daemon(7).
3. Target units are useful to group units, or provide well-known synchronization points during boot-up, see systemd.target(5).
4. Device units expose kernel devices in systemd and may be used to implement device-based activation. For details see systemd.device(5).
5. Mount units control mount points in the file system, for details see systemd.mount(5).
6. Automount units provide automount capabilities, for on-demand mounting of file systems as well as parallelized boot-up. See
systemd.automount(5).
7. Snapshot units can be used to temporarily save the state of the set of systemd units, which later may be restored by activating the saved
snapshot unit. For more information see systemd.snapshot(5).
8. Timer units are useful for triggering activation of other units based on timers. You may find details in systemd.timer(5).
9. Swap units are very similar to mount units and encapsulate memory swap partitions or files of the operating system. They are described in
systemd.swap(5).
10. Path units may be used to activate other services when file system objects change or are modified. See systemd.path(5).
11. Slice units may be used to group units which manage system processes (such as service and scope units) in a hierarchical tree for resource
management purposes. See systemd.slice(5).
12. Scope units are similar to service units, but manage foreign processes instead of starting them as well. See systemd.scope(5).
帶你劃重點(diǎn)
如何自己寫一個unit羡宙?
我們經(jīng)常寫的肯定是service unit,首先掐隐,
- [Unit]是每個unit文件都需要有的
- [Service] 區(qū)塊:定義如何啟動當(dāng)前服務(wù)狗热,
- [Install區(qū)塊],定義如何安裝這個配置文件虑省,即怎樣做到開機(jī)啟動匿刮。
#systemctl cat httpd.service
# /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server //
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=notify
CPUShares=1500
MemoryLimit=1G
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
依賴關(guān)系和前后順序
依賴關(guān)系:Requires和Wants
前后順序:After,Before
依賴關(guān)系探颈,前后順序是比較容易混淆的熟丸,當(dāng)使用Requires和Wants的時候,
- 如果不搭配After伪节,Before使用光羞,比如:
unit A Requires unit B, 那么A和B會一起啟動,如果B失敗了怀大,A也就失敗了纱兑,只有B成功了,A才能成功化借;
unit A Wants unit B, 那么A和B會一起啟動潜慎,如果B失敗了,A也就失敗了蓖康,只有B成功了铐炫,A才能成功;
- 建議搭配After蒜焊,Before使用,比如:
unit A Requires unit B, 那么同時最好unit A中寫上:After=B
unit處理依賴關(guān)系:Requires和Wants的區(qū)別倒信?
使用systemd時,可通過正確編寫單元配置文件來解決其依賴關(guān)系泳梆。典型的情況是堤结,單元A要求單元B在A啟動之前運(yùn)行。在此情況下鸭丛,向單元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可竞穷。若此依賴關(guān)系是可選的,可添加 Wants=B 和 After=B鳞溉。請注意 Wants= 和Requires= 并不意味著 After=瘾带,即如果 After= 選項沒有制定,這兩個單元將被并行啟動熟菲。
依賴關(guān)系通常被用在服務(wù)(service)而不是目標(biāo)(target)上看政。例如朴恳, network.target 一般會被某個配置網(wǎng)絡(luò)接口的服務(wù)引入,所以允蚣,將自定義的單元排在該服務(wù)之后即可于颖,因為 network.target 已經(jīng)啟動。
unit文件中嚷兔,服務(wù)類型: Type= 參數(shù)
編寫自定義的 service 文件時森渐,可以選擇幾種不同的服務(wù)啟動方式。啟動方式可通過配置文件 [Service] 段中的 Type= 參數(shù)進(jìn)行設(shè)置冒晰。
- Type=simple(默認(rèn)值):systemd認(rèn)為該服務(wù)將立即啟動同衣。服務(wù)進(jìn)程不會fork。如果該服務(wù)要啟動其他服務(wù)壶运,不要使用此類型啟動耐齐,除非該服務(wù)是socket激活型。
- Type=forking:systemd認(rèn)為當(dāng)該服務(wù)進(jìn)程fork蒋情,且父進(jìn)程退出后服務(wù)啟動成功埠况。對于常規(guī)的守護(hù)進(jìn)程(daemon),除非你確定此啟動方式無法滿足需求棵癣,使用此類型啟動即可询枚。使用此啟動類型應(yīng)同時指定 PIDFile=,以便systemd能夠跟蹤服務(wù)的主進(jìn)程浙巫。
- Type=oneshot:這一選項適用于只執(zhí)行一項任務(wù)、隨后立即退出的服務(wù)刷后〉某耄可能需要同時設(shè)置 RemainAfterExit=yes 使得 systemd 在服務(wù)進(jìn)程退出之后仍然認(rèn)為服務(wù)處于激活狀態(tài)。
- Type=notify:與 Type=simple 相同尝胆,但約定服務(wù)會在就緒后向 systemd 發(fā)送一個信號丧裁。這一通知的實現(xiàn)由 libsystemd-daemon.so 提供。
- Type=dbus:若以此方式啟動含衔,當(dāng)指定的 BusName 出現(xiàn)在DBus系統(tǒng)總線上時煎娇,systemd認(rèn)為服務(wù)就緒。
- Type=idle: systemd會等待所有任務(wù)處理完成后贪染,才開始執(zhí)行idle類型的單元缓呛。其他行為和Type=simple 類似。
type的更多解釋可以參考 systemd.service(5)杭隙。
什么是DBus哟绊?
參考鏈接
IntroductionToDBus at IntroductionToDBus
Install
D-Bus is enabled automatically when using systemd because dbus is a dependency of systemd.
DBus是一種IPC機(jī)制
DBus是一種IPC機(jī)制,由freedesktop.org項目提供痰憎,使用GPL許可證發(fā)行票髓,用于進(jìn)程間通信或進(jìn)程與內(nèi)核的通信攀涵。
注:Linux中的IPC通信機(jī)制還包括,管道(fifo)洽沟,共享內(nèi)存以故,信號量,消息隊列裆操,Socket等怒详。
DBus進(jìn)程間通信主要有三層架構(gòu):
- 底層接口層:主要是通過libdbus這個函數(shù)庫,給予系統(tǒng)使用DBus的能力跷车。
- 總線層:主要Message bus daemon這個總線守護(hù)進(jìn)程提供的棘利,在Linux系統(tǒng)啟動時運(yùn)行,負(fù)責(zé)進(jìn)程間的消息路由和傳遞朽缴,其中包括Linux內(nèi)核和Linux桌面環(huán)境的消息傳遞善玫。總線守護(hù)進(jìn)程可同時與多個應(yīng)用程序相連密强,并能把來自一個應(yīng)用程序的消息路由到0或者多個其他程序茅郎。
- 應(yīng)用封裝層:通過一系列基于特定應(yīng)用程序框架將DBus的底層接口封裝成友好的Wrapper庫,供不同開發(fā)人員使用(DBus官方主頁http://www.freedesktop.org/wiki/Software/dbus或渤,提供了大部分編程語言的DBus庫版本)系冗。比如libdbus-glib, libdbus-python.
Target和傳統(tǒng)的啟動級別之間的關(guān)系
啟動級別(runlevel)是一個舊的概念。現(xiàn)在薪鹦,systemd 引入了一個和啟動級別功能相似又不同的概念——目標(biāo)(target)掌敬。不像數(shù)字表示的啟動級別,每個目標(biāo)都有名字和獨(dú)特的功能池磁,并且能同時啟用多個奔害。一些目標(biāo)繼承其他目標(biāo)的服務(wù),并啟動新服務(wù)地熄。systemd 提供了一些模仿 sysvinit 啟動級別的目標(biāo)华临,仍可以使用舊的 telinit 啟動級別 命令切換。
獲取當(dāng)前目標(biāo)
不要使用 runlevel 命令了:
$ systemctl list-units --type=target
修改默認(rèn)啟動級別/目標(biāo)
開機(jī)啟動進(jìn)的目標(biāo)是 default.target端考,默認(rèn)鏈接到 graphical.target (大致相當(dāng)于原來的啟動級別5)雅潭。可以通過內(nèi)核參數(shù)更改默認(rèn)啟動級別:
- systemd.unit=multi-user.target (大致相當(dāng)于級別3)
- systemd.unit=rescue.target (大致相當(dāng)于級別1)
另一個方法是修改 default.target却特》龉可以通過 systemctl 修改它:
# systemctl set-default multi-user.target
要覆蓋已經(jīng)設(shè)置的default.target,請使用 force:
# systemctl set-default -f multi-user.target
可以在 systemctl 的輸出中看到命令執(zhí)行的效果:鏈接 /etc/systemd/system/default.target 被創(chuàng)建裂明,指向新的默認(rèn)啟動級別诚欠。
定時器timer是什么鬼?
定時器是以 .timer 為后綴的配置文件,記錄由system的里面由時間觸發(fā)的動作, 定時器可以替代 cron 的大部分功能轰绵。詳情參閱 systemd/Timers (簡體中文).
服務(wù)單元
每個 .timer 文件所在目錄都得有一個對應(yīng)的 .service 文件(如 foo.timer 和 foo.service)粉寞。.timer 用于激活并控制 .service 文件。 .service 文件中不需要包含 [Install] 部分左腔,因為這由 timer 單元接管唧垦。必要時通過在定時器的 [Timer] 部分指定 Unit= 選項來控制一個與定時器不同名的服務(wù)單元。
管理
使用 timer 單元時像其他單元一樣 enable 或 start 即可(別忘了添加 .timer 后綴)液样。要查看所有已啟用的定時器振亮,運(yùn)行:
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Thu 2014-07-10 19:37:03 CEST 11h left Wed 2014-07-09 19:37:03 CEST 12h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Fri 2014-07-11 00:00:00 CEST 15h left Thu 2014-07-10 00:00:13 CEST 8h ago logrotate.timer logrotate.service
systemd-journald和syslog之間的秘密
[root@baseos_server01.cloud.dg /home/ahao.mah]
#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 50G 4.4G 43G 10% /
devtmpfs 32G 0 32G 0% /dev
tmpfs 32G 364K 32G 1% /dev/shm
tmpfs 32G 57M 32G 1% /run 日志存在這里就是存在內(nèi)存里,明顯不合理鞭莽,有的docker機(jī)器這里日志量坊秸,占用內(nèi)存量很大,需要解決澎怒;
tmpfs 32G 0 32G 0% /sys/fs/cgroup
/dev/sda1 243M 71M 157M 31% /boot
tmpfs 6.3G 0 6.3G 0% /run/user/0
tmpfs 6.3G 0 6.3G 0% /run/user/122575
如何查看journal二進(jìn)制日志文件褒搔?
[root@baseos_server01.cloud.dg /home/ahao.mah]
#ll /run/log/journal/613fd1717b844226af5ea83f4849d6dd/system.journal
-rw-r-x---+ 1 root systemd-journal 58720256 Aug 15 10:51 /run/log/journal/613fd1717b844226af5ea83f4849d6dd/system.journal
使用查看xxx.journal的方法有兩種:
第一種:指定目標(biāo)文件
[root@baseos_server01.cloud.dg /home/ahao.mah]
#journalctl --file /run/log/journal/613fd1717b844226af5ea83f4849d6dd/system.journal
第二種:指定目標(biāo)目錄
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#journalctl -D /var/log/journal/
問題:systemd-journald請不用占用我的內(nèi)存
這里有個問題,是很多docker的機(jī)器喷面,內(nèi)存本來就不多星瘾,systemd-journald 產(chǎn)生的日志導(dǎo)入/run/log/journal/里,占用了大量的內(nèi)存空間惧辈,不合理琳状;
通過查看man手冊,可以知道#man 5 journald.conf
你會發(fā)現(xiàn)盒齿,Storage=的值可以是"volatile", "persistent", "auto" and "none"念逞,但是,默認(rèn)的是auto边翁,
- volatile代表日志只存在內(nèi)存中翎承,即/run/log/journal/
- persistent代表日志只存在磁盤中,即/var/log/journal/
- auto代表日志存在磁盤中倒彰,或者內(nèi)存中,這個取決于你是否創(chuàng)建/var/log/journal/目錄@痴觥待讳!這個也算是一個坑吧,看來大家都需要手動
mkdir -p /var/log/journal/;systemctl restart systemd-journald
來解放自己的內(nèi)存了Q鼋恕4吹! - none南吮,表示琳彩,日志不保留,全部drop,只有當(dāng)你決定不使用systemd-journald的時候露乏,你可以使用碧浊!
7u的systemd-journald默認(rèn)幫你存多少日志量?
- 默認(rèn)日志最大限制為所在文件系統(tǒng)容量的 10%瘟仿,即:如果 /var/log/journal 儲存在 50GiB 的根分區(qū)中箱锐,那么日志最多存儲 5GiB 數(shù)據(jù)±徒希可以修改配置文件指定最大限制驹止。如限制日志最大 50MiB:
/etc/systemd/journald.conf
SystemMaxUse=50M
7u上如何手動清理日志?
/var/log/journal 存放著日志, rm 應(yīng)該能工作. 或者使用journalctl,
例如:
清理日志使總大小小于 100M:
# journalctl --vacuum-size=100M
清理最早兩周前的日志:
# journalctl --vacuum-time=2weeks
有了systemd-journald,我們是否還需要syslog-ng,rsyslog?
在man手冊里#man journald.conf
观蜗,有一段關(guān)于systemd-journald和第三方syslog的關(guān)系的描述臊恋,如果,我們想步子邁大一些墓捻,不使用第三方syslog 當(dāng)然是可以的抖仅,如果我們想小步走,可以繼續(xù)使用第三方syslog毙替。man手冊介紹了兩種方式讀日志岸售;
- /run/systemd/journal/syslog + ForwardToSyslog= yes 的方式,傳給syslog-ng厂画,此時凸丸,syslog-ng的source必須是
source s_sys {
# Source additional configuration files (.conf extension only)
system();
internal();
};
至于問什么?請參考:wiki.archlinux.org中介紹的Syslog-ng
- in a second method, a syslog daemon behaves like a normal journal client, and reads messages from the journal files, similarly to journalctl(1). In this
method, messages do not have to be read immediately, which allows a logging daemon which is only started late in boot to access all messages since
the start of the system. In addition, full structured meta-data is available to it. This method of course is available only if the messages are
stored in a journal file at all. So it will not work if Storage=none is set. It should be noted that usually the second method is used by syslog
daemons, so the Storage= option, and not the ForwardToSyslog= option, is relevant for them.
7u上的cgroup淺談
其實袱院,網(wǎng)上對6u的介紹比較多屎慢,但是7u的較少一些,最重要的是理解cgroup的內(nèi)部邏輯和機(jī)制忽洛,7u上最好的文檔就是man手冊腻惠,熟悉man手冊,對systemd的深入了解至關(guān)重要欲虚;基本的概念其實沒有必要在本文中再重復(fù)重復(fù)重復(fù)集灌,而是在腦海里對其整個體系結(jié)構(gòu)有一個框架,帶著疑問去看man手冊复哆;
帶著疑問看man手冊
- 6u上的libconfig(/etc/cgconfig.conf)欣喧,7u上還有嗎?
參考鏈接
對6u的cgroup講解的很好Blog(6u): how to use cgroup
與 cgroup 相關(guān)的 systemd man文檔
以下的 manual page 包含 systemd 中統(tǒng)一的 cgroup 層級基本信息:
- systemd.resource-control(5) —— 描述系統(tǒng)單位共享的資源控制配置選項梯找。
- systemd.unit(5) —— 描述所有單位配置文件的共同選項唆阿。
- systemd.slice(5) —— 提供 .slice 單位的基本信息。
- systemd.scope(5) —— 提供 .scope 單位的基本信息锈锤。
- systemd.service(5) —— 提供 .service 單位的基本信息驯鳖。
與 cgroup 相關(guān)的 Systemd 工具幫助頁面
- systemd-run(1) —— 此 manual page 列出了 systemd-run 實用工具的全部命令列選項闲询。
- systemctl(1) —— systemctl 實用工具的 manual page 列出了可用選項及指令。
- systemd-cgls(1) —— 此 manual page 列出了 systemd-cgls 實用工具的全部命令列選項浅辙。
- systemd-cgtop(1) —— 此 manual page 包含了 systemd-cgtop 實用工具的全部命令列選項扭弧。
- machinectl(1) —— 此 manual page 列出了 machinectl 實用工具的全部命令列選項。
- systemd.kill(5) —— 此 manual page 為系統(tǒng)單位提供了終止配置選項的概述摔握。
初感受:user.slice用戶會話
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#systemd-cgls
..
..
├─user.slice
│ ├─user-122575.slice
│ │ └─session-86733.scope
│ │ ├─15404 sshd: ahao.mah [priv
│ │ ├─15406 sshd: ahao.mah@pts/0
│ │ ├─15407 -bash
│ │ ├─15443 sudo su -c bash
│ │ ├─15450 su -c bash
│ │ ├─15451 bash
│ │ ├─91380 systemd-cgls
│ │ └─91381 less
│ └─user-0.slice
│ └─session-1.scope
│ ├─ 1554 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1556 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1557 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1558 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1560 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1561 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─119532 /home/staragent/bin/staragentd
│ └─119533 staragent-core
..
..
當(dāng)我新打開一個session寄狼,如下,會產(chǎn)生一樹枝:session-86942.scope
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#systemd-cgls
..
..
├─user.slice
│ ├─user-122575.slice
│ │ ├─session-86942.scope
│ │ │ ├─91454 sshd: ahao.mah [priv
│ │ │ ├─91476 sshd: ahao.mah@pts/1
│ │ │ └─91477 -bash
│ │ └─session-86733.scope
│ │ ├─15404 sshd: ahao.mah [priv
│ │ ├─15406 sshd: ahao.mah@pts/0
│ │ ├─15407 -bash
│ │ ├─15443 sudo su -c bash
│ │ ├─15450 su -c bash
│ │ ├─15451 bash
│ │ ├─91513 systemd-cgls
│ │ └─91514 less
│ └─user-0.slice
│ └─session-1.scope
│ ├─ 1554 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1556 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1557 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1558 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1560 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─ 1561 /usr/alisys/dragoon/bin/DragoonAgent
│ ├─119532 /home/staragent/bin/staragentd
│ └─119533 staragent-core
..
..
看了上面氨淌,你應(yīng)該對user-0.slice產(chǎn)生疑惑才對泊愧,為什么在user.slice下,會存在user-0.slice這個slice呢盛正?删咱?也許猜猜可能知道,這個是集團(tuán)DragoonAgent 產(chǎn)生的豪筝。但是它是怎么產(chǎn)生的呢痰滋?留下這個疑問。
How to use cgroup at 7u
- transient cgroup(臨時 cgroup):請使用 systemd-run 指令啟動此服務(wù),如此续崖,可以限制此服務(wù)在運(yùn)行時所用資源敲街。對 systemd 進(jìn)行 API 調(diào)用,應(yīng)用程序可以動態(tài)創(chuàng)建臨時 cgroup严望。
- persistent cgroup(永久 cgroup),請對其單位配置文件進(jìn)行編寫多艇。系統(tǒng)重啟后,此項配置會被保留像吻,所以它可以用于管理自動啟動的服務(wù)峻黍。請注意,scope 單位不能以此方式創(chuàng)建拨匆。
7u上創(chuàng)建臨時cgroup
查看man手冊姆涩,獲得systemd-run用法:systemd-run(1) manual page
如下:
用法:
systemd-run --unit=name --scope --slice=slice_name command
解釋:
--unit=toptest 代表您想要此單位被識別的名稱。如果 --unit 沒有被指定惭每,單位名稱會自動生成骨饿。建議選擇一個描述性的名字,因為它將代表 systemctl 輸出中的單位台腥。在單位運(yùn)行時期間宏赘,此名字需為獨(dú)一無二的。
使用可選的 --scope 參數(shù)創(chuàng)建臨時 scope 單位來替代默認(rèn)創(chuàng)建的 service 單位览爵。
--slice 選項置鼻,讓您新近創(chuàng)建的 service 或 scope 單位可以成為指定 slice 的一部分镇饮。用現(xiàn)存 slice(如 systemctl -t slice 輸出所示)的名字替代 slice_name蜓竹,或者通過傳送一個獨(dú)有名字來創(chuàng)建新 slice。默認(rèn)情況下,service 和 scope 做為 system.slice 的一部分被創(chuàng)建俱济。
用您希望在 service 單位中運(yùn)行的指令替代 command嘶是。將此指令放置于 systemd-run 句法的最末端。這樣蛛碌,此指令的參數(shù)就不會與 systemd-run 參數(shù)混淆聂喇。
除上述選項外,systemd-run 也有一些其它可用參數(shù)蔚携。例如希太,--description 可以創(chuàng)建對單位的描述;service 進(jìn)程結(jié)束后酝蜒,--remain-after-exit 可以收集運(yùn)行時信息誊辉;--machine 選項可以在密閉容器中執(zhí)行指令。更多信息亡脑,請參閱 systemd-run(1) manual page堕澄。
栗子:
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#systemd-run --unit=toptest --slice=test top -b
Running as unit toptest.service.
現(xiàn)在,toptest.service 名稱可以與 systemctl 指令結(jié)合霉咨,以監(jiān)控或修改 cgroup蛙紫。
slice輸出
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#systemctl -t slice
UNIT LOAD ACTIVE SUB DESCRIPTION
-.slice loaded active active Root Slice
machine.slice loaded active active Virtual Machine and Container Slice
system-getty.slice loaded active active system-getty.slice
system-systemd\x2dfsck.slice loaded active active system-systemd\x2dfsck.slice
system.slice loaded active active System Slice
test.slice loaded active active test.slice
user-0.slice loaded active active user-0.slice
user-122575.slice loaded active active user-122575.slice
user.slice loaded active active User and Session Slice
service輸出
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#systemctl -t service | grep test
toptest.service loaded active running /usr/bin/top -b
配合systemctl
[root@jiangyi01.sqa.zmf /home/ahao.mah]
#systemctl status toptest.service
● toptest.service - /usr/bin/top -b
Loaded: loaded (/run/systemd/system/toptest.service; static; vendor preset: disabled)
Drop-In: /run/systemd/system/toptest.service.d
└─50-Description.conf, 50-ExecStart.conf, 50-Slice.conf
Active: active (running) since Mon 2016-08-15 13:17:30 CST; 5min ago
Main PID: 94889 (top)
CGroup: /test.slice/toptest.service
└─94889 /usr/bin/top -b
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 120293 root 20 0 0 0 0 S 0.0 0.0 0:00.17 kworker/1+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 120935 root 20 0 0 0 0 S 0.0 0.0 0:22.16 kworker/6+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 122864 root 20 0 0 0 0 S 0.0 0.0 0:04.90 kworker/9+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 124341 root 0 -20 0 0 0 S 0.0 0.0 8:56.26 kworker/9+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 125657 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 126324 root 20 0 0 0 0 S 0.0 0.0 0:02.37 kworker/1+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 127006 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 128144 root 0 -20 0 0 0 S 0.0 0.0 8:55.18 kworker/1+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 129070 root 0 -20 0 0 0 S 0.0 0.0 0:00.30 kworker/2+
Aug 15 13:23:08 jiangyi01.sqa.zmf top[94889]: 130319 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1+
7u上創(chuàng)建永久 cgroup
上面,我們已經(jīng)創(chuàng)建了一個臨時cgroup途戒,如果想讓它永久坑傅,下次開機(jī)還存在,我們只需要使用: systemctl enable 指令棺滞,動運(yùn)行此指令會在 /usr/lib/systemd/system/ 目錄中創(chuàng)建單位文件裁蚁。如要對 cgroup 做出永久改變,請?zhí)砑踊蛐薷钠鋯挝晃募械呐渲脜?shù)
7u上刪除cgroup
兩種方式:
終止一個unit:
systemctl stop name.service
終止多個unit继准,pid用逗號分隔:
systemctl kill name.service --kill-who=PID,... --signal=signal
永久刪除一個cgroup:systemctl disable name.service
7u上修改crgroup:
兩種方式
- 命令行:臨時修改cgroup:systemctl set-property
~]# systemctl set-property httpd.service CPUShares=600 MemoryLimit=500M
- 修改文件:所有被 systemd 監(jiān)管的永久單位都在 /usr/lib/systemd/system/ 目錄中有一個單位配置文件枉证。如要修改 service 單位的參數(shù),請修改此配置文件移必。
6u上使用cgroup
蝦面這個系列文章簡單的實例寫的不錯
cgroup中幾個問題解答
- 6u的cgroup和7u的cgroup有哪些區(qū)別室谚?
- 7u的cgroup中的slice,scope崔泵,service的概念區(qū)別是什么秒赤?
- 如何在6u上管理cgroup?libcgroup
- 如何在7u上管理cgroup憎瘸?systemd-run
- 在7u上從臨時創(chuàng)建cgroup到永久創(chuàng)建cgroup需要做什么入篮?
- cgroup中cpu管理中的CPUShares,cpu.cfs_period_us 和 cpu.cfs_quota_us 你需要清楚
在 cpu 子系統(tǒng)中幌甘,cpu.stat 就是用前面那種方法做的資源限制的統(tǒng)計了潮售。nr_periods痊项、nr_throttled 就是總共經(jīng)過的周期,和其中受限制的周期酥诽。throttled_time 就是總共被控制組掐掉的 cpu 使用時間鞍泉。
還有個 cpu.shares, 它也是用來限制 cpu 使用的肮帐。但是與 cpu.cfs_quota_us咖驮、cpu.cfs_period_us 有挺大區(qū)別。cpu.shares 不是限制進(jìn)程能使用的絕對的 cpu 時間训枢,而是控制各個組之間的配額托修。比如
/cpu/cpu.shares : 1024
/cpu/foo/cpu.shares : 2048
- cgroup中mem管理中的limit_in_bytes參數(shù)你需要清楚
# echo 10485760 >/sys/fs/cgroup/memory/foo/memory.limit_in_bytes
即可限制該組中的進(jìn)程使用的物理內(nèi)存總量不超過 10MB。對 memory.memsw.limit_in_bytes 來說恒界,則是限制虛擬內(nèi)存使用诀黍。memory.memsw.limit_in_bytes 必須大于或等于 memory.limit_in_byte。這些值還可以用更方便的 100M仗处,20G 這樣的形式來設(shè)置眯勾。要解除限制,就把這個值設(shè)為 -1 即可婆誓。
- cgroup中cpuacct管理中cpuacct.stat統(tǒng)計使用量吃环,你需要知道
cpuacct 子系統(tǒng)專門用來做 cpu 資源統(tǒng)計。cpuacct.stat 統(tǒng)計了該控制組中進(jìn)程用戶態(tài)和內(nèi)核態(tài)的 cpu 使用量洋幻,單位是 USER_HZ郁轻,也就是 jiffies、cpu 滴答數(shù)文留。每秒的滴答數(shù)可以用 getconf CLK_TCK 來獲取好唯,通常是 100。將看到的值除以這個值就可以換算成秒燥翅。
cpuacct.usage 和 cpuacct.usage_percpu 是該控制組中進(jìn)程消耗的 cpu 時間骑篙,單位是納秒。后者是分 cpu 統(tǒng)計的森书。
- cpu靶端,mem,等等的管理凛膏,你需要對
/sys/fs/cgroup/memory/
有大致的了解