20、文件描述符

1 文件描述符概念

Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

  • 每个文件描述符会与一个打开的文件相对应
  • 不同的文件描述符也可能指向同一个文件
  • 相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开

2 文件描述符表

进程级文件描述符表 系统级文件描述符表
(open file table)
i-node表
记录内容 1.文件描述符
2.文件指针(open file handle)
1.当前文件偏移量
2.状态标识
3.文件访问模式(读,写,读和写)
4.对该文件i-node对象的引用
5.文件类型(常规文件、套接字、FIFO...)
6.访问权限
7.一个指向该文件所持有的所有表的指针
8.文件的各种属性
9.与信号驱动相关的设置
1.文件类型
2.文件锁

3 查看进程文件描述符限制

cat /proc/pid号码/limits


soft 指的是当前系统生效的设置值
hard 指的是系统中所能设定的最大值

ulimit -n

4 修改进程文件描述符限制

用户级限制
(只对通过PAM登录的用户有效,对systemd的service资源不生效)
系统级限制
查看 ulimit -n 1.sysctl -a | grep -i file-max
2.cat /proc/sys/fs/file-max
修改
(重启失效)
ulimit -SHn 65535 1.sysctl -w fs.file-max=65535
2.echo 65535>/proc/sys/fs/file-max
修改
(永久生效)
修改配置文件:
/etc/security/limits.conf
最后一行加入:
* soft nofile 65535
* hard nofile 65535
修改配置文件:
/etc/sysctl.conf
在任意位置加入:
fs.file-max=65535
执行(不执行则不生效):
sysctl -p

对于nginx,修改/etc/security/limits.conf就可以,同时需要在nginx配置文件中修改worker_rlimit_nofile

你可能感兴趣的:(20、文件描述符)