Linux文件句柄

本文介绍了解决 Linux 中文件句柄数量限制的方法,特别是在 CentOS 5 系统上如何通过调整 ulimit 值来解决 Socket/File: Can't open so many files 的问题。文中详细解释了如何查看和修改文件句柄限制,并提供了具体的 shell 命令。
http://hi.baidu.com/gniwan/blog/item/edafb2cb171b904ef31fe753.html

Linux 下面部署应用 的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件 打开数到900多时速能就非常快的下降,有可能打不开网页.
其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量.

查看方法

我们可以用ulimit -a来查看所有限制值

[root@centos5 ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 4096
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited||<

其中 "open files (-n) 1024 "是Linux操作系统 对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响MySQL 的并发连接数目).这个值可用ulimit命令来修改,但ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效.

系统总限制是在这里,/proc/sys/fs/file-max.可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制.

另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量

查找文件句柄问题的时候,还有一个很实用的程序lsof.可以很方便看到某个进程开了那些句柄.也可以看到某个文件/目录被什么进程占用了.

修改方法
若 要令修改ulimits的数值永久生效,则必须修改配置文档,可以给ulimit修改命令放入/etc/profile里面,这个方法实在是不方便,还有 一个方法是修改/etc/sysctl.conf .我修改了,测试过,但对用户的ulimits -a 是不会改变的。只是/proc/sys/fs/file-max的值变了.(我给命令放到rc.local中失败)

我认为正确的做法,应该是修改/etc/security/limits.conf
里面有很详细的注释,比如

* soft nofile 32768
* hard nofile 65536

也可以直接运行下面这个shell。直接copy到你的终端中运行就好了.
echo -ne "
* soft nofile 65536
* hard nofile 65536
" >>/etc/security/limits.conf

就可以将文件句柄限制统一改成软32768,硬65536.配置文件最前面的是指domain,设置 为星号代表全局,另外你也可以针对不同的用户做出不同的限制

注意.这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning.其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软
默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数 一起改变.

生效

修改完重新登录就可以见到.(我的系统是Centos5.1.修改了,重新登录后就立刻生效.可以用ulimit -a 查看确认.)

<think>嗯,用户现在想了解Linux系统中关于文件句柄数的内核参数配置方法和限制,包括ulimit和sysctl。之前他们提到了tcp_syn_retries的问题,现在转向了文件句柄数,这可能是因为他们在实际应用中遇到了文件打开数过多的问题,比如高并发服务器场景。 首先,我需要回忆一下文件句柄数相关的参数。用户提到了三个引用,其中引用[1]和[2]讨论了如何修改系统级和进程级的文件句柄限制。引用[3]提到了TIME_WAIT套接字的问题,但用户现在的问题是关于文件句柄数,所以可能需要将重点放在前两个引用上。 用户的问题包括内核参数配置方法、限制,以及ulimit和sysctl的使用。我需要分层次回答,先解释文件句柄数的两个层级:系统级和用户进程级。系统级参数如file-max和nr_open,而用户进程级涉及ulimit的nofile设置。 需要指出系统级限制由sysctl管理,如/etc/sysctl.conf中的fs.file-max和fs.nr_open。用户级限制通过ulimit或/etc/security/limits.conf来设置。同时要说明这两者的关系,比如用户级限制不能超过系统级限制,否则无效。 用户可能遇到的常见问题包括“Too many open files”错误,这时需要同时调整系统级和用户级限制。需要给出具体的配置步骤,比如修改sysctl.conf后执行sysctl -p,以及修改limits.conf后重新登录或使用ulimit -n查看。 另外,用户可能需要验证配置是否生效,可以通过cat /proc/sys/fs/file-max和ulimit -n来检查当前值。还要注意nr_open和file-max的区别,nr_open是单个进程的最大限制,而file-max是整个系统的限制。 最后,用户可能关心优化建议,比如高并发服务器需要调高这些参数,同时注意内核内存的消耗。需要确保回答覆盖了配置方法、验证步骤、常见问题解决和优化建议,结构清晰,步骤明确。</think>### Linux 文件句柄数内核参数配置指南 Linux 文件句柄数限制分为**系统级**和**用户进程级**,需通过 `sysctl`(系统内核参数)和 `ulimit`(用户级资源限制)协同配置。以下是具体方法及限制解析: --- #### 一、系统级限制(`sysctl` 参数) 1. **全局文件句柄上限 `fs.file-max`** - **作用**:控制整个系统可分配的最大文件句柄数(包括所有进程、套接字等)。 - **配置方法**: ```bash # 临时生效(重启失效) echo 655350 > /proc/sys/fs/file-max # 永久生效(需写入配置文件) echo "fs.file-max = 655350" >> /etc/sysctl.conf sysctl -p # 加载配置 ``` - **验证**: ```bash cat /proc/sys/fs/file-max ``` 2. **单进程文件句柄上限 `fs.nr_open`** - **作用**:限制单个进程能打开的最大文件句柄数(需大于用户级 `ulimit` 设置)。 - **配置方法**: ```bash echo "fs.nr_open = 4000000" >> /etc/sysctl.conf sysctl -p ``` --- #### 二、用户进程级限制(`ulimit` 参数) 1. **用户会话级限制 `nofile`** - **作用**:限制当前用户会话中进程的文件句柄数(默认通常为 1024)。 - **临时修改**: ```bash ulimit -n 65535 # 仅对当前会话有效 ``` - **永久修改**(需编辑 `/etc/security/limits.conf`): ```bash # 添加以下内容(以用户 root 为例) root soft nofile 65535 root hard nofile 65535 ``` - **验证**: ```bash ulimit -n # 查看当前会话限制 ``` --- #### 三、关键限制关系与优先级 - **层级关系**: $$ \text{进程实际限制} \leq \text{用户级限制(ulimit)} \leq \text{系统级限制(fs.nr_open)} \leq \text{全局限制(fs.file-max)} $$ 若用户级 `ulimit` 设置超过 `fs.nr_open`,实际值以 `fs.nr_open` 为准[^2]。 - **常见问题**: - **错误提示**:`Too many open files` **原因**:进程打开文件数超过 `ulimit` 或系统级限制。需同时调整用户级和系统级参数。 - **孤儿文件句柄**:通过 `lsof | grep deleted` 可查看未释放的已删除文件句柄。 --- #### 四、优化建议 1. **高并发场景**: - 提升 `fs.file-max` 至百万级(如 `1048576`); - 设置 `fs.nr_open` 大于用户级 `ulimit`(如 `fs.nr_open=4000000`)。 2. **内核内存调整**: 文件句柄占用内核内存,过高值可能导致内存压力,需结合 `vm.max_map_count` 等参数优化[^3]。 --- ### 验证与调试命令 | 命令 | 用途 | |------|------| | `cat /proc/sys/fs/file-nr` | 查看当前已分配/使用/最大文件句柄数 | | `lsof | wc -l` | 统计系统当前打开文件句柄总数 | | `sysctl fs.file-max fs.nr_open` | 检查系统级参数配置 | --- ### 相关问题 1. 如何排查 Linux 系统文件句柄泄漏问题? 2. `fs.file-max` 和 `fs.nr_open` 的具体区别是什么? 3. 如何为 Docker 容器单独配置文件句柄限制? 通过上述配置,可有效管理系统文件句柄资源,避免因句柄耗尽导致的服务异常[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值