在bash中,有個ulimit命令夕吻,提供了對shell及該shell啟動的進程的可用資源控制诲锹。主要包括打開文檔描述符數量、用戶的最大進程數量涉馅、coredump文檔的大小等归园。
在centos 5/6 等版本中,資源限制的配置可以在 /etc/security/limits.conf 設置稚矿,針對root/user等各個用戶或者*代表所有用戶來設置庸诱。
當然捻浦,/etc/security/limits.d/ 中也可以配置,系統(tǒng)是先加載limits.conf然后按照英文字母順序加載limits.d目錄下的配置文檔桥爽,
后加載配置覆蓋之前的配置朱灿。
在centos7中/etc/security/limits.d/20-nproc.conf配置文件中默認設置了非root用戶的最大進程數為4096,會覆蓋/etc/security/limits.conf文件中的配置钠四。
一個配置示例如下:
* soft core 100000
* hard core 100000
* soft nofile 100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 100000
格式如下:
username|@groupname type resource limit
username|@groupname:設置需要被限制的用戶名盗扒,組名前面加@和用戶名區(qū)別。也可以用通配符*來做所有用戶的限制缀去。
type:有 soft侣灶,hard 和 -,soft 指的是當前系統(tǒng)生效的設置值缕碎。hard 表明系統(tǒng)中所能設定的最大值褥影。soft 的限制不能比har 限制高。用 - 就表明同時設置了 soft 和 hard 的值
resource:
core - 限制內核文件的大小
date - 最大數據大小
fsize - 最大文件大小
memlock - 最大鎖定內存地址空間
nofile - 打開文件的最大數目
rss - 最大持久設置大小
stack - 最大棧大小
cpu - 以分鐘為單位的最多 CPU 時間
noproc - 進程的最大數目
as - 地址空間限制
maxlogins - 此用戶允許登錄的最大數目
在CentOS 7 / RHEL 7的系統(tǒng)中咏雌,使用Systemd替代了之前的SysV
因此 /etc/security/limits.conf 文檔的配置作用域縮小了伪阶。limits.conf這里的配置,只適用于通過PAM認證登錄用戶的資源限制处嫌,
它對systemd的service的資源限制不生效
登錄用戶的限制栅贴,與上面講的一樣,通過 /etc/security/limits.conf 和 limits.d 來配置即可熏迹。
對于systemd service的資源限制檐薯,是受誰限制呢?
全局的配置:放在文檔 /etc/systemd/system.conf 和 /etc/systemd/user.conf注暗。
與此同時坛缕,也會加載下面兩個對應的目錄中的所有.conf文檔
/etc/systemd/system.conf.d/
/etc/systemd/user.conf.d/
system.conf 是系統(tǒng)實例使用的
user.conf用戶實例使用的
一般的sevice,使用system.conf中的配置即可捆昏,在[Service]模塊下添加如下內容赚楚。
systemd.conf.d/*.conf中配置會覆蓋system.conf的配置。
#生產環(huán)境一般處于禁用狀態(tài)
#DefaultLimitCORE=infinity
#核心轉儲文件大小不限制骗卜,它是進程運行時突然崩潰的那一刻的內存快照宠页。操作系統(tǒng)在程序發(fā)生異常而異常在進程內部又沒有被捕獲的情況下,會把進程此刻內存寇仓、寄存器狀態(tài)举户、運行堆棧等信息轉儲保存在一個文件里,可使用 gdb 工具來分析遍烦。core dump 生產環(huán)境一般處于禁用狀態(tài)俭嘁,對于內存消耗性的進程,core dump 時會占用很多系統(tǒng)資源服猪,磁盤空間也可能被寫滿。
DefaultLimitNOFILE=1048576
#服務進程可以打開文件的最大數目為1048576
DefaultLimitNPROC=65535
#進程可以打開的最大線程數目為65535
# cat /etc/systemd/system.conf | grep -v '^#' | grep -v '^$'
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65535
# cat /etc/systemd/user.conf | grep -v '^#' | grep -v '^$'
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65535
注:修改了system.conf后,需要重啟系統(tǒng)才會生效查吊。
測試中發(fā)現執(zhí)行以下命令也可以讓 systemd 加載最新配置,不過官方文檔說明該命令很少用慨丐,主要在 debugging 和 package upgrades 時使用。
systemctl daemon-reexec
之前啟動的service服務也不會自動加載新的限制參數 泄私,需要重啟對應的service服務才會變更限制房揭。
daemon-reload重新加載的是所有單元文件,而不是systemd本身的配置。
Reexecute the systemd manager. This will serialize the manager state, reexecute the process and deserialize the state again. This command is of little use except for debugging and package upgrades. Sometimes, it might be helpful as a heavy-weight daemon-reload. While the daemon is being reexecuted, all sockets systemd listening on behalf of user configuration will stay accessible.
除了 LimitCORE晌端,還可以在 service 文件中配置 LimitNOFILE捅暴、LimitSTACK、LimitNPROC 等資源限制咧纠,配置時請注意單位蓬痒,詳見:
https://www.freedesktop.org/software/systemd/man/systemd.exec.htmlsystemd.execsystemd.exec
針對單個Service,也可以設置漆羔,以nginx為例梧奢。
編輯 /usr/lib/systemd/system/nginx.service 文檔在[Service]模塊下添加如下內容:
[Service]
LimitCORE=infinity
LimitNOFILE=1048576
LimitNPROC=65535
然后運行如下命令,才能生效演痒。
systemctl daemon-reload
systemctl restart nginx.service
查看一個進程的limit設置:cat /proc/YOUR-PID/limits
例如我的一個nginx service的配置效果:
$ cat /proc/$(cat /usr/local/nginx/logs/nginx.pid)/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size unlimited unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 65535 65535 processes
Max open files 1048576 1048576 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 1030606 1030606 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
cat /proc/$(ps -ef | grep XXX.jar | grep -v grep | awk '{print $2}')/limits
cat /proc/$(ps -ef | grep jenkins.war | grep -v grep | awk '{print $2}')/limits
參考文獻 systemd service 如何開啟 core dump
https://zhuanlan.zhihu.com/p/41153588
https://www.wenjiangs.com/doc/systemd-systemd-system-conf#f0f093f535dca6ab3fc14deae410700b