2018-05-16 15:59:06 coolpale 阅读数 503
  • 轻松掌握Linux操作系统技术视频课程(肖哥)

    适用于Linux的新使用者,帮助初学者了解并掌握Linux基本知识,该课程包括系统安装、基本指令使用、文件系统结构及权限设置、Bash、 shell scripts、vim编辑器使用、系统配置、进程管理、文件的查找、压缩及处理、Linux下文件系统深入讲解、网络客户端使用等。

    6308 人正在学习 去看看 肖宗鹏

Linux打开文件限制

1、修改用户进程可打开文件数限制

在linux平台上,无论是客户端程序还是服务器端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。

可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:

~]# ulimit -n
1024

这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听socket,进程间通信的unix与socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右,也就是说缺省情况下,基于linux的通信程序最多允许同时1014个tcp并发连接。

修改上述限制的最简单的办法就是使用ulimit命令:

~]# ulimit -n <file-num>

上述命令中,在<file-num>中指定要设置的单一进程允许打开的最大文件数,如果系统回复类似“operation notpermitted"之类的话,说明上述限制修改失败,实际上是因为在<file-num>中指定的数值超过了linux系统对该用户打开文件数的软限制或硬限制,因此,就需要修改linux系统对用户关于打开文件数的软限制和硬限制。

第一步,修改/etc/security/limits.conf文件,在文件中添加如下:

speng soft nofile 10240
speng hard nofile 10240

其中speng指定了要修改哪个用户的打开文件数限制,可用'*'号表示修改所有用户的限制,soft或hard指定要修改软限制还是硬限制,10240则指定了想要修改的新的限制值,即最大打开文件数(软限制应该要小于硬限制,软限制即表示阀值,超过会产生告警),修改完后保存文件。

第二步,修改/etc/pam.d/login文件,在文件中添加如下行:

session required /lib/security/pam_limits.so

这是告诉linux在用户完成系统登陆后,应该调用pam__limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值,修改后保存到此文件。

第三步,查看linux系统级的最大打开文件数限制,使用如下命令:

~]# cat /proc/sys/fs/file-max
184289
~]# cat /proc/sys/fs/file-nr
1024    0   184289     
已分配文件句柄的数目    分配了但没有使用的句柄数   文件句柄最大数目

这表明这台linux系统最多允许同时打开(即包含所有用户打开文件数总和)184289个文件,是linux系统硬件级限制,所有用户级的打开文件数限制都不应超过这个数值,通常这个系统级硬限制是linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值,修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:

echo 284289 > /proc/sys/fs/file-max

这是让linux在启动完成后强行将系统级打开文件数硬限制设置为284289,修改完后保存此文件。

完成上述步骤重启系统,一般情况下就可以将linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值,如果重启后用ulimit -n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登陆脚本/etc/profile中使用ulimit -n命令将用户可同时打开的文件数做了限制,由于通过ulimit -n修改系统对用户可同时打开文件的最大限制时,新修改的值只能小于或等于上次ulimit -n设置的值,因此想用此命令增大这个限制值,是不可能的,所以,如果上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找使用使用ulimit -n限制了用户可同时打开的最大文件数量,删除此命令,或将其修改成合适的值,保存文件,用户退出并重新登陆系统即可。

通过上述步骤,就为了支持高并发TCP连接处理的通信处理程序解除关于打开文件数量方面的系统限制。

2、修改网络内核对TCP连接的有关限制

在linux上,有时会发现尽管已经解除雷人系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,在也无法成功建立新的TCP连接的现象,出现这种情况的原因有很多。

第一种原因可能是因为linux网络内核对本地端口号范围有限制,此时进一步分析为什么无法建立TCP连接,会发现问题出在connect()调用返回失败,查看系统错误提示"can't assign requestedaddress",同时如果在此时用tcpdump工具监视网络,会发现根本没有tcp连接时客户端发syn包的网络流量,这些情况说明问题在于本地linux系统内核中有限制,其实问题的根本原因在于linux内核的TCP/IP协议实现模块对系统中所有客户端TCP连接对应的本地端口号的范围进行了限制,(内核限制本地端口号范围1024~32768之间),当系统中某一时刻存在太多的tcp客户端连接时,由于每个tcp客户端连接都要占用一个唯一的本地端口,(此端口号在系统的本地端口范围限制中),如果现有的tcp客户端连接已将所有的本地端口占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并将错误信息提示"can't assign requestedaddress",有关这些控制逻辑可以查看linux内核源代码,以2.6版本为例,可以查看tcp_ipv4.c文件中如下函数:

