Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)

目录

  • 1 问题说明
  • 2 修改max open files
  • 3 修改max user processes
  • 4 附录: ulimit命令说明

1 问题说明

Linux 系统默认的max open files = 1024, 在大内存服务器中, 如果运行负载比较大的程序, 很容易发生error: too many open files, 特别是提供大量静态文件访问的Web服务器、缓存服务器中这种错误更加常见.

open files表示系统级别的能够打开的文件句柄的数量, 是系统级别的安全策略: 限制所有应用打开的文件数量.

发生error: too many open files时, 如果不好定位程序问题, 可在系统的配置文件中做一定的修改.

为了让服务器重启之后, 配置仍然有效, 需要用永久生效的配置方法进行修改.

2 修改max open files

说明: 这里以Cent OS 6.5为例.

使用ulimit -a命令可以查看当前系统的所有限制值, 括号中的命令是查看单项限制值的方式, 比如要查看系统可打开的最大文件数量(open files), 就可以用ulimit -n命令: (具体命令说明请参考末尾部分的附录)

[root@localhost ~]# 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)  1031426
max locked memory        (kbytes, -l)  64
max memory size          (kbytes, -m)  unlimited  # 最大内存大小
open files                       (-n)  65536      # 最大打开文件数
pipe size             (512 bytes, -p)  8
POSIX message queues      (bytes, -q)  819200
real-time priority               (-r)  0
stack size               (kbytes, -s)  10240      # 栈大小
cpu time                (seconds, -t)  unlimited  # CPU时间
max user processes               (-u)  131072
virtual memory           (kbytes, -v)  unlimited  # 虚拟内存大小
file locks                       (-x)  unlimited

(1) 短期修改, 重启服务器后即失效:

# 把文件句柄数改为65535
ulimit -n 65535
# 也可用下属方式修改:
ulimit -SHn 65535
# 其中-S是soft软限制模式, -H指hard硬限制模式;
# 默认是软限制, 如果只指定-n, 那就会同时配置-SH.

(2) 永久修改, 重启服务器也不变:

网络上常见的方式有如下三种:

① 在/etc/security/limits.conf最后增加如下两行记录:

# nofile - 可以打开的最大文件数, *通配符表示对所有用户有效
*   soft      nofile     65536
*   hard      nofile     65536

修改完成后保存, 退出当前用户并重新登录(不用重启服务器), 当前修改就会生效.

② 在/etc/profile中增加一行ulimit -SHn 65535, 然后运行source /etc/profile命令让修改立即生效.

—— /etc/profile文件是所有系统用户的配置文件, 修改后会影响当前系统的所有注册用户.

③ 在/etc/rc.local文件中增加一行ulimit -SHn 65535, 修改完后, 重启服务器就可生效.

值得注意的是, 博主在CentOS 6.5系统中测试, 发现只有第 ① 和第 ② 种方式才有效.

另外, 在《阿里巴巴Java开发手册》中, 关于最大文件句柄数有这样的描述:

【推荐】调大服务器所支持的最大文件句柄数(File Descriptor,简写为fd)。

说明:主流操作系统的设计是将 TCP/UDP 连接采用与文件一样的方式去管理,即一个连接对应于一个 fd。主流的 Linux 服务器默认所支持最大 fd 数量为 1024,当并发连接数很大时很容易因为 fd 不足而出现“open too many files”错误,导致新的连接无法建立。 建议将 Linux 服务器所支持的最大句柄数调高数倍(与服务器的内存数量相关)。

3 修改max user processes

(1) 问题描述: 在使用Java程序多线程大批量生成模拟数据时, Cent OS报出如下错误:

ulimit: max user processes: cannot modify limit

错误说明: Linux系统为每个用户都设置了一个最大进程数, 这个特性可以让我们控制服务器上现有用户可以创建的进程数量.

(2) 查看max user processes:

# 与查看max open files类似, 可使用 ulimit -u查看max user processes:
ulimit -u

(3) 修改max user processes:

① 方案一: 修改/etc/security/limits.conf文件, 在文件最后添加下述内容:

*  soft      nproc      131072
*  hard      nproc      131072

