概念:内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件
/proc映射内核的一些变量和属性,开机之后才会有文件存在,进程被内核管理,被映射程文件
$$当前bash的pid $BASHPID
/proc/$$/fd 当前进程下所有的进程描述符
lsof -op $$ 当前进程下所有的进程描述符的所有细节
cd /proc/$$当前进程下也有很多描述文件
查看当前进程号
echo $$
进程打开了哪些文件
lsof -op $$
pcstat pagecache的状态
cat /proc/vmstat |grpe dirty查看脏读
设置Linux打开文件句柄/proc/sys/fs/file-max和ulimit -n的区别
用户级的文max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
ulimit -n 控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制。这是进程级别的。
对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。
一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。
为了让服务器重启之后,配置仍然有效,需要用永久生效的配置方法进行修改。
max-file:
查看系统级别的能够打开的文件句柄的数量,Centos7默认是794168
# cat /proc/sys/fs/file-max
794168
系统级打开最大文件句柄的数量永久生效的修改方法,修改文件,文件末尾加入配置内容:
# vim /etc/sysctl.conf
fs.file-max = 2000000
然后执行命令,使修改配置立即生效:
# sysctl -p
ulimit:
查看用户进程级的能够打开文件句柄的数量,Centos7默认是1024
这里设置的是当前shell的当前用户的打开的最大限制,如果当前用户打开多个shell,则每个shell都能打开该最大值
# ulimit -n
1024
进程级打开文件句柄数量永久生效的修改方法,修改文件,文件末尾加入配置内容:
这里限制一个用户的所有shell能打开的最大数:
# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
修改以后,需要重新登录才能生效。
如果需要设置当前用户session立即生效,还需要执行:
# ulimit -n 65535
对于服务器,一般修改进程级的最大打开文件句柄数即可(系统默认1024,有点小)。一般不需要调整系统级的最大数。
如果出现了达到系统级别最大限制时,也需要同步调整系统级的最大数的。
件描述符
ulimit
临时生效
ulimit -HSn 10240
用户级永久生效配置文件位置
/etc/security/limits.conf
内核级的文件描述符,对应内存的大小1G内存可以打卡10万文件描述符
/proc/sys/fs/file-max
含义:
cat /proc/sys/fs/file-nr
2112 0 2100000
已分配文件句柄的数目 已分配未使用文件句柄的数目 文件句柄的最大数目
### 打开的最多文件描述符
一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
`worker_rlimit_nofile 65535;`