句柄与文件描述符理解
在Linux里,这叫做文件描述符fd(File Descriptor),而在Windows里,叫做句柄(Handle)(以下在没有歧义的时候统称为句柄)。用户通过某个函数打开文件以获得句柄,此后用户操纵文件皆通过该句柄进行
句柄可以防止用户随意读写操作系统内核的文件对象。无论是Linux还是Windows,文件句柄总是和内核的文件对象相关联的,但如何关联细节用户并不可见。内核可以通过句柄来计算出内核里文件对象的地址,但此能力并不对用户开放,句柄可以理解为指针的索引,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。
在实际使用中,磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,进行打开的时候会返回一个fd,即是文件句柄
linux句柄fd不用了,都要close。如果频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象。在linux系统中对进程可以调用的文件句柄数进行了限制,在默认情况下每个进程可以调用的最大句柄数是1024个,如果超过了这个限制,进程将无法获取新的句柄,而从导致不能打开新的文件或者网络套接字,对于线上服务器即会出现服务被拒绝的情况。
常见的服务中遇到的错误如:too many file open / socket open timeout
句柄相关的常见命令:
查看系统设置的文件句柄数 more /proc/sys/fs/file-max 查看当前打开句柄总数 lsof|awk '{print $2}'|wc -l 根据打开文件句柄的数量降序排列,找出哪个进程占用的句柄数最高 lsof|awk '{print $2}'|sort|uniq -c|sort -nr|more
根据获取的进程ID查看进程的详情
ps -ef|grep XXX
修改linux系统参数。vi /etc/security/limits.conf 添加
* soft nofile 65536
* hard nofile 65536
修改以后保存,注销当前用户,重新登录,执行ulimit -a ,ok ,参数生效了:
统计各进程打开句柄数
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr
统计各用户打开句柄数
lsof -n|awk '{print $3}'|sort|uniq -c|sort -nr
统计各命令打开句柄数
lsof -n|awk '{print $1}'|sort|uniq -c|sort -nr
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/11922883.html

浙公网安备 33010602011771号