文件句柄
linux 中文件句柄有两种,一种是用户级的,一种是系统级的
文件句柄限制,就是规定的单个进程能够打开的最大文件句柄数量(Socket连接也算在里面,默认大小 1024)
用户级的修改
用户级修改临时生效方法
ulimit 命令身是分软限制和硬限制:
-H
就是硬限制-S
就是软限制。
默认显示的是软限制,如果运行 ulimit 命令修改时没有加上 -H 或 -S,就是两个参数一起改变。硬限制就是实际的限制,而软限制是警告限制,只会给出警告。
用户级修改永久有效方式
修改 /etc/security/limits.conf
文件,添加如下内容:
查看用户级修改是否生效
系统级修改
上面的修改都是对一个进程打开的文件句柄数量的限制,还需要设置系统的总限制才可以。
假如设置进程打开的文件句柄数是 1024 ,但是系统总线制才 500,所以所有进程最多能打开文件句柄数量500
只设置进程的打开文件句柄的数量是不行的,需要修改系统的总限制才可以。
临时修改方式
永久生效方式
修改 /etc/sysctl.conf
文件,加入:
查看系统级文件句柄修改,是否生效
查看文件句柄
查询 linux 所有进程持有的句柄数:
第一列是持有句柄数量,第二列是每个进程的PID
查看某个进程持有的句柄数
查看当前进程句柄数量限制
查看 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