0

0

如何在Linux中配置进程限制 Linux ulimit临时与永久

P粉602998670

P粉602998670

发布时间:2025-08-24 09:33:01

|

1110人浏览过

|

来源于php中文网

原创

答案:Linux进程限制通过ulimit临时设置,永久配置需修改/etc/security/limits.conf并确保PAM加载。ulimit常用选项包括-n(文件描述符)、-u(进程数)、-f(文件大小)、-v(虚拟内存)等,分别控制资源使用上限。软限制可由用户调整,硬限制仅root可修改。永久生效需用户重新登录或服务重启,并确认PAM模块pam_limits.so已启用。常用于防止单一进程耗尽资源,提升系统稳定性与安全性。配置不当可能导致服务报错或资源浪费,systemd服务还需检查LimitNOFILE等参数是否冲突。

如何在linux中配置进程限制 linux ulimit临时与永久

在Linux系统中配置进程限制,主要通过

ulimit
命令实现临时设置,而永久性配置则通常涉及编辑
/etc/security/limits.conf
文件,并确保PAM模块正确加载。这能有效管理系统资源,防止单个用户或进程耗尽资源,影响系统稳定性。

解决方案

配置进程限制,最直接的方式是使用

ulimit
命令。这个命令允许你查看或修改当前shell会话及其子进程的资源限制。

要查看当前所有限制,直接输入:

ulimit -a

如果你想临时修改某个限制,比如允许当前会话打开更多文件(例如,设置为65535),你可以这样做:

ulimit -n 65535

这个修改只对当前shell会话及其衍生的子进程有效。一旦会话结束,这些限制就会恢复到系统默认或永久配置的值。这在调试特定应用或执行需要大量文件句柄的操作时非常有用,但对于系统级的持久化配置,它显得力不从心。

ulimit
命令的常见选项及其意义是什么?

在使用

ulimit
时,你会发现它提供了很多选项来控制不同类型的资源。理解这些选项对于精细化管理系统至关重要。我个人觉得,最常用且最容易引起问题的就是文件句柄数和进程数。

  • -n
    (open files):
    这个选项控制一个进程可以同时打开的最大文件描述符数量。当你的应用程序报错“Too many open files”时,这通常是第一个需要检查和调整的地方。比如,一个高并发的服务端应用,如果连接数很多,每个连接可能都需要一个文件描述符,这个限制就显得尤为关键。
  • -u
    (processes):
    限制一个用户可以创建的最大进程数。这对于多用户系统尤其重要,可以防止某个用户通过创建大量僵尸进程或fork炸弹耗尽系统资源。
  • -f
    (file size):
    限制一个进程可以创建的文件的最大大小(以KB为单位)。这可以防止日志文件无限制增长,或者某个程序意外地生成巨大的文件。
  • -v
    (virtual memory):
    限制一个进程可以使用的最大虚拟内存量(以KB为单位)。这有助于防止内存泄漏的程序耗尽系统资源。
  • -l
    (locked memory):
    限制一个进程可以锁定在RAM中的最大内存量(以KB为单位)。这对于实时应用程序或数据库系统可能很重要,它们需要确保某些数据始终在物理内存中,避免交换。
  • -s
    (stack size):
    限制进程的堆栈大小(以KB为单位)。递归调用过深或局部变量过多可能导致堆栈溢出
  • -c
    (core file size):
    限制当程序崩溃时生成的core dump文件的最大大小(以KB为单位)。这在调试时很有用,但过大的core文件会占用大量磁盘空间。

每个选项都可以设置“软限制”(soft limit)和“硬限制”(hard limit)。软限制是实际生效的限制,但用户可以在硬限制范围内自行提高。硬限制则是一个不可逾越的上限,只有root用户才能提高。你可以使用

-s
查看或设置软限制,
-H
查看或设置硬限制。通常,我们看到的
ulimit -a
显示的是软限制。

如何设置永久性的进程限制?

临时修改毕竟不方便,尤其对于需要长期运行的服务或整个系统而言。永久性地设置进程限制,主要通过修改

/etc/security/limits.conf
文件来实现。这个文件由PAM(Pluggable Authentication Modules)模块
pam_limits.so
在用户登录时读取并应用。

limits.conf
的配置格式通常是这样的:

MaxAI
MaxAI

MaxAI.me是一款功能强大的浏览器AI插件,集成了多种AI模型。