static int tcp_v4_hash_connect(struct sock *sk)

=====

内核在编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口号范围限制
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:

net.ipv4.ip_local_port_range = 1024 65000

这表明将系统对本地端口范围限制为1024~65000之间,请注意,本地端口号范围的最小值必须大于等于1024,而端口号范围的最大值则应小于等于65535,修改完成后保存此文件。

第二步,执行sysctl命令:

~]# sysctl -p

如果系统没有错误提示,就表面新的本地端口范围设置成功,则理论上单独一个进程最多可以同事建立60000多个TCP客户端连接。

第二种无法建立TCP连接的原因可能是因为linux网络内额的iptable(netfilter)防火墙对最大跟踪的TCP连接数有限制,此时程序表现为connect()调用中阻塞,如同死机,由于iptable防火墙在内核中会对每个TCP连接的状态进行跟踪,跟踪信息将会放在位于内核内存中的conntrackdatabase中,这个数据库大小有限制,当系统中存在过多的TCP连接时,数据库容量不足,iptable无法为新的TCP连接建立跟踪信息,于是表现为connect()调用中阻塞,此时就必须修改内核对最大跟踪TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的,

第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:

net.ipv4.ip_conntrack_max = 10240

这表明将系统对最大跟踪的TCP连接数限制设置为10240,请注意此值要尽量小,节省对内核内存的占用

第二步,执行sysctl命令:

~]# sysctl -p     

sysctl -p 报错net.ipv4.ip_conntrack_max" is an unknown key 则:modprobe ip_conntrack



作者:词穷又词贫
链接:https://www.jianshu.com/p/ad2754432a4b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2018-04-25 17:21:43 wangyijie521 阅读数 158
  • 轻松掌握Linux操作系统技术视频课程(肖哥)

    适用于Linux的新使用者,帮助初学者了解并掌握Linux基本知识,该课程包括系统安装、基本指令使用、文件系统结构及权限设置、Bash、 shell scripts、vim编辑器使用、系统配置、进程管理、文件的查找、压缩及处理、Linux下文件系统深入讲解、网络客户端使用等。

    6308 人正在学习 去看看 肖宗鹏

常见问题-linux打开文件数
    linux默认的打开文件数限制是1024, 会造成服务器用户连接数量很低
   
    安装部署服务器时需要设置该值
 
    运行命令 ulimit -n 65535 即可立即生效
    在/etc/profile文件中加入这一条命令,使启动后能自动生效

2019-05-13 10:34:15 Camille66 阅读数 468
  • 轻松掌握Linux操作系统技术视频课程(肖哥)

    适用于Linux的新使用者,帮助初学者了解并掌握Linux基本知识,该课程包括系统安装、基本指令使用、文件系统结构及权限设置、Bash、 shell scripts、vim编辑器使用、系统配置、进程管理、文件的查找、压缩及处理、Linux下文件系统深入讲解、网络客户端使用等。

    6308 人正在学习 去看看 肖宗鹏

优化Linux文件打开最大数(软限制,硬限制,文件描述符,描述符表)

为了防止失控的进程破坏系统的性能,UNIX和Linux会跟踪进程使用的大部分资源,并允许用户和系统管理员使用对进程的资源限制,例如控制某个进程打开的系统文件数、对某个用户打开系统进程数进行限制等,一般限制手段包括软限制和硬限制。具体说明如下:
软限制(soft limit):内核实际执行的限制,任何进程都可以将软限制设置为任意小于或等于对进程限制的硬限制的值、最大线程数(noproc)和文件数(nofile)。
硬限制(hard limit):可以在任何时候任何进程中设置,但硬限制只能由超级用户修改。

Linux系统一切皆文件,对Linux进行各种操作,实际就是对文件进行操作,文件可分为普通文件目录文件链接文件设备文件。而**文件描述符(file descriptor)**是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。

