文件描述符再述之 initscript 和 systemd
博客专区 > anglix 的博客 > 博客详情
文件描述符再述之 initscript 和 systemd
anglix 发表于2年前
文件描述符再述之 initscript 和 systemd
  • 发表于 2年前
  • 阅读 182
  • 收藏 3
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: “too many open files”,跟了我这么多年,辛苦了!

服务的 ulimit 设置无效

设定 文件描述符

  • /etc/security/limits.conf 内容:
* soft nproc 10000
* hard nproc 10000
* soft nofile 4194304
* hard nofile 4194304
  • /etc/sysctl.conf 片段:
fs.nr_open = 5242880
fs.file-max = 4194304
  • /etc/profile.d/ulimit.sh 内容:
#!/bin/bash
[ "$(id -u)" == "0" ] && ulimit -n 4194304
ulimit -u 80000
  • /etc/pam.d/login 下相关文件片段
session     required      pam_limits.so

service启动的服务,Runtime文件描述符仍是1024? :joy:

grep 'open files' /proc/$(pgrep cron)/limits
# Max open files            1024                 4096                 files 

SysV的系统设定(CentOS6/Debian7)

initscript

示例

# cat /etc/initscript 
ulimit -n 1048576
eval exec "$4"

Systemd系统的设定(CentOS7/Debian8)

systemd 应么写? :joy:

  • systemd怎么写

systemd 怎么用?

服务启停,与 service 的对应关系。以 cron 服务为例

systemctl start cron # service cron start
systemctl stop cron # service cron stop
systemctl restart cron # service cron restart
systemctl try-restart cron # service cron condrestart
systemctl reload cron # service cron reload
systemctl status cron # service cron status
systemctl is-active cron # service cron status
systemctl list-units --type service --all # service --status-all

开机启动,与 chkconfig 的对应关系。以 cron 服务为例:

systemctl enable cron # chkconfig cron on
systemctl disable cron # chkconfig cron off
systemctl status cron # chkconfig --list cron
systemctl is-enabled cron # chkconfig --list cron
systemctl list-unit-files --type service # chkconfig --list

修改 systemd 对应的配置

  • Debug 时你会发现,最终脚本执行过程被重定向到 systemd里了:
bash -x /etc/init.d/cron restart
+ . /lib/lsb/init-functions
+++ run-parts --lsbsysinit --list /lib/lsb/init-functions.d
++ . /lib/lsb/init-functions.d/20-left-info-blocks
++ . /lib/lsb/init-functions.d/40-systemd
++++ systemctl -p CanReload show cron.service
+++ systemctl_redirect /etc/init.d/cron restart
+++ log_daemon_msg 'Restarting cron (via systemctl)' cron.service
+++ /bin/systemctl restart cron.service
  • 修改 systemd 对应的配置文件 /etc/systemd/system.conf/etc/systemd/user.conf
sed -i 's/^#DefaultLimitNOFILE=$/DefaultLimitNOFILE=1048576/g' /etc/systemd/system.conf /etc/systemd/user.conf # 重启系统生效

调试 systemd

  1. 修改 /etc/default/grub 配置:
GRUB_CMDLINE_LINUX="systemd.log_target=kmsg systemd.log_level=debug"
# update-grub # 更新后重启系统
  1. 修改 /etc/systemd/system.conf 配置:
LogLevel=debug   
LogTarget=kmsg
  1. 重启后使用 dmesg 即可查看。
共有 人打赏支持
anglix
粉丝 31
博文 35
码字总数 17615
×
anglix
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: