稍微有點 Linux 經驗的人一定會遇到過 “Too many open files” 錯誤,這個錯誤本質是 ulimit 設置不合理導致的。關於 ulimit 設置,有哪些需要註意的點呢?本文給大家做一個介紹,希望對大家有所幫助。 如何確認 ulimit 設置生效了? 很多人設置了 ulimit ...
稍微有點 Linux 經驗的人一定會遇到過 “Too many open files” 錯誤,這個錯誤本質是 ulimit 設置不合理導致的。關於 ulimit 設置,有哪些需要註意的點呢?本文給大家做一個介紹,希望對大家有所幫助。
如何確認 ulimit 設置生效了?
很多人設置了 ulimit 最後發現還是報錯 “Too many open files”。先不論如何操作,我們先要知道怎麼確認進程的 ulimit 到底是多少。這不是通過 ulimit -n
來看的,而是找到進程的 pid,然後查看 /proc/<進程的PID>/limits
文件,這個文件裡面記錄了進程的真實 ulimit 信息。比如:
如何設置 ulimit?
如果 ssh 到機器上,通過 nohup 之類的方式啟動進程,ulimit 將受限於 /etc/security/limits.conf
文件的配置。比如我這個機器:
[root@aliyun-2c2g40g3m ~]# cat /etc/security/limits.conf | grep -v '^#' | grep -v '^$'
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
這是 aliyun 的一臺虛機,看起來阿裡雲已經幫我們設置了 ulimit 為 65535,這個是 OK 的,挺大的了。但是,如果你是通過 systemd 啟動的服務,ulimit 將受限於 systemd 的配置。比如某個服務的 service 文件設置為:
[Unit]
Description="Categraf"
After=network.target
[Service]
Type=simple
ExecStart=/opt/categraf/categraf
WorkingDirectory=/opt/categraf
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65535
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=categraf
[Install]
WantedBy=multi-user.target
看到 LimitNOFILE 那行配置了麽?就是它。
如果 service 文件中沒有配置 LimitNOFILE,systemd 會有個預設配置,systemd 的預設配置可以通過如下方式查看:
[root@aliyun-2c2g40g3m systemd]# pwd
/etc/systemd
[root@aliyun-2c2g40g3m systemd]# grep FILE *.conf
system.conf:#DefaultLimitNOFILE=
user.conf:#DefaultLimitNOFILE=
咱也不用關心預設配置是多少,反正每個 service 都配置一下 LimitNOFILE 就好了。
其他進程管理工具對 ulimit 也有影響
如果你不是通過 systemd 托管進程的,而是使用了其他的進程管理工具,比如 supervisor,那麼 ulimit 將受限於 supervisor 的配置。如果你是通過 Saltstack 之類的工具,批量通過 shell 啟動進程,還要小心 salt minion 的 ulimit 設置,至於 supervisor 和 salt minion 如何調整 ulimit,這裡就不展開了,說多了都是淚。
句柄限制不止是 ulimit
實際上,操作系統對句柄的限制不止是 ulimit,還有 /proc/sys/fs/file-max
這個參數,這個參數限制了整個系統的句柄數量。如果你的系統句柄數量設置過小,那麼即使你設置了 ulimit,也會受限於這個參數。比如我的系統如下:
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
188844
如何調整這個參數呢?操作命令如下:
[root@aliyun-2c2g40g3m systemd]# echo 100000 > /proc/sys/fs/file-max
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
100000
[root@aliyun-2c2g40g3m systemd]# echo 188844 > /proc/sys/fs/file-max
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-max
188844
如果想要機器重啟也能生效,就要修改 sysctl.conf 文件,比如:
fs.file-max = 188844
如何監控句柄相關問題?
系統層面總共分配了多少句柄可以通過 /proc/sys/fs/file-nr
文件查看,比如:
[root@aliyun-2c2g40g3m systemd]# cat /proc/sys/fs/file-nr
1760 0 188844
第一個數字是已經分配的句柄數量,第三個數字是系統總共可分配的句柄數量。如果第一個數字接近第三個數字,那麼就要小心了。
夜鶯的內置告警規則中,有針對 categraf 的機器指標的告警規則,其中就有文件句柄使用率的告警:
linux_sysctl_fs_file_nr / linux_sysctl_fs_file_max > 0.9
另外,如果你使用了 categraf 的 procstat 進程監控插件,並且打開了 gather_more_metrics 中的 limit,還會採集到 procstat_rlimit_num_fds_soft 指標,夜鶯的內置規則中還有這麼一條告警規則:
procstat_rlimit_num_fds_soft < 2048
這是採集進程的軟句柄限制,如果軟句柄限制過小,就告警。通常,小於 2048,大概率就是運維人員忘記做操作系統的參數調優了。
附
如上知識,希望對你有幫助。文末請允許我插播一個小廣告。本人創業兩年了,我們公司的業務如下,如果你有這方面的需求,歡迎聯繫我們做產品技術交流哈。