Linux系统默认已经打开的文件描述符包括STDIN_FILENO 0表示标准输入、STDOUT_FILENO 1表示标准输出、STDERR_FILENO 2表示标准错误输出,默认打开一个新文件,它的文件描述符为3。
每个文件描述符与一个打开文件相对应,不同的文件描述符可以指向同一个文件。相同的文件可以被不同的进程打开,也可以在同一个进程中被多次打开。

Linux系统为每个进程维护了一个文件描述符表,该表的值都是从0开始的,在不同的进程中用户会看到相同的文件描述符,相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。

Linux内核对文件操作,维护了3个数据结构概念。
进程级的文件描述符表
系统级的打开文件描述符表
文件系统的i-node表

其中进程级的描述符表的每一个条目记录了单个文件描述符的相关信息,例如控制文件描述符操作的一组标志及对打开文件句柄的引用。Linux内核对所有打开的文件都维护了一个系统级的描述符表(open file description table)。

将描述符表中的记录行称为打开文件句柄(open file handle),一个打开文件句柄存储了与一个打开文件相关的全部信息,详细信息如下:
当前文件偏移量
打开文件时所使用的状态标识
文件访问模式
与信号驱动相关的设置
对该文件i-node对象的引用
文件类型和访问权限
指针指向该文件所持有的锁列表
文件的各种属性

默认Linux内核对每个用户设置了打开文件最大数为1024,对于高并发网站,是远远不够的,需要将默认值调整到更大,调整方法如下:
•Linux每个用户打开文件最大数临时设置方法,重启服务器该参数无效,命令行终端执行如下命令:
ulimit -n 65535
Linux每个用户打开文件最大数永久设置方法,将如下代码加入内核限制文件/etc/ security/limits.conf的末尾:

  • soft noproc 65535
  • hard noproc 65535
  • soft nofile 65535
  • hard nofile 65535
    上述设置为对每个用户分别设置nofile、noproc最大数,如果需要对Linux整个系统设置文件最大数限制,需要修改/proc/sys/fs/file-max中的值,该值为Linux总文件打开数,例如设置为echo 3865161233>/proc/sys/fs/file-max。
2010-09-16 14:36:00 liu414226580 阅读数 1271
  • 轻松掌握Linux操作系统技术视频课程(肖哥)

    适用于Linux的新使用者,帮助初学者了解并掌握Linux基本知识,该课程包括系统安装、基本指令使用、文件系统结构及权限设置、Bash、 shell scripts、vim编辑器使用、系统配置、进程管理、文件的查找、压缩及处理、Linux下文件系统深入讲解、网络客户端使用等。

    6308 人正在学习 去看看 肖宗鹏

回答一、 [root@lxadmin nginx]# cat /proc/sys/fs/file-max 8192 文件系统最大可打开文件数 [root@lxadmin nginx]# ulimit -n 1024 程序限制只能打开1024个文件 使用[root@lxadmin nginx]# ulimit -n 8192调整一下 或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效) ulimit -n 8192 回答二、 Linux内核有时会报告“Too many open files”,起因是file-max默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/*下的init脚本。) # echo "65536" > /proc/sys/fs/file-max # 适用于2.2和2.4版内核 # echo "131072" > /proc/sys/fs/inode-max # 仅适用于2.2版内核 回答三、 办法是修改操作系统的打开文件数量限制,方法如下: 1. 按照最大打开文件数量的需求设置系统, 并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。 # cat /proc/sys/fs/file-max 如果设置值太小, 修改文件/etc/sysctl.conf的变量到合适的值。 这样会在每次重启之后生效。 如果设置值够大,跳过下步。 # echo 2048 > /proc/sys/fs/file-max 编辑文件/etc/sysctl.conf,插入下行。 fs.file-max = 8192 2. 在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示: # 添加如下这行。 * - nofile 8192 这行设置了每个用户的默认打开文件数为2048。 注意"nofile"项有两个可能的限制措施。就是项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用"-"字符设定, 则hard和soft设定会同时被设定。 硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。 当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。 另外一种情况是在创建索引的时候,也有两种可能,一种是 合并因子太小,导致创建文件数量超过操作系统限制,这时可以修改合并因子,也可以修改操作系统的打开文件数限制;另外一种是合并因子受虚拟机内存的限制,无法调整到更大,而 需要索引的doc 数量又非常的大,这个时候就只能通过修改操作系统的打开文件数限制来解决了。 在此基础上,我还修改了以下一个配置文件 vi /etc/sysctl.conf 添加: # Decrease the time default value for tcp_fin_timeout connection net.ipv4.tcp_fin_timeout = 30 # Decrease the time default value for tcp_keepalive_time connection net.ipv4.tcp_keepalive_time = 1800 # Turn off tcp_window_scaling net.ipv4.tcp_window_scaling = 0 # Turn off the tcp_sack net.ipv4.tcp_sack = 0 #Turn off tcp_timestamps net.ipv4.tcp_timestamps = 0 然后 service network restart,这些都和TCP sockets有关的优化。 另外需要在 /etc/rc.d/rc.local里添加已使得重启的时候生效。 echo "30">/proc/sys/net/ipv4/tcp_fin_timeout echo "1800">/proc/sys/net/ipv4/tcp_keepalive_time echo "0">/proc/sys/net/ipv4/tcp_window_scaling echo "0">/proc/sys/net/ipv4/tcp_sack echo "0">/proc/sys/net/ipv4/tcp_timestamps 因为不是所有的程序都在root下跑的,所有linux有对hard 与soft open files 的区分,普通用户受hard的限制,无论ulimit -n $数值调到多高,都跑不到 /etc/security/limits.conf里nofile的值. 这样的优化后 lsof -p $java_pid|wc -l可以跑到4千以上都不会抛出too many open files

