Linux允许打开最大文件句柄数的参数调优-"too many open files"问题

都知道Linux系统的特性,一切皆文件,所有在运行zabbix这样的服务时,其中重要的一个调优就是调整linux系统的最大文件句柄数,解决“too many open files”的问题,增大程序运行允许打开的文件数,提高性能。

一.查看系统运行打开的文件句柄数

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7179
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7179
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

在默认情况下,open files参数为1024,就是linux允许打开的最大文件数。当运行的服务需要大并发进程运行时,这显然是不够的,就会报出“too many open files”。在使用zabbix的过程中,当增大开起的进程数后会出现无法启动的情况,产看日志会有类似的报错,此时就需要修改最大文件句柄数。

二.修改最大文件句柄数-临时修改

# ulimit -n 2048
# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7179
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7179
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以看到open files参数调整到了2048,这种修改方式只对当前进程有效。若重新打开一个终端或是重启进程,这个参数都不会生效,所以不建议这样使用。

三.修改最大文件句柄数-内核参数修改

在设置前,我们一定要考虑到系统的限制,如果你修改的参数超过了系统默认值的限制,会带来另一个悲剧的,此坑踩过。

(1)系统默认的最大值

file-max是内核可分配的最大文件数

# cat /proc/sys/fs/file-max
181044

nr_open是单个进程可分配的最大文件数

# cat /proc/sys/fs/nr_open
1048576

一般系统默认内核可分配的最大文件数是内存的10%左右,可以调整到50%左右。

# grep MemTotal /proc/meminfo |awk ‘{printf("%d",$2/10)}‘
186726

(2)调整最大值

修改两个内核文件中允许的最大值,需要注意的是nr_open中的参数要小于file-max中的参数。
系统允许的最大值调整为内存的50%。

# grep MemTotal /proc/meminfo |awk ‘{printf("%d",$2/2)}‘
933632
# echo 933632 > /proc/sys/fs/file-max 

单个进程可分配的最大值适当增大。

# echo 233632 > /proc/sys/fs/nr_open

(3)修改系统内核参数

# vim /etc/security/limits.conf
*   soft     nofile      65535
*   hard     nofile      65535
# vim /etc/security/limits.d/20-nproc.conf
*   soft     nproc       65535
*   hard    nproc       65535

这里的“*”号表示对所有用户生效,可以设置指定的用户,修改后保存退出,带看一个新的终端就可生效了。

(4)总结

a.所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max
b.单个进程打开的文件描述符数不能超过user limit中nofile的soft limit
c.nofile的soft limit不能超过其hard limit
d. nofile的hard limit不能超过/proc/sys/fs/nr_open

(5)特别提醒

有一种意外情况,如果没有注意修改系统默认允许的最大值,在limits.conf中设置的参数大于系统默认值,推出终端后,你会发现ssh无法链接的悲剧,此时如果你还有未关闭的终端链接,那恭喜你还有拯救的余地,修改sshd的配置文件。

# vim /etc/ssh/sshd_config
UsePAM yes 将这里的yes改为no

重启sshd服务
#systemctl restart sshd.service
此时可以链接终端了,调整系统内核允许的最大值,再改回sshd的配置。

四.关于打开文件的查看命令

(1)查看所有进程的文件打开数

# lsof |wc -l

(2)查看整个系统目前使用的文件句柄数

# cat /proc/sys/fs/file-nr

(3)查看某个进程开的进程

#lsof -p pid

(4)查看某个进程的的文件句柄数

#lsof -p pid|wc -l

(5)查看某个目录,文件被什么进程占用

#lsof path(file)

原文地址:http://blog.51cto.com/12824426/2060594

时间: 2024-08-29 20:49:21

Linux允许打开最大文件句柄数的参数调优-"too many open files"问题的相关文章

Linux内核、 TCP/IP、Socket参数调优

/proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这些重要的参数: 参数(路径+文件) 描述 默认值 优化值 /proc/sys/net/core/rmem_default 默认的TCP数据接收窗口大小(字节). 229376 256960 /proc/sys/net/core/rmem_max 最大的TCP数据接收窗口(字节). 131071 51

【转】Linux下查看进程打开的文件句柄数

---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 131 24204 57 24244 57 24231  ........ 其中第一列是打开的句柄数,第二列是进程ID. 可以根据ID号来查看进程名. # ps aef|grep 24204 nginx 24204 24162 99 16:15 ? 00:24:2

查看linux下进程打开的文件句柄数并清理

---查看系统默认的最大文件句柄数,系统默认是1024# ulimit -n1024 ----查看当前进程打开了多少句柄数# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more131 24204 57 24244 57 24231 ........ 其中第一列是打开的句柄数,第二列是进程ID.可以根据ID号来查看进程名.# ps aef|grep 24204nginx 24204 24162 99 16:15 ? 00:24:25 /usr/l

民间最全的Linux系统内核参数调优说明

  相信做运维的同仁,进行运维环境初建时,必须要考虑到操作系统内核参数的优化问题,本人经历数次的运维环境重建后,决定要自行收集一份比较完善的系统内核参数优化说明文件出来,于是就有了下文,本文当前值是官方默认参数,建议参数直接添加于sysctl -a输出的结果每一行的后面,希望对运维的同仁做系统内核参数调优时有所帮助.废话不多讲,直接上干货! #3.10.0-862.el7.x86_64#CentOS Linux release 7.5.1804 abi.vsyscall32 = 1crypto.

linux 服务器安全加固和内核参数调优 nf_conntrack

0.内部设置跳板机,服务器只能通过跳板机登录1.禁止ROOT用户远程登录和登录端口 禁止ROOT用户远程登录 .打开 /etc/ssh/sshd_config PermitRootLogin no 2.对用户密码强度的设定 12个字符以上,大小写,特殊字符 3.对重要的文件进行锁定,即使ROOT用户也无法删除 chattr    改变文件或目录的扩展属性 lsattr    查看文件目录的扩展属性 chattr  +i  /etc/passwd /etc/shadow             

(转)linux IO 内核参数调优 之 参数调节和场景分析

1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时候就会被pdflush刷新到磁盘: (1)数据存在的时间超过了dirty_expire_centisecs(默认30s)时间 (2)脏数据所占内存 /(MemFree + Cached - Mapped) > dirty_background_ratio.也就是说当脏数据所占用的内存占(MemFre

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系

Nginx基本参数调优

Nginx基本参数 #运行用户 user nobody; #worker进程的个数:通常应该为物理CPU核数减1: #可以为”auto”,实现自动设定(worker_processes  auto) worker_processes  1; #全局错误日志及PID文件 #error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log  info; #pid        logs/

php-fpm参数调优

关于php-fpm.conf参数调优,只对重要的参数进程调优.其它可参数前辈的. http://php.net/manual/zh/install.fpm.configuration.php (官方的) http://www.cnblogs.com/argb/p/3604340.html http://www.cnblogs.com/jonsea/p/5522018.html https://www.zybuluo.com/phper/note/89081 http://blog.64mazi.