[关闭]
@cdmonkey 2016-09-07T03:33:58.000000Z 字数 3985 阅读 935

ulimit

命令总结


http://ningg.top/linux-ulimit/
http://www.2cto.com/os/201209/158266.html
http://www.ibm.com/developerworks/cn/linux/l-cn-ulimit
http://blog.csdn.net/gatieme/article/details/51058797
http://qa.helplib.com/220596

一、简介

在部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有“Squid”做代理,当文件打开数到九百多时速就会非常快的下降,甚至有可能打不开网页。其实系统是有文件句柄限制的,而且这个默认数值不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量。

1. 使用指令

指令作用

用于限制由“shell”启动的进程所占用的资源。ulimit指令为内建指令,能够提供对可用资源的控制权,并对系统中的进程进行这样的资源使用控制。其对资源的限制分为两种:

注意:ulimit限制的是当前“shell”进程以及其派生的子进程。

若为临时的限制,该指令能够作用于通过使用其命令登录的会话,于会话终止时便结束限制,并不影响其他的会话。而对于长期的固定限制,ulimit命令语句又可被添加到由登录“shell”读取的文件中,从而作用于特定的用户。

指令格式

  1. ulimit [-SHacdefilmnpqrstuvx] [limit]

常用选项:

limit-1.png-14.7kB

  1. [root@Node-A2 ~]# ulimit
  2. unlimited

注意:该指令能够修改的是用户级别的最大文件描述符的限制值,而调整系统级别的限制,则不能使用该指令。

二、使用

1. 查看当前的限制值

查看当前终端的打开文件句柄数限制值:

  1. [root@Node-A2 ~]# ulimit -n
  2. 65530
  3. #其数值的默认一般都是1024,这是我们优化后的数值。

查看所有的限制值:

  1. [root@Node-A2 ~]# ulimit -a
  2. core file size (blocks, -c) 0
  3. data seg size (kbytes, -d) unlimited
  4. scheduling priority (-e) 0
  5. file size (blocks, -f) unlimited
  6. pending signals (-i) 3590
  7. max locked memory (kbytes, -l) 64
  8. max memory size (kbytes, -m) unlimited
  9. open files (-n) 65530 #操作系统对一个进程打开的文件句柄数量的限制。
  10. pipe size (512 bytes, -p) 8
  11. POSIX message queues (bytes, -q) 819200
  12. real-time priority (-r) 0
  13. stack size (kbytes, -s) 10240
  14. cpu time (seconds, -t) unlimited
  15. max user processes (-u) 3590
  16. virtual memory (kbytes, -v) unlimited
  17. file locks (-x) unlimited

上面的这些值可用ulimit命令来修改,但是该命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效。

系统总限制是在这里:

  1. [root@Node-A2 ~]# cat /proc/sys/fs/file-max
  2. 45001

查看整个系统目前使用的文件句柄数量:

  1. [root@Node-A2 ~]# cat /proc/sys/fs/file-nr
  2. 352 0 45001

查看文件句柄问题的时候,还有一个很实用的指令lsof。通过该指令可以很方便看到某个进程开了那些句柄,也可以看到某个文件或目录被什么进程占用了。其具体的使用方法见相关文档。

2. 临时生效

我们可以使用“ulimit”指令对资源的使用限制做出临时性的修改,系统重启或用户退出登录后就会失效。

  1. #对打开的文件描述符数进行临时的修改:
  2. [root@Node-A2 ~]# ulimit -n 55000
  3. [root@Node-A2 ~]# ulimit -n
  4. 55000

3. 永久生效

Method 1

我们可以将“ulimit”指令写入/etc/profile文件内,这样的对所有用户都会生效,通过实验已验证。

  1. #对打开的文件描述符数进行永久的修改:
  2. [root@Node-A2 ~]# echo "ulimit -n 55000" >>/etc/profile
  3. [root@Node-A2 ~]# source /etc/profile
  4. [root@Node-A2 ~]# ulimit -n
  5. 55000

完成上述操作后,当前的根用户立刻会生效,其他终端的用户需要退出并重新登录后生效。但是网上有的文章说这样做只会对根用户生效,但是通过实验发现,这样做对普通用户也是生效的。当然可能不同的发行版之间会有些许的差异,我们的实验场景是“CentOS 6.6”:

  1. [root@Node-A2 ~]# cat /etc/redhat-release
  2. CentOS release 6.6 (Final)

Method 2

若要对限制数值永久生效,最为“正统”的方法是需要修改limits.conf文件,该文件中的每一行表示一条限制。

  1. [root@Node-A2 ~]# cat /etc/security/limits.conf
  2. #下面所示是我当前系统的设置内容:
  3. * - nofile 65530

该文件的书写有其特定的格式(可以参照上面的那行条目):

  1. <domain> <type> <item> <value>
字段 说明
<domain> 作用域,可以是用户名或用户组,设为星号代表全局,另外你也可以针对不同的用户做出不同的限制。
<type> 类型,可以是软或者硬(soft、hard)限制。其中的硬限制为实际的限制,而软限制则是限制告知,只会做出告知(Warnning)。
<item> 这里我自己认为是具体的系统资源,也就是说要对哪方面的资源作出限制,具体请看下面的解释内容。
<value> 限制数值。
  1. #下面是配置文件中的解释内容:
  2. <domain> can be:
  3. - a user name
  4. - a group name, with @group syntax
  5. - the wildcard *, for default entry
  6. - the wildcard %, can be also used with %group syntax, for maxlogin limit.
  7. <type> can have the two values:
  8. - "soft" for enforcing the soft limits
  9. - "hard" for enforcing hard limits
  10. <item> can be one of the following:
  11. - core - limits the core file size (KB)
  12. - data - max data size (KB)
  13. - fsize - maximum filesize (KB)
  14. - memlock - max locked-in-memory address space (KB)
  15. - nofile - max number of open file descriptors #能够打开的最大文件描述符数。
  16. - rss - max resident set size (KB)
  17. - stack - max stack size (KB)
  18. - cpu - max CPU time (MIN)
  19. - nproc - max number of processes
  20. - as - address space limit (KB)
  21. - maxlogins - max number of logins for this user
  22. - maxsyslogins - max number of logins on the system
  23. - priority - the priority to run user process with
  24. - locks - max number of file locks the user can hold
  25. - sigpending - max number of pending signals
  26. - msgqueue - max memory used by POSIX message queues (bytes)
  27. - nice - max nice priority allowed to raise to values: [-20, 19]
  28. - rtprio - max realtime priority

那么修改完该文件后如何使限制生效呢?答案就是重新登录即可。

4. 工作原理

limits.conf的后端是这样工作的:limits.conf是pam_limits.so的配置文件,然后/etc/pam.d/下的应用程序调用pam_*.so模块。譬如说,当用户访问服务器,服务程序将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的PAM模块进行处理。

三、调整系统级别限制

1. 临时生效

  1. [root@localhost ~]# sysctl -wfs.file-max=400000
  2. fs.file-max = 400000
  3. # OR:
  4. [root@localhost ~]# echo 350000 > /proc/sys/fs/file-max
  5. [root@localhost ~]# cat /proc/sys/fs/file-max
  6. 350000

2. 永久生效

  1. [root@Node-A2 ~]# echo "fs.file-max=400000" >> /etc/sysctl.conf
  2. [root@Node-A2 ~]# sysctl -p
  3. [root@Node-A2 ~]# cat /proc/sys/fs/file-max
  4. 400000

Other Limit

  1. [root@test-wxgw ~]# cat /proc/sys/kernel/threads-max
  2. 14778
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注