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

简介: Linux - 修改系统的max open files、max user processes(附ulimit的使用方法)目录1 问题说明2 修改max open files3 修改max user processes4 附录: ulimit命令说明1 问题说明Linux 系统默认的max ope...

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 files和max 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(马瘦风)

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

相关文章
|
7天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
120 78
|
10天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
44 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
6天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
56 13
|
1月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
32 3
|
7天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
25 0
|
1月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
36 1
|
18天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
存储 Linux 调度
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
【看表情包学Linux】系统下的文件操作 | 文件系统接口 | 系统调用与封装 | open,write,close 接口 | 系统传递标记位 O_RDWR,O_RDONLY,O_WRONLY...
124 1
|
Linux
走马观花: Linux 系统调用 open 七日游(二)
    接着昨日的旅程,我们应该开始处理具体的子路径了: 【fs/namei.c】sys_open->do_sys_open->do_filp_open->path_openat->link_path_walk 点击(此处)折叠或打开   .
1182 0
|
Linux
走马观花: Linux 系统调用 open 七日游(三)
    接着上回,当对“.”和“..”处理完成后就直接返回进入下一个子路径循环了,但如果当前子路径不是“.”或“..”呢?【fs/namei.c】sys_open > do_sys_open > do_filp_open > path_openat > link_path_walk ...
1259 0