linux资源限制
资源限制修改参考
cat /etc/security/limits.conf * soft core unlimited # 核心转储是程序崩溃时记录内存状态的文件。设置为 unlimited 意味着核心转储文件大小不受限制。 * hard core unlimited * soft nofile 65535 # nofile 限制的是用户或进程能够同时打开的最大文件数(文件描述符)。如果进程尝试打开超过这个数量的文件,将会失败。软限制可以用户自己调整,但不能超过硬限制。 * hard nofile 65535 * soft nproc 10240 # nproc 限制用户能够同时运行的进程数。超过这个限制后,用户将无法创建更多的进程。 * hard nproc 10240 * hard memlock 32000 # kB, memlock 限制的是用户可以锁定在物理内存中的内存量,以防止其被交换到磁盘。通常用于需要高性能的程序。 * soft memlock 32000 * hard msgqueue 8192000 #bytes, msgqueue 限制消息队列的最大容量,消息队列是进程间通信(IPC)的一种方式。这些限制控制单个用户能够使用的消息队列容量。 * soft msgqueue 8192000 # @用户组 #@student hard nofile 65535 #student组中的任何人最多能打开文件描述符数量是65535,并且会在打开65000个时发出警告 #@student soft nofile 65000 #@student hard nproc 50 #student组中的任何人不能拥有超过50个进程,并且会在拥有30个进程时发出警告 #@student soft nproc 30 # 单用户 #student hard nofile 65535 #student用户最多能打开文件描述符数量是65535,并且会在打开65000个时发出警告 #student soft nofile 65000
在Ubuntu下 不能用* ,代表所有用户,只能写具体用户,centos可以用*
硬限制与软限制区别
root@rt:~# ulimit -Hn 1048576 root@rt:~# ulimit -Sn 1024
这两个限制都代表什么,为什么不一样?
ulimit -Hn
和 ulimit -Sn
代表的是 Linux 系统中针对文件描述符(file descriptors)设置的不同限制:
ulimit -Hn
:表示 硬限制(Hard Limit),它是系统允许设置的文件描述符数量的上限。普通用户不能超过这个上限,只有超级用户(如root
)可以提高硬限制。ulimit -Sn
:表示 软限制(Soft Limit),这是当前用户可以使用的最大文件描述符数量。普通用户可以在软限制的范围内调整文件描述符的数量,但不能超过硬限制。
为什么两个值不一样?
-
硬限制(Hard Limit):
ulimit -Hn
返回1048576
,表示硬限制设置为 1,048,576,也就是系统最大允许的文件描述符数量。这是该系统允许用户设置的文件描述符的最高上限。- 超级用户可以使用
ulimit -Hn
来修改这个值,但普通用户不能提高超过硬限制。硬限制的存在是为了防止用户错误或恶意使用太多系统资源。
-
软限制(Soft Limit):
ulimit -Sn
返回1024
,表示当前会话中文件描述符的软限制为 1024。软限制是用户在日常操作中实际可以打开的文件描述符数量上限。- 用户可以通过
ulimit -Sn
临时提高软限制,但不能超过硬限制。
为什么不一样?
- 安全性与资源管理:系统管理员通常会设定较低的软限制(如
1024
),以限制普通用户在常规操作中打开过多的文件描述符。这有助于避免资源耗尽的风险,比如同时打开太多文件、网络连接等。 - 灵活性:硬限制较大(如
1048576
)提供了灵活性,让管理员或特定用户在必要时能提高软限制,处理资源密集型的任务。但默认软限制较低,确保系统日常情况下不会因为过多的文件描述符而崩溃。
调整软限制和硬限制
-
调整软限制(不能超过硬限制):
ulimit -Sn 4096
-
调整硬限制(需要管理员权限):
ulimit -Hn 2097152
总结
- 硬限制:是系统允许的最大文件描述符数上限,只有管理员可以提高。
- 软限制:是用户当前能够使用的文件描述符上限,用户可以在不超过硬限制的情况下调整。
- 两者不一样是为了提供灵活性,既能防止资源滥用,又能让特定任务在需要时突破日常的限制。
所以得出结论:如果nginx配置最大连接数设置为65535,那么必须设置软限制为65535,可理解为硬限制是管理员为普通用户设置的限制,而软限制是普通应用用户的资源限制。
实践操作
验证了软限制不能超过硬限制,这个只是临时性设置,重启失效。
root@rt:~# ulimit -Hn 1048576 root@rt:~# ulimit -Sn 1024 root@rt:~# ulimit -Sn 2000000 -bash: ulimit: open files: cannot modify limit: Invalid argument root@rt:~# ulimit -Sn 1048577 -bash: ulimit: open files: cannot modify limit: Invalid argument root@rt:~# ulimit -Sn 1048576 root@rt:~# ulimit -Sn 1048576
###################################################################################
实践
针对单用户设置资源限制
修改配置
* soft nofile 65535 * hard nofile 65535 prometheus hard nofile 8192 prometheus soft nofile 8192
注释: 修改/etc/security/limits.conf配置文件不需要重启系统, 只需要重新登录用户;如果是应用程序,则需要重启。
如果系统限制之前是4096,修改了系统限制后,还需要重启应用,重新加载系统的资源限制。
启动
[prometheus@kafka-1 node_export]$ whoami prometheus [prometheus@kafka-1 node_export]$ ll total 20052 drwxr-xr-x 3 prometheus prometheus 91 Sep 10 14:29 1.6.1 -rw-r--r-- 1 prometheus prometheus 11357 Jul 14 19:57 LICENSE -rwxr-xr-x 1 prometheus prometheus 20500541 Jul 14 19:54 node_exporter -rw-r--r-- 1 prometheus prometheus 5875 Oct 11 10:35 nohup.out -rw-r--r-- 1 prometheus prometheus 463 Jul 14 19:57 NOTICE -rwxr-xr-x 1 prometheus prometheus 98 Oct 9 09:19 start.sh
验证
因为是prometheus用户启动的node_port程序,所以此程序资源限制受限于启动用户。
针对应用设置资源限制
修改配置
After=network-online.target [Service] Type=simple Restart=on-failure ExecStart=/opt/prometheus/prometheus-2.45.6/prometheus \ --config.file=/opt/prometheus/prometheus-2.45.6/prometheus.yml \ --storage.tsdb.path=/opt/prometheus/prometheus-2.45.6/data \ --storage.tsdb.retention.time=15d \ --web.enable-lifecycle LimitNOFILE=10240 [Install] WantedBy=multi-user.target
验证
越学越感到自己的无知