解决动态修改/proc/{pid}/limits

本文介绍了如何在Linux中查看和修改进程Maxopenfiles的限制,包括临时和永久修改的方法,如prlimit、ulimit和编辑limits.conf文件,适用于CentOS 7和6系统。
cat /proc/39977/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             65535                65535                processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       514823               514823               signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us 

上面的展示是查看某个进程的打开文件的相关参数最大值,其中,Max open files 是打开文件的最大数量,那么如何动态修改这个值呢? 毕竟1024太小了,操作如下:

# CentOS7系统使用命令
prlimit --nofile=65536:65536 --pid 39977

# CentOS6系统使用命令
echo - n "Max open files=65535:65535" > /proc/39977/limits

当然,可以通过重启这个进程所对应的服务(如果可重启,也不会来修改这个session里的参数了)来重新读取系统里的默认设置。

扩展:

ulimit -n
# 临时修改,重启失效
ulimit -HSn 65536

# 永久解决
vim /etc/security/limits.conf
# 添加如下的行
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
### /proc/<pid>/task/<tid>/fd 的用途和结构 在 Linux 中,`/proc/<pid>/task/<tid>/fd` 是一个特殊的目录,它与进程和线程的文件描述符相关联。以下是关于该目录的详细信息: #### 1. **目录的用途** `/proc/<pid>/task/<tid>/fd` 目录用于列出指定线程(`<tid>`)所打开的所有文件描述符。每个文件描述符对应于一个链接,指向实际的文件路径或设备。通过访问此目录,用户可以查看线程当前正在使用的文件资源[^3]。 #### 2. **目录的结构** - 每个文件描述符以数字命名,例如 `0`, `1`, `2` 等。 - 这些数字是线程中文件描述符的索引值。 - 每个文件描述符是一个符号链接,指向实际的文件路径或设备。如果文件已删除但仍然被打开,则链接可能指向 `/dev/fd/<number>` 或其他特殊路径。 #### 3. **文件描述符的类型** 文件描述符可以指向多种类型的资源,包括但不限于: - 普通文件 - 目录 - 套接字 - 管道 - 设备文件(如 `/dev/null`) #### 4. **访问权限** 根据引用内容,`/proc` 文件系统的文件通常只允许进程的所有者读取。然而,从内核版本 2.6.36 开始,某些文件(如 `/proc/[pid]/limits`)对系统上的所有用户开放[^2]。尽管如此,`/proc/<pid>/task/<tid>/fd` 的访问权限仍受限于进程的所有者或具有适当权限的用户。 #### 5. **示例代码:读取线程的文件描述符** 以下是一个简单的 Python 脚本,用于读取指定线程的文件描述符: ```python import os def list_thread_fds(pid, tid): fd_path = f"/proc/{pid}/task/{tid}/fd" if not os.path.exists(fd_path): print(f"Path {fd_path} does not exist.") return fds = os.listdir(fd_path) for fd in fds: try: target = os.readlink(os.path.join(fd_path, fd)) print(f"FD {fd} -> {target}") except Exception as e: print(f"Error reading FD {fd}: {e}") # 示例调用 list_thread_fds(1234, 5678) ``` #### 6. **与其他结构的关系** - `/proc/<pid>/task/<tid>/fd` 属于 `struct files_struct` 的一部分,该结构体存储了线程的文件描述符信息[^1]。 - 子进程创建后会继承父进程的文件描述符,但它们各自拥有独立的 `struct files_struct` 实例。 #### 7. **中断与文件描述符** 虽然 `/proc/interrupts` 提供了关于 CPU 中断的信息[^4],但它与 `/proc/<pid>/task/<tid>/fd` 没有直接关联。两者分别关注不同的系统资源。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值