跳转至

文件句柄

linux 中文件句柄有两种,一种是用户级的,一种是系统级的

文件句柄限制,就是规定的单个进程能够打开的最大文件句柄数量(Socket连接也算在里面,默认大小 1024)

用户级的修改

用户级修改临时生效方法

ulimit 命令身是分软限制和硬限制:

  • -H就是硬限制
  • -S就是软限制。

默认显示的是软限制,如果运行 ulimit 命令修改时没有加上 -H 或 -S,就是两个参数一起改变。硬限制就是实际的限制,而软限制是警告限制,只会给出警告。

ulimit -SHn 10000

用户级修改永久有效方式

修改 /etc/security/limits.conf 文件,添加如下内容:

* soft nofile 204800
* hard nofile 204800

* soft nproc 204800
* hard nproc 204800

查看用户级修改是否生效

ulimit -a

系统级修改

上面的修改都是对一个进程打开的文件句柄数量的限制,还需要设置系统的总限制才可以。

假如设置进程打开的文件句柄数是 1024 ,但是系统总线制才 500,所以所有进程最多能打开文件句柄数量500

只设置进程的打开文件句柄的数量是不行的,需要修改系统的总限制才可以。

临时修改方式

echo 6553560 > /proc/sys/fs/file-max

永久生效方式

修改 /etc/sysctl.conf 文件,加入:

fs.file-max=65535

查看系统级文件句柄修改,是否生效

sysctl -p

查看文件句柄

查询 linux 所有进程持有的句柄数:

lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more

第一列是持有句柄数量,第二列是每个进程的PID

查看某个进程持有的句柄数

ls /proc/{PID}/fd | wc -l

查看当前进程句柄数量限制

cat /proc/{PID}/limits | grep "files"

查看 docker 容器的文件句柄

> lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

# 句柄数 进程
  86308 854
  21567 2912848
  18627 7345
   7999 930
   7284 151876
   4485 10507
   4356 3347939
   4224 10436
   3696 1923896
   3289 10554
   3186 992752

根据 pid 追查可以找到对应的 docker 目录,也就可以找到 pod 名称

> ps -ef | grep 854

root     2912848       1  0  2022 ?        00:09:25 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 6c0c27a5e8875fe3f87a7c6468c8fb7851666bb98b63dda193dd978d425db7cf -address /var/run/docker/containerd/containerd.sock
root     2912867 2912848  0  2022 ?        00:05:32 tini -- /bin/sh -c kbdev init && kbdev create && sleep infinity

> crictl ps |grep 6c0c27a

6c0c27a5e8875      dockerstacks/centos-kbdev@sha256:a8372b3938b61e861e536f57a440c2b4ad507246d78c84a6b0762eb22a79e433              2 weeks ago         Running             kbdev                        0                   0df331ad1a1a9

> docker ps |grep 6c0c27a

6c0c27a5e887   dockerstacks/centos-kbdev              "tini -- /bin/sh -c …"   2 weeks ago      Up 2 weeks                                                  k8s_kbdev_kbdev-0_dev-ywu_6c1d8dec-1ec5-4737-9169-a13c5a6cc832_0