目录
一. 什么是句柄
句柄(Handle)是操作系统为了标识和管理资源而提供的一种机制,用于表示资源的引用或指针。句柄可以是一个整数或一个指针,它们在操作系统内部被用作资源的唯一标识。每个打开的文件都会被操作系统分配一个唯一的句柄。
在操作系统中,句柄被用于管理各种类型的资源,包括文件、设备、窗口、进程等。通过使用句柄,操作系统可以追踪和控制资源的访问、共享和释放。
二. 句柄书🟰文件打开数?
句柄数(Handle count)指的是一个进程当前所拥有的句柄的数量。它表示了进程正在使用的资源数量。而文件打开数(File open count)是指系统或进程当前打开的文件的数量。
在大多数操作系统中,文件也被当做一种资源,因此打开一个文件也会分配一个句柄来表示对该文件的引用。因此,文件打开数也是句柄数的一部分,即文件句柄数。文件句柄数是句柄数中与文件相关的部分。
总结起来,句柄数是指一个进程当前拥有的句柄的总数,而文件打开数是句柄数中与文件相关的部分。文件打开数是句柄数的一个子集。
需要注意的是,虽然文件打开数和句柄数通常是相关的,但并不完全相同。在某些情况下,一个打开的文件可能对应多个句柄,例如在多个进程或线程中共享文件时。而文件打开数通常是对于独立的、非共享的文件句柄的计数。
三. 常用查看命令
1. 查看当前系统中打开的文件数量(即文件句柄数)
1)全局查看
可以使用以下命令:
lsof | wc -l
这里的 lsof
命令用于列出当前打开的文件和进程,wc -l
命令用于统计行数,从而得到当前打开的文件句柄数。
2)当前会话
要查看当前会话打开的文件数量,可以使用以下命令:
lsof -u <username> | wc -l
将 <username>
替换为当前会话的用户名。这将返回当前会话打开的文件数量。
2. /proc/sys/fs/file-nr查看系统句柄数配置
/proc/sys/fs/file-nr
文件是一个用于显示当前系统文件句柄(file handles)的统计信息的虚拟文件。它包含了三个数字,以空格分隔:
- 第一个数字表示当前已分配的文件句柄数。
- 第二个数字表示当前已打开的文件句柄数。
- 第三个数字表示系统为进程所分配的最大文件句柄数。
这些数字的含义如下:
- 已分配的文件句柄数:表示已经分配给进程的文件句柄的总数。这包括已经打开的和正在使用的文件句柄,以及已关闭但尚未释放的文件句柄。这个数字可以大于已打开的文件句柄数,因为进程可以在不关闭文件句柄的情况下分配新的文件句柄。
- 已打开的文件句柄数:表示当前已经打开的文件句柄的数量。这是进程当前实际使用的文件句柄数。
- 最大文件句柄数:表示系统为进程所分配的最大文件句柄数限制。这是操作系统所允许的最大文件句柄数。
3. /proc/sys/fs/file-max查看系统支持的最大句柄数
/proc/sys/fs/file-max
文件是一个用于显示系统所支持的最大文件句柄数的虚拟文件。
该文件只包含一个数字,表示系统所支持的最大文件句柄数限制。
区别:
/proc/sys/fs/file-max
文件中的数字表示系统所支持的最大文件句柄数限制,即系统所能够同时打开和处理的最大文件句柄数。这个数字是操作系统的全局设置,适用于所有进程。/proc/sys/fs/file-nr
文件中的第三个数字表示系统为进程所分配的最大文件句柄数限制。这个数字是针对每个进程的设置,表示系统为单个进程所分配的最大文件句柄数限制。这个数字可能小于或等于/proc/sys/fs/file-max
文件中的数字。
也就是说,/proc/sys/fs/file-max
文件中的数字是系统范围内的最大文件句柄数限制,而 /proc/sys/fs/file-nr
文件中的第三个数字是进程级别的最大文件句柄数限制。系统会根据进程级别的限制来分配文件句柄给每个进程,但不能超过系统级别的限制。
4. 显示当前会话中允许的最大句柄数量
ulimit -n
命令用于显示当前会话中允许的最大文件描述符数量。它表示操作系统限制单个用户或进程可以同时打开的文件数量。
ulimit -n
ulimit
是一个用于设置和显示进程资源限制的命令,其中 -n
参数用于显示当前设置的最大句柄数限制。
另外,你也可以在 /etc/security/limits.conf
文件中查找 ulimit -n
值,该文件用于设置系统范围的资源限制。
四. 注意
在我的测试机中,lsof | wc -l
显示的是当前系统中打开的文件数量为 68054,lsof -u root | wc -l
显示的是2503,而 ulimit -n
显示的是当前会话中可以打开的最大文件描述符数量为 1024,file-max
的值为1632597。
虽然您的限制是1024,但并不意味着一旦超过这个限制就无法继续打开更多的文件,这只是系统为每个会话(包括每个用户和进程)设置的默认限制。
默认情况下,您可以打开的文件数限制是由系统管理员根据系统资源进行配置的。如果您是 root 用户,您可以通过修改 /etc/security/limits.conf
文件来增加文件打开限制数。
另外,您可能会注意到,即使超过了限制,系统仍然可以正常运行。这是因为并不是所有的打开文件都是同时活动的,有些可能只是被打开但并未被使用。实际上,系统可以通过关闭不需要的文件来在需要时释放资源。因此,只有在实际需要打开文件的数量超过限制且系统无法释放资源时,才会导致问题。
请注意,在修改系统的文件打开限制之前,请确保仔细评估系统资源和性能,并确保增加限制不会对系统产生负面影响。
五. 释放句柄数方法
当系统的文件打开限制达到上限时,系统会根据一定规则来关闭不需要的文件以释放资源。通常,系统会关闭最早打开但未使用的文件,以便为新的文件提供空间。
对于长时间未释放资源的情况,您可以尝试以下方法来手动释放资源:
通过查找并关闭不需要的进程:使用命令
ps -ef
可以列出当前运行的所有进程。根据进程的相关信息,确定哪些进程可能是占用大量文件资源的,并使用kill
命令结束这些进程。通过查找并关闭不需要的文件句柄:使用命令
lsof -u <username>
可以列出指定用户打开的所有文件和文件句柄。根据文件的相关信息,确定哪些文件句柄不再需要,并使用kill
命令关闭相应的文件句柄。重启应用程序或服务:如果您发现某个应用程序或服务长时间占用大量的文件资源,而且无法通过上述方法释放资源,您可以尝试重启该应用程序或服务,以重新初始化文件资源。
请注意,手动释放资源可能涉及到系统的稳定性和数据完整性。在进行任何操作之前,请确保您对系统有足够的了解,并备份重要的数据。