2014-07-01 20:48:49 shunqs 阅读数 224
  • 轻松掌握Linux操作系统技术视频课程(肖哥)

    适用于Linux的新使用者,帮助初学者了解并掌握Linux基本知识,该课程包括系统安装、基本指令使用、文件系统结构及权限设置、Bash、 shell scripts、vim编辑器使用、系统配置、进程管理、文件的查找、压缩及处理、Linux下文件系统深入讲解、网络客户端使用等。

    6308 人正在学习 去看看 肖宗鹏

ulimit用于shell启动进程所占用的资源

1、类别:

shell内建命令

2、语法格式:

ulimit [-acdfHlmnpsStvw] [size]

3、参数介绍:

-H 设置硬件资源限制.

-S 设置软件资源限制.

-a 显示当前所有的资源限制.

-c size:设置core文件的最大值.单位:blocks

-d size:设置数据段的最大值.单位:kbytes

-f size:设置创建文件的最大值.单位:blocks

-l size:设置在内存中锁定进程的最大值.单位:kbytes

-m size:设置可以使用的常驻内存的最大值.单位:kbytes

-n size:设置内核可以同时打开的文件描述符的最大值.单位:n

-p size:设置管道缓冲区的最大值.单位:kbytes

-s size:设置堆栈的最大值.单位:kbytes

-t size:设置CPU使用时间的最大上限.单位:seconds

-v size:设置虚拟内存的最大值.单位:kbytes

-u number:设置用户最大进程数 (max user processes)

4、Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:

ulimit -u 10000

5、对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。将每个进程可以打开的文件数目加大到4096,缺省为1024。

ulimit -n 4096 

6、其他建议设置成无限制(unlimited)的一些重要设置是:

数据段长度:ulimit -d unlimited

最大内存大小:ulimit -m unlimited

堆栈大小:ulimit -s unlimited

CPU 时间:ulimit -t unlimited

虚拟内存:ulimit -v unlimited

7、解除 Linux 系统的最大进程数和最大文件打开数限制:

    

1)vi /etc/security/limits.conf,添加如下的行

*   soft noproc   11000
*   hard noproc   11000
*   soft nofile   4100
*   hard nofile   4100

 说明:* 代表针对所有用户

noproc 是代表最大进程数

nofile 是代表最大文件打开数

 

2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:

a、vi /etc/ssh/sshd_config

把 UserLogin 的值改为 yes,并把 # 注释去掉

b、重启 sshd 服务:  

 /etc/init.d/sshd restart

 

 

3)、修改所有 linux 用户的环境变量文件:

vi /etc/profile

ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited

 

        4)、生效         

source   /etc/profile

 

 

没有更多推荐了,返回首页