② 方案二: 修改/etc/security/limits.d/90-nproc.conf文件, 在文件最后添加下述内容:

# 用户进程数的默认限制, 下面这个是对root外的其他用户限制max user processes, 要注释掉:
# *          soft    nproc     1024
root       soft    nproc     131072

(4) 关于nproc配置信息的扩展说明:

max user processes的配置, Linux系统默认先读取/etc/security/limits.conf 中的信息, 如果/etc/security/limits.d/目录下还有配置文件的话, 也会依次遍历读取, 最终, /etc/security/limits.d/中的配置会覆盖/etc/security/limits.conf 中的配置.

另外, max open filesmax user processes是不能配置unlimited的 —— 极不安全的设置, 此时系统会使用默认的配置值. 对nproc而言, 默认值的计算方法为:

# 计算公式为:
default_nproc = max_threads / 2;
# 其中, max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
# mempages是机器的物理页面个数, THREAD_SIZE=8K, 所以, 计算公式为:
default_nproc = max_threads / 2
              = (mempages * PAGE_SIZE) / ( 2 * 8 *THREAD_SIZE )
              = total_memory / 128K;

# 计算本机默认nproc配置:
cat /proc/meminfo | grep MemTotal
MemTotal:       115571480 kB

echo "115571480 / 128" | bc
902902

ulimit -u
902682
# 算出来default_nproc = 902902, 和实际的902682很接近,
# 因为物理页面会存储一些关键数据, 所以实际的比计算出来的要小一些. 

4 附录: ulimit命令说明

(1) 列出所有当前资源极限, 命令为: ulimit -a, 其他命令可参考输出信息中括号内的提示:

# ulimit -a 命令的输出信息:
core file size           (blocks, -c) 0
data seg size            (kbytes, -d) unlimited  # 一个进程的数据段的最大值
scheduling priority              (-e) 0
file size                (blocks, -f) unlimited  # Shell创建文件的最大体积, 1block = 512bytes
pending signals                  (-i) 1031426    # 最多允许多少个待处理的信号
max locked memory        (kbytes, -l) 64         # 每个进程可以锁住的物理内存的最大值
max memory size          (kbytes, -m) unlimited  # 每个进程可以使用的常驻内存的最大值
open files                       (-n) 65536      # 每个进程可以同时打开的最大文件数, 不能是unlimited
pipe size             (512 bytes, -p) 8          # 管道的最大值, 1block = 512bytes
POSIX message queues      (bytes, -q) 819200     # POSIX的消息队列的最大值
real-time priority               (-r) 0
stack size               (kbytes, -s) 10240      # 单个进程能够使用的最大栈大小
cpu time                (seconds, -t) unlimited  # 单个进程的最大CPU时间, 也就是可使用CPU的秒数, 到硬极限时, 这个进程就会立即自杀; 到软极限时, 每秒发送一次限制超时信号SIGXCPU
max user processes               (-u) 131072     # 单个用户可同时运行的最大进程数, 不能是unlimited
virtual memory           (kbytes, -v) unlimited  # 每个进程可使用的最大虚拟内存
file locks                       (-x) unlimited  # 每个进程能锁住的最大文件个数

(2) ulimit的其他命令:

-H  设置某个给定资源的硬极限. 如果用户拥有root权限, 可以增大硬极限. 任何用户均可减少硬极限
-S  设置某个给定资源的软极限, 软极限可增大到硬极限的值

(3) 注意事项:

① 其中, unlimited是指不限制用户可以使用的资源, 但这个设置对系统可打开的最大文件数(max open files)和各个用户可同时运行的最大进程数(max user processes)无效.

② 如果某个指标没有明确指定-H和-S限制, 那么当前的极限值就是 -H 和 -S 两者的极限值.

参考资料

ulimit限制之nproc问题

linux修改max user processes limits

版权声明

作者: ma_shoufeng(马瘦风)

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

原文地址:https://www.cnblogs.com/shoufeng/p/10620480.html

时间: 2024-10-12 03:16:58

Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)的相关文章

linux 修改系统时间

