RedHat、centos 7.0以上设置系统打开文件数等设置问题

elasticsearch-6.4.3 在RedHat7.4上启动,报如下的

./elasticsearch -d

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

报这个,照网上说法,修改这个文件:/etc/security/limits.conf
修改成如下的:

#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4
*               soft    nofile          655360
*               hard    nofile          655360
# End of file

然后回到elk用户下,执行 ulimit -n没有生效,还是1024

 ulimit -n
1024

退出,重新登录,还是不得,上网查。知道这个文件limits.conf是用PAM来加载的,怀疑没有重新加载,在网上再找到:

systemctl和systemd
CentOS上的systemctl(CentOS-7.X之前为service脚本)类似于Windows平台的服务管理器,替代老版本中的service脚本来管理服务。Systemctl功能非常多,有关systemctl的功能不在本文过多描述。
sytemctl的工作原理是通过与服务systemd交互,来完成各项工作,比如重启crond进程。在CentOS,systemctl替代了inittab。
可以看到正是systemd加载了pam,从ldd结果可以看出systemd也不是动态加载pam模块,而是编译时就绑定了,因此libpam.so成了系统的必须部分(但pam_limits.so仍然不是,总是可插拔):
9. 总结
修改limits.conf不会立即生效,除非重启相关的父进程,比如crontab的crond,而有些老版本的Linux可能只能重启以生效。

  1. 系统启动 -> 启动初始化进程systemd -> 进程sytemd加载libpam.so模块
  2. libpam.so根据/etc/pam.d决定是否加载pam_limits.so等
  3. 在加载pam_limits.so时,会读取/etc/security/limits.conf
  4. 重启crond等,实际是向systemd发重启指令
  5. 一句话:如果要使用limits.conf生效,一定要有加载pam_limits.so,如果修改limits.conf,至少要让pam_limits.so重读limits.conf。

然后重新加载crond:

systemctl restart crond

还是没生效,那看看我登录的sshd是否有用PAM

[root@cmod etc]# ldd /sbin/sshd
        linux-vdso.so.1 =>  (0x00007fff145f6000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f9e08118000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f9e07f14000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f9e07d10000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f9e07afa000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f9e078c3000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f9e076a8000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f9e072e5000)
        /lib64/ld-linux-x86-64.so.2 (0x000055ab29dbb000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f9e070e2000)

没有启用pam,而/etc/security/limits.conf里的配置只针对PAM认证登录用户有效,我记当初安装SSH时,没有选择PAM,那只能找其它方法:

在网上看到:

CentOS 6 迁移到 CentOS 7 的过程中,可能有一些地方需要调整,最显著的地方莫过于 systemd 带来的改变,不同的管理服务的方式,不同的日志方式,设置时区,时间等等。 当然,除了这些显而易见的改变之外,有些变化并不是那么引人注目,例如这里要介绍的你可能发现曾经配置了正确的 /etc/security/limits.conf 在 CentOS 7 中却没有生效了。
在CentOS 7/RHEL 7的系统中,/etc/security/limits.conf 文件的配置作用域缩小了一些。limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。限制使用PAM登录用户的,与上面讲的一样,通过 /etc/security/limits.conf 和 limits.d 来配置即可。
对于其余的systemd service的资源限制,如何配置呢?
全局的配置,放在文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf。同时,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/.conf 和 /etc/systemd/user.conf.d/.conf
其中,system.conf 是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。

修改/etc/systemd/user.conf

DefaultLimitCORE=infinity
DefaultLimitNOFILE=655360
DefaultLimitNPROC=655360

然后运行如下命令,才能生效。

systemctl daemon-reload

有时光这样不管用,还需要设置/etc/systemd/system.conf,同时还需要重启.

奇迹发生了:

-bash-4.2$ ulimit -n
655360

记录一下,防止下次再碰到

你可能感兴趣的:(linux)