句柄数详解

一. 什么是句柄

句柄(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)的统计信息的虚拟文件。它包含了三个数字,以空格分隔:

  1. 第一个数字表示当前已分配的文件句柄数。
  2. 第二个数字表示当前已打开的文件句柄数。
  3. 第三个数字表示系统为进程所分配的最大文件句柄数。

这些数字的含义如下:

  • 已分配的文件句柄数:表示已经分配给进程的文件句柄的总数。这包括已经打开的和正在使用的文件句柄,以及已关闭但尚未释放的文件句柄。这个数字可以大于已打开的文件句柄数,因为进程可以在不关闭文件句柄的情况下分配新的文件句柄。
  • 已打开的文件句柄数:表示当前已经打开的文件句柄的数量。这是进程当前实际使用的文件句柄数。
  • 最大文件句柄数:表示系统为进程所分配的最大文件句柄数限制。这是操作系统所允许的最大文件句柄数。

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 文件来增加文件打开限制数。

另外,您可能会注意到,即使超过了限制,系统仍然可以正常运行。这是因为并不是所有的打开文件都是同时活动的,有些可能只是被打开但并未被使用。实际上,系统可以通过关闭不需要的文件来在需要时释放资源。因此,只有在实际需要打开文件的数量超过限制且系统无法释放资源时,才会导致问题。

请注意,在修改系统的文件打开限制之前,请确保仔细评估系统资源和性能,并确保增加限制不会对系统产生负面影响。

五. 释放句柄数方法

当系统的文件打开限制达到上限时,系统会根据一定规则来关闭不需要的文件以释放资源。通常,系统会关闭最早打开但未使用的文件,以便为新的文件提供空间。

对于长时间未释放资源的情况,您可以尝试以下方法来手动释放资源:

  1. 通过查找并关闭不需要的进程:使用命令 ps -ef 可以列出当前运行的所有进程。根据进程的相关信息,确定哪些进程可能是占用大量文件资源的,并使用 kill 命令结束这些进程。

  2. 通过查找并关闭不需要的文件句柄:使用命令 lsof -u <username> 可以列出指定用户打开的所有文件和文件句柄。根据文件的相关信息,确定哪些文件句柄不再需要,并使用 kill 命令关闭相应的文件句柄。

  3. 重启应用程序或服务:如果您发现某个应用程序或服务长时间占用大量的文件资源,而且无法通过上述方法释放资源,您可以尝试重启该应用程序或服务,以重新初始化文件资源。

请注意,手动释放资源可能涉及到系统的稳定性和数据完整性。在进行任何操作之前,请确保您对系统有足够的了解,并备份重要的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值