下载
            
  • :
    可以是用户名、组名(前面加
    @
    ,如
    @users
    )、
    *
    (所有用户)、或
    %
    (所有组,在某些PAM版本中可能支持)。
  • :
    soft
    (软限制)或
    hard
    (硬限制)。
  • :
    对应
    ulimit
    命令的选项,比如
    nofile
    (对应
    -n
    )、
    nproc
    (对应
    -u
    )、
    as
    (对应
    -v
    ,虚拟内存,通常用
    as
    表示地址空间)、
    core
    (对应
    -c
    )。
  • :
    具体的限制数值。

举个例子,如果你想让所有用户的文件描述符硬限制提高到65535,并且软限制也设为这个值:

*    soft    nofile    65535
*    hard    nofile    65535

或者,如果你想针对某个特定用户(比如

myuser
)提高其进程数限制:

myuser    soft    nproc    4096
myuser    hard    nproc    4096

修改完

limits.conf
后,非常重要的一点是,你需要让这些更改生效。这通常意味着:

  1. 用户需要重新登录:对于普通用户而言,登出再登入是使配置生效的常见方式。
  2. 服务需要重启:如果你的限制是针对某个特定服务(例如Nginx、MySQL),并且这个服务是以独立用户运行的,那么你需要重启该服务,以便它在新的限制下启动。这是因为服务通常不会重新读取PAM配置,而是在其启动时继承了父进程的环境。
  3. 检查PAM配置:确保
    /etc/pam.d/common-session
    /etc/pam.d/login
    等文件中包含了
    session required pam_limits.so
    这一行。大多数现代Linux发行版默认都包含,但如果缺失,
    limits.conf
    的配置将不会生效。

我曾遇到过一个情况,修改了

limits.conf
后服务依然报错“Too many open files”,后来发现是服务没有重启,或者服务启动脚本中直接用
su -c
的方式运行,导致没有正确继承PAM的会话限制。细微之处,往往是问题所在。

为什么需要配置进程限制,以及可能遇到的问题?

配置进程限制并非多余,它在系统管理中扮演着至关重要的角色,尤其是在多用户环境或运行关键服务的服务器上。

为什么需要配置:

  1. 资源管理与稳定性: 这是最核心的原因。没有限制,一个失控的程序(比如内存泄漏、无限循环创建子进程)可能会迅速耗尽系统的文件描述符、内存或CPU资源,导致其他正常服务无法运行,甚至整个系统崩溃。设置合理的限制,就像给每个进程划定了它的“领地”,确保系统资源的公平分配和整体的稳定运行。
  2. 安全性: 进程限制也是一种简单的安全措施。它可以防止恶意用户或受损程序通过资源耗尽攻击(DoS)来瘫痪系统。例如,限制一个用户可以创建的进程数,就能有效阻止fork炸弹。
  3. 性能优化: 在某些情况下,通过限制资源,可以促使开发者优化代码,减少不必要的资源占用。同时,对于一些对资源有明确需求的服务,提高其限制能确保其在高负载下依然能正常工作,比如高并发的Web服务器或数据库。

可能遇到的问题:

  1. 限制过低导致服务崩溃: 这是最常见的问题。例如,一个Web服务器在并发连接数很高时,如果
    nofile
    限制太低,就会出现“Too many open files”错误,导致新连接无法建立,服务表现为拒绝访问。数据库连接池不足,或者大量日志文件打开,都可能触发此类问题。
  2. 限制过高导致资源耗尽: 虽然我们倾向于提高限制以避免问题,但无限提高并非良策。如果
    nofile
    nproc
    被设置得过高,而某个程序确实存在内存泄漏或进程管理问题,那么它仍然可能在耗尽系统资源后导致整个系统不稳定。这就像给了一个无底洞的程序一个更大的无底洞,最终还是会拖垮系统。
  3. 软限制与硬限制的混淆: 很多人不理解软硬限制的区别,导致配置不生效。比如,只提高了软限制,但硬限制依然很低,或者反之。应用程序通常只能在软限制和硬限制之间调整自己的资源使用,而无法突破硬限制。
  4. 配置不生效: 即使修改了
    limits.conf
    ,也可能因为没有重新登录、服务没有重启、或者PAM配置不正确而导致设置没有生效。特别是对于以systemd服务运行的程序,systemd自己的
    LimitNOFILE
    LimitNPROC
    等指令可能会覆盖
    limits.conf
    的设置,或者需要额外配置
    Delegate=yes
    让服务继承PAM的限制。在现代Linux系统中,systemd对服务进程的资源管理有更高的优先级和更细致的控制。如果遇到
    limits.conf
    不生效的情况,检查systemd unit文件中的
    Limit*
    指令是一个很好的排查方向。

理解这些限制的意义和可能带来的影响,才能在保障系统稳定的前提下,为应用程序提供恰到好处的资源。这需要一些经验和对系统行为的观察。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

663

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

529

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.1万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号