如何修改ulimit参数pending signals

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修改ulimit参数pending signals相关的知识,希望对你有一定的参考价值。

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

可以用ulimit -a 来显示当前的各种用户进程限制。

下面我把某linux用户的最大进程数设为10000个:

ulimit -u 10240

对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,

最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。

ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024

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

数据段长度:ulimit -d unlimited

最大内存大小:ulimit -m unlimited

堆栈大小:ulimit -s unlimited

CPU 时间:ulimit -t unlimited

虚拟内存:ulimit -v unlimited

暂时地,适用于通过 ulimit 命令登录 shell 会话期间。

永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:

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

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

保存后运行#source /etc/profile 使其生效

/**************************************

有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。

修改2个文件。

1./etc/security/limits.conf

vi /etc/security/limits.conf

加上:

* soft nofile 8192

* hard nofile 20480

2./etc/pam.d/login

session required /lib/security/pam_limits.so

/**********

另外确保/etc/pam.d/system-auth文件有下面内容

session required /lib/security/$ISA/pam_limits.so

这一行确保系统会执行这个限制。

/***********

3.一般用户的.bash_profile

#ulimit -n 1024

重新登陆ok

ulimit 的作用

=======================

ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。

参数 描述

ulimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)

和可同时运行的最大进程数(max user processes)无效

-a 列出所有当前资源极限

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

-d 设置一个进程的数据段的最大值.单位:kbytes

-f Shell 创建文件的文件大小的最大值,单位:blocks

-h 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限

-l 可以锁住的物理内存的最大值

-m 可以使用的常驻内存的最大值,单位:kbytes

-n 每个进程可以同时打开的最大文件数

-p 设置管道的最大值,单位为block,1block=512bytes

-s 指定堆栈的最大值:单位:kbytes

-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者

-t 指定每个进程所使用的秒数,单位:seconds

-u 可以运行的最大并发进程数

-v Shell可使用的最大的虚拟内存,单位:kbytes

-x

范例1:

[root@localhost proc]# ulimit -a

core file size (blocks, -c) 100

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

pending signals (-i) 2047

max locked memory (kbytes, -l) 32

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 2047

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

[root@localhost proc]#

输出的每一行由资源名字、(单位,ulimit命令的参数)、软限制组成。详细解释:

参数 描述

core file size core文件的最大值为100 blocks,

data seg size 进程的数据段可以任意大

file size 文件可以任意大

pending signals 最多有2047个待处理的信号

max locked memory 一个任务锁住的物理内存的最大值为32kB

max memory size 一个任务的常驻物理内存的最大值

open files 一个任务最多可以同时打开1024的文件

pipe size 管道的最大空间为4096字节

POSIX message queues POSIX的消息队列的最大值为819200字节

stack size 进程的栈的最大值为8192字节

cpu time 进程使用的CPU时间

max user processes 当前用户同时打开的进程(包括线程)的最大个数为2047

virtual memory 没有限制进程的最大地址空间

file locks 所能锁住的文件的最大个数没有限制

范例2:通过ulimit命令来限制文件的大小,从而导致拷贝命令的失败

[root@localhost]ls temp.txt

ls: temp.txt: 没有那个文件或目录

[root@localhost]ulimit -f 1 #设置创建文件的最大块(一块=512字节)

[root@localhost]cat a.c > temp.txt

文件大小超出限制

文件a.c的大小是5002字节,而我们设定的创建文件的大小是512字节x1块=512字节

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

在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:

[speng@as4 ~]$ ulimit -n

1024

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

对於想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小於或等於硬限制。

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

[speng@as4 ~]$ 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系统级的最大打开文件数限制,使用如下命令:

[speng@as4 ~]$ cat /proc/sys/fs/file-max

12158

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

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

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

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

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

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

在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发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 assignrequested address"。有关这些控制逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:

static int tcp_v4_hash_connect(struct sock *sk)

请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range的初始化则是在tcp.c文件中的如下函数中设置:

void __init tcp_init(void)

内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。

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

net.ipv4.ip_local_port_range = 1024 65000

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

第二步,执行sysctl命令:

[speng@as4 ~]$ sysctl -p

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

第二种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在connect()调用中阻塞,如同死机,如果用tcpdump工具监视网络,也会发现根本没有TCP连接时客户端发SYN包的网络流量。由於IP_TABLE防火墙在内核中会对每个TCP连接的状态进行跟踪,跟踪信息将会放在位於内核内存中的conntrackdatabase中,这个数据库的大小有限,当系统中存在过多的TCP连接时,数据库容量不足,IP_TABLE无法为新的TCP连接建立跟踪信息,於是表现为在connect()调用中阻塞。此时就必须修改内核对最大跟踪的TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的:

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

net.ipv4.ip_conntrack_max = 10240

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

第二步,执行sysctl命令:

[speng@as4 ~]$ sysctl -p

如果系统没有错误提示,就表明系统对新的最大跟踪的TCP连接数限制修改成功。如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立10000多个TCP客户端连接。

参考技术A vim /etc/security/limits.conf
root hard sigpending 65535
root soft sigpending 65535
root这里是账户,你用什么账号跑程序就写什么账号
ubuntu要建/etc/security/limits.d/90-nproc.conf 文件,然后填写下面的内容

Mac OSX下修改 ulimit 参数

OSX下Leopard, Yosemite版本的操作系统下, 修改 ulimit 命令默认的程序是 launchd.
默认的ulimit命令继承自launchd, 默认的limits参数如下:

daviddeMacBook-Pro:etc david$ sudo launchctl limit
Password:
  cpu         unlimited      unlimited      
  filesize    unlimited      unlimited      
  data        unlimited      unlimited      
  stack       8388608        67104768       
  core        0              unlimited      
  rss         unlimited      unlimited      
  memlock     unlimited      unlimited      
  maxproc     709            1064           
  maxfiles    256            unlimited



如果因为如socket连接数过小等原因, 需要修改ulimit相关参数, 可以按照如下方式操作:
1.在 /etc/launchd.conf(如无, 需用拥有root权限的账户创建) 文件中, 增加这一行:

echo "limit maxfiles 65535 unlimited" | sudo tee -a /etc/launchd.conf
tee命令是等待用户输入, 并将输入写入到指定文件中, -a参数表示添加方式为"追加".


2.在本次会话中, lanuchd 命令已经启动了; 如果想让配置在任何用户任何会话中都生效, 最简单的方式就只需要重启一下server.
如果还需要修改其他参数, 只需要使用 >> 命令追加到 /etc/launchd.conf文件中即可.
注:

1.上面

65535 unlimited

这2个参数即是设置soft和hard值.

2.Linux发行版redhat/centos配置与osx不同,如下:

vi /etc/security/limits.conf
# noproc进程数,nofile文件打开数
# soft软限制, 在程序的进程中可自行改变.
# hard硬限制, 程序不可随意改变,除非有root权限.
* soft noproc 11000
* hard noproc 11000
* soft nofile 4100
* hard nofile 4100

超过系统最大文件打开数之后,系统报 too many open files

1.查看限制:

ulimit -a

2.创建新的配置文件,配置系统打开最多文件限制(如果没有的话)

sudo vi /Library/LaunchDaemons/limit.maxfiles.plist
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>655360</string>
          <string>655360</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

3.创建每个最大进程数限制的配置文件

sudo vi /Library/LaunchDaemons/limit.maxproc.plist
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>


4.以上两个文件 需要owned by root:wheel

chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
读写权限:-rw-r--r--

执行 ulimit -a
下面的参数应该是MacOS的默认参数

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size               (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time                (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited


5.执行launchctl limit是配置生效。也许需要重启电脑(本人系统需要, OS X 10.10.3)

ulimit -a
修改后的参数如下

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 655360
pipe size               (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2048
virtual memory          (kbytes, -v) unlimited

6.打开端口后限制
查看socket端口范围限制
sysctl -a | grep port

kern.ds_supgroups_supported: 1

kern.ipc_portbt: 0

kern.hv_support: 1

vfs.generic.nfs.client.callback_port: 0

vfs.generic.nfs.server.require_resv_port: 0

vfs.generic.nfs.server.export_hash_size: 64

net.inet.ip.portrange.lowfirst: 1023

net.inet.ip.portrange.lowlast: 600

net.inet.ip.portrange.first: 1024

net.inet.ip.portrange.last: 65535

net.inet.ip.portrange.hifirst: 49152

net.inet.ip.portrange.hilast: 65535

net.inet.tcp.randomize_ports: 0

net.inet.udp.randomize_ports: 1

net.inet.ipsec.esp_port: 4500

machdep.misc.fast_uexc_support: 1

   
系统默认端口打开范围大小只有大概1500个,
修改办法:
打开(没有就创建)文件 /etc/sysctl.conf

sudo vi  /etc/sysctl.conf

添加以下两行:

net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535


第一行指定最小端口,低于1024的端口,系统预留,部分已经默认分配给常见应用了。一般需要root才能分配这低于1024的端口范围,不建议使用,除非你知道你在做什么。
第二行最大只能到达65535=2^16 -1。因为ipv4端口只占16bits,因此最大只能到达65535。

因此一个客户端,配置一个ipv4地址,能够创建的最大连接数为65535-1024=64511。

如何使用mac os 创建连接测试服务器,考虑带其他应用程序占用的端口,一般配置最大创建64000个连接,基本到达系统最大限制了。
————————————————
版权声明:本文为CSDN博主「明明很忙」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mingtingjian/article/details/77675761

以上是关于如何修改ulimit参数pending signals的主要内容,如果未能解决你的问题,请参考以下文章

修改ulimit参数

mac OSX 下修改 ulimit 参数

Mac OSX下修改 ulimit 参数

Linux 修改 内核参数sysctl.conf及ulimits.conf参数快速生效

Linux 修改 内核参数sysctl.conf及ulimits.conf参数快速生效

Centos 不重启 修改ulimit参数