一、Linux句柄概述
在Linux中,每个进程在运行时至少会打开3个文件句柄:标准输入、标准输出和标准错误输出,当打开其他文件时,每个文件也将分配一个唯一的文件句柄。
二、Linux句柄文件
在Linux中,每个句柄都对应一个文件描述符,文件描述符是一个内核用来访问文件的整数值,它们在每个进程中拥有独立的命名空间。文件描述符是每个进程用来访问文件的接口,可以看做是一个索引或者指针。
int open(const char *pathname, int flags); int read(int fd, void *buf, size_t count); int write(int fd, const void *buf, size_t count); int close(int fd);
三、Linux句柄数过高怎么解决
如果Linux句柄数过高,可能存在以下问题:
1、内存消耗过高
2、进程间通信延迟
3、开销和耗时增加
解决方法:
1、通过调整Linux句柄数上限
2、检查代码从而确认是否存在文件描述符泄漏问题,采取一些手段来减少对文件描述符的使用
四、Linux句柄数怎么看
可以通过/proc/sys/fs/file-nr文件来查看当前系统使用的文件描述符数量,格式为三个数字,每个数字之间用空格分隔,依次表示:
当前已分配的文件描述符数/系统允许分配的最大数量/不使用的文件描述符数量
$ cat /proc/sys/fs/file-nr
五、Linux句柄数配置文件
可以通过配置文件/etc/security/limits.conf来配置Linux句柄数量上限,该文件中有soft和hard两个限制,soft限制表示用户级别的软资源限制,可被超级用户覆盖,hard限制表示用户级别的硬资源限制,只有在超级用户角色下才能增加。
username soft nofile 20480 username hard nofile 20480
六、Linux句柄数设置
可以通过修改/proc/sys/fs/file-max文件来设置系统允许分配的最大文件描述符数。
$ echo 65536 > /proc/sys/fs/file-max
七、Linux句柄失效
当已经分配的文件描述符被关闭时,默认会等待2分钟后才能释放。可以通过修改/proc/sys/fs/nr_open来缩短时间。
$ echo 65536 > /proc/sys/fs/nr_open
八、Linux句柄数修改
可以通过修改/proc/sys/fs/file-nr文件来设置当前已分配的文件描述符数量,但需要注意不要超过系统允许分配的最大值。
$ echo "1000 2000 3000" > /proc/sys/fs/file-nr
九、Linux句柄数满了
当Linux句柄数已经满了,可能会导致应用程序崩溃。可以通过增加Linux句柄数上限或者优化程序代码来解决问题。
十、Linux句柄数占用情况
可以通过lsof命令来查看当前系统中每个进程使用的文件描述符的情况。
$ lsof -u username
十一、Linux句柄泄露排查
可以通过检查程序代码或者通过strace命令来诊断是否存在文件描述符泄露问题。
$ strace -o filename -f command