1、文件描述符是什么
文件描述符是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数用于指代被打开的文件,所有执行I/O操作的系统调用都是通过文件描述符
在Linux系统中内核默认为每个进程创建三个标准的文件描述符:分别是0(标准输入)、1(标准输出)、2(标准错误)
打开文件后占用一个文件描述符3,后面是4...(分配未被占用的最小文件描述符)
进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。
除了文件描述符表,系统还需要维护另外两张表:
- 打开文件表(Open file table)
- i-node 表(i-node table)
文件描述符表每个进程都有一个,打开文件表和 i-node 表整个系统只有一个,它们三者之间的关系如下图所示
通过文件描述符,可以找到文件指针,从而进入打开文件表。该表存储了以下信息:
- 文件偏移量,也就是文件内部指针偏移量。调用 read() 或者 write() 函数时,文件偏移量会自动更新,当然也可以使用 lseek() 直接修改。
- 状态标志,比如只读模式、读写模式、追加模式、覆盖模式等。
- i-node 表指针。
然而,要想真正读写文件,还得通过打开文件表的 i-node 指针进入 i-node 表,该表包含了诸如以下的信息:
- 文件类型,例如常规文件、套接字或 FIFO。
- 文件大小。
- 时间戳,比如创建时间、更新时间。
- 文件锁。
2、查看文件描述符
查看进程的文件描述符
ll /proc/PID/fd
查看系统级别最大文件描述符数(一般为内存大小KB的10%)
cat /proc/sys/fs/file-max
查看用户级别最大文件描述符数
ulimit -u
查看进程级别最大文件描述符数
ulimit -n
3、修改最大文件描述符数
为什么要限制打开的文件描述符?
原因1 – 资源问题:每个打开的文件都需要消耗内存来管理,而内存是有限的
原因2 – 安全问题:如果不限制的话,一个进程可以无限的创建和打开新的文件,会让服务器崩溃
3.1 修改系统级别
临时设置
echo 6553500 > /proc/sys/fs/file-max
永久设置
echo "fs.file-max=419430" >> /etc/sysctl.conf #使用sysctl -p 即不需要重启系统也可以生效 sysctl -p
3.2 修改用户级别
临时设置
ulimit -Sn ulimit -Hn
永久设置(重启后生效)
vim /etc/security/limits.conf #OPPO Standard limits config root hard nofile unlimited #root用户最大描述符使用数量--无限 * soft nofile 20480000 #*表示所有用户,超过发出警告 * hard nofile 20480000 #最大描述符使用数量,超过输出错误
标签:node,文件,ulimit,描述符,进程,打开 From: https://www.cnblogs.com/Xinenhui/p/17511341.html