| 命令 | 功能 | 适用场景 |
|---|---|---|
ulimit | ||
lsof |
二、ulimit 使用与优化
1. 核心参数与用法
查看当前限制:
ulimit -a # 显示所有资源限制ulimit -n # 查看文件描述符限制(默认1024)
设置限制:
ulimit -n 65535 # 临时设置当前会话的文件描述符上限为65535
持久化配置:
用户级:修改 /etc/security/limits.conf,例如:
* soft nofile 65535* hard nofile 65535
系统级:修改 /etc/sysctl.conf,例如:
fs.file-max=1000000 # 系统全局文件描述符上限sysctl -p # 生效配置
2. 常见问题与解决
错误示例:EMFILE (Too many open files)
原因:进程打开文件数超过 ulimit -n 限制。
排查:
lsof -p <PID> | wc -l # 统计指定进程的打开文件数
解决:
增大 ulimit -n 或修改 /etc/security/limits.conf。
检查代码中未关闭的文件句柄(如循环中未释放资源)。
三、lsof 使用与注意事项
1. 核心功能
查看所有打开文件:
lsof # 列出所有进程的打开文件lsof -i :80 # 查找占用80端口的进程lsof -u root # 查看root用户打开的文件
2. 常见误区与正确方法
误区:使用 lsof | wc -l 统计文件描述符数可能不准确,因为:
lsof 包含内存映射文件(FD 列标记为 mem)。
不同 Linux 版本输出格式差异(如 CentOS 7 按线程显示)。
正确统计方法:
cat /proc/sys/fs/file-nr # 系统全局已用/最大文件描述符数find /proc -name fd | wc -l # 精确统计所有进程的fd总数
四、联合使用案例
场景:解决文件描述符耗尽问题
检查系统限制:
ulimit -n # 用户级限制cat /proc/sys/fs/file-max # 系统级限制
定位泄漏进程:
sudo find /proc -print | grep -P '/proc/\d+/fd/' | awk -F '/' '{print $3}' | uniq -c | sort -rn | head
分析具体文件:
lsof -p <PID> # 查看进程打开的文件详情
五、最佳实践总结
| 维度 | 建议 |
|---|---|
ulimit | /etc/security/limits.conf持久化配置,避免依赖临时调整。 |
lsof | /proc文件系统统计 fd,避免因版本差异导致误判。 |
| 容器环境 | --ulimit参数显式设置限制,覆盖宿主机默认值。 |
| 监控工具 |
六、Windows 系统中的对应命令
1.ulimit 在 Linux 中用于设置进程资源限制(如文件描述符数量、内存等)。Windows 没有直接等效的命令,但可通过以下方式实现类似功能:
1)文件描述符限制
默认限制:Windows 没有全局文件描述符限制,但 MSVC 运行时库(如 msvcrt.dll)对单个进程的默认限制为 2048(可通过修改运行时库源码调整,但需重新编译)。
系统级调整:通过注册表或组策略修改系统资源分配,例如:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota
修改此键值可调整进程句柄数上限
2)内存与 CPU 限制
任务管理器:手动限制进程的内存或 CPU 使用率(需针对每个进程设置)。
PowerShell:通过 Set-ProcessMitigation 控制进程资源使用
3)开发框架支持
在代码中主动控制资源释放(如文件流关闭),避免依赖系统级限制。例如:
with open("file.txt", "r") as f: # 使用上下文管理器自动关闭文件data = f.read()
2.lsof 在 Linux 中用于查看进程打开的文件和网络连接。Windows 的替代工具如下:
1)内置命令 openfiles
查询打开文件:
openfiles /query /v # 显示所有打开文件的详细信息(需管理员权限)openfiles /query /fo CSV # 输出为 CSV 格式便于解析
断开文件连接:
openfiles /disconnect /id 1234 # 根据文件 ID 断开进程
2.PowerShell 脚本
通过 Get-Process 和 Get-NetTCPConnection 组合查询网络连接,结合脚本可实现自动化监控
Get-Process | Select-Object Name, Id, Path | Where-Object { $_.Path -like "*chrome*" }Get-NetTCPConnection | Where-Object { $_.State -eq "Established" }