刚才发现linux的系统时间和真实时间相差太多,,就想起把系统时间给修改了,先想起来的是: 1.date -s "20151223 15:30:00" 但是执行完这一句之后在查看时间是正确的,而使用hwclock这个命令查看的话还是原来的时间,所以这个修改不彻底,不是系统硬件时间,后来又使用另一种方法: 2.date -s "20151223 15:33:00" &&hwclock --systohc 这在查看时间就完全对的上了!

linux修改系统时区

这是我在集群web系统中遇到的问题(4台web服务器的时间不同而导致,分发不均造成系统老断开),这里我也制作内网的ntpdate时间同步服务器,同步时老差8个小时. 这是由于安装系统时采用了UTC,那么什么是UTC呢,简单的说UTC就是0时区的时间,是国际标准,而中国处于UTC+8时区. 另外还有一种时间是当地时间,而windows采用的就是当地时间.所以安装linux系统时,不要选择使用UTC. 修改系统时间. linux系统时钟有两个,一个是硬件时钟,即BIOS时间,就是我们进行CMOS设置

linux修改系统时间和时区

1.修改系统时间linux系统时钟有两个,一个是硬件时钟,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时钟,是linux系统Kernel时间.当Linux启动时,系统Kernel会去读取硬件时钟的设置,然后系统时钟就会独立于硬件运作.有时我们会发现系统时钟和硬件时钟不一致,因此需要执行时间同步,下面就分享一下时间设置及时钟同步的命令使用方法.date命令将日期设置为2014年6月18日 ---- date -s 06/18/14将时间设置为14点20分50秒 ---- da

linux 修改系统字符集,查看字符

修改系统字符集 # cd /etc/sysconfig # vi i18n -------------------文件内容------------------ LANG="zh_CN.GB18030"SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en:zh_CN.GB18030"SYSFONT="latarcyrheb-sun16" -----------------------:qw 保存退

linux修改系统时间和linux查看时区、修改时区的方法

一.查看和修改Linux的时区 1. 查看当前时区命令 : "date -R" 2. 修改设置Linux服务器时区方法 A命令 : "tzselect" 方法 B 仅限于RedHat Linux 和 CentOS命令 : "timeconfig" 方法 C 适用于Debian命令 : "dpkg-reconfigure tzdata" 3. 复制相应的时区文件,替换系统时区文件:或者创建链接文件cp /usr/share/zo

嵌入式Linux 修改系统时间

基于Linux的嵌入式开发,需要用到本地的时间,但是网上找了很多修改时间的命令,但大多是Linux系统的,在嵌入式的Linux上不能识别,设置时间的话,要写入底层的计时器,重启时才不会失效. 查看本地时间 date 查看定时器时间 hwclock 先修改时间 date -s "2016-11-24  11:22:00" 再写入定时器 hwclock -w

linux修改系统时间

[[email protected] ~]# date 2017年 02月 13日 星期一 22:14:49 CST [[email protected] ~]#  date -s 02/16/17 2017年 02月 16日 星期四 00:00:00 CST [[email protected] ~]#  date -s 13:27:40 2017年 02月 16日 星期四 13:27:40 CST 硬件时钟与系统时钟同步: # hwclock --hctosys 或者 # clock --h

[Linux] 修改系统默认编码

locale 命令 locale 命令用以设置程序运行的语言环境. locale 设置语言环境的命名规则为 Language_area.charset,例如 en_US.utf8 表示语言为英语,地区为美国,字符集为 UTF-8. 查看当前字符映射文件 $ locale charmapUTF-8 查看可用公共语言环境 $ locale -a C C.UTF-8 en_AG ... 查看可用字符映射文件 $ locale -a C C.UTF-8 en_AG ... 设置默认编码 编辑 ~/.ba

Linux永久修改系统时间和时区方法

修改时区: 1> 找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai 用这个文件替换当前的/etc/localtime文件. 或者找你认为是标准时间的服务器,然后 #scp [email protected]:/etc/localtime /etc/localtime 2> 修改/etc/sysconfig/clock文件,修改为: ZONE="Asia/Shanghai" UTC=false ARC=false 临时方法: TZ='As