kernel升级与优化、文件描述符和文件句柄

一、内核升级

1、升级内核

CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。

#导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

2、查看可用的系统内核包

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

3、安装最新版本内核

长期维护版本为 lt ,最新主线稳定版 ml

可以自己到网站下载对应版本,然后指定版本安装,https://buildlogs.centos.org/c7-kernels.x86_64/kernel/

#--enablerepo 选项开启 CentOS 系统上的指定仓库。默认开启的是 elrepo,这里用 elrepo-kernel 替换。
yum -y --enablerepo=elrepo-kernel install kernel-ml

4、设置 GRUB 默认的内核版本

内核安装好后,需要设置为默认启动选项并重启后才会生效

查看系统上的所有可用内核:

# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

设置新的内核为grub2的默认版本

通过 grub2-set-default 0 命令或编辑 /etc/default/grub 文件来设置

#设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核
grub2-set-default 0

生成 grub 配置文件并重启

#接下来运行下面的命令来重新创建内核配置
# grub2-mkconfig -o /boot/grub2/grub.cfg

5、制作离线内核升级包

# 下载制作升级包的工具
yum -y install yum-utils
yum -y install createrepo -y
repotrack httpd -p ./httpds/           或者   yumdownloader --resolve --destdir /tmp/ansible ansible
# 制作最新版本的内核软件包,保存在了./kernel-ml.x86_64/目录
repotrack kernel-ml.x86_64 -p ./kernel-ml.x86_64/           或者   yumdownloader --resolve --destdir ./kernel-ml.x86_64 kernel-ml.x86_64
# 制作好了之后只需要把kernel-ml.x86_64目录拷贝到需要升级的机器升级即可

离线升级centos7内核

内核下载大全

http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/

在一台可以上网的机器上面执行如下命令获取离线安装包

wget https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm --import RPM-GPG-KEY-elrepo.org
 
wget http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
rpm -Uvh elrepo-release-7.0-2.el7.elrepo.noarch.rpm
 
# 将包kernel-ml-5.8.1-1.el7.elrepo.x86_64.rpm下载到/data/soft目录下
yum install --enablerepo=elrepo-kernel --downloadonly --downloaddir=/data/soft/ kernel-ml

将kernel-ml-5.8.1-1.el7.elrepo.x86_64.rpm 上传到想升级内核的机器

设置 GRUB 默认的内核版本

了让新安装的内核成为默认启动选项,你需要如下修改 GRUB 配置,打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0.意思是 GRUB 初始化页面的第一个内核将作为默认内核.
设置:

将GRUB_DEFAULT=saved注释
改为 GRUB_DEFAULT=0

重新创建内核配置

grub2-mkconfig -o /boot/grub2/grub.cfg

删除旧内核的 RPM 包(慎重操作!!!!)

# yum remove kernel-3.10.0-514.el7.x86_64 \
kernel-tools-libs-3.10.0-862.11.6.el7.x86_64 \
kernel-tools-3.10.0-862.11.6.el7.x86_64 \
kernel-3.10.0-862.11.6.el7.x86_64

二、内核优化

1、Core文件简介

Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。

2、什么是Core Dump
我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地当掉。操作系统就会把程序当掉时的内存内容 dump 出来(现在通常是写在一个叫 core 的 file 里面),让我们或是 debugger 做为参考。这个动作就叫作 core dump。 

ubuntu默认core dump是关闭的

通过命令$ ulimit -a 查看:

core file size这一项为0,说明不生成core dump文件

通过命令$ ulimit -c unlimited设置生成的core文件大小不限,也可以按自己的需求设置大小,设置完成后:

可以在~/.bashrc(只对当前用户生效),这样每次打开shell都会生效

echo  'ulimit -c unlimited' >> ~/.bashrc

source ~/.bashrc

修改完会自动修改 /etc/security/limits.conf文件(用户级别参数)

默认生成的core dump文件的名称为core,不够直观,可通过以下命令修改:

$ sudo sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P.%E

其中每个%开头的符号含义如下(来自man,命令:man 5 core

3、一般的发行版,限制单进程最大可以打开1024个文件(用户层面

ulimit

  • -u: 代表 “max user processes”,表示用户可以启动的最大进程数(在某些系统上也包括线程)。

  • -n: 代表 “open files”,表示用户可以打开的最大文件数。

ubuntu16.04

cat > /etc/security/limits.conf <<EOF
root    soft    nofile  655360
root    soft    nproc   655350
root    hard    nofile  655360
root    hard    nproc   655350
*       soft    nproc   655360
*       hard    nproc   655360
*       soft    nofile  655360
*       hard    nofile  655360
*       soft    core    0
*       hard    core    0
*       soft    stack   unlimited
*       hard    stack   unlimited
EOF

还要修改:/proc/sys/kernel/pid_max的限制(系统层面

/etc/sysctl.conf:这是一个配置文件,它允许你在系统启动时改变/调整 kernel 参数。你可以向这个文件中添加kernel.pid_max = value 来设置系统允许的最大进程数。

/proc/sys/kernel/threads-max:这是系统允许的最大线程数,在系统启动时根据系统内存动态计算而得。进程的创建实质上是在创建线程,因此这个参数也影响着系统中进程的创建。

/proc/sys/vm/max_map_count:这是每个进程可以拥有的最大内存映射区域的数量,每个线程的创建都需要一个本地内存映射区。

补充:

1、查看进程和线程的打开数量

# 查看进程数量
ps -e | wc -l

# 查看线程数量
ps -eLf | wc -l

# 查看容器打开的线程数量()
docker exec -it 容器名 sh -c "ps -eLf | wc -l"

# 查看某个进程的线程数
cat /proc/<PID>/status | grep Threads

2、/etc/profile也可以设置限制

if [ $SHELL = "/bin/ksh" ]; then

ulimit -p 50000

ulimit -n 50000

else

ulimit -u 50000 -n 50000

fi

cat  /etc/security/limits.conf (centos6)

文件的配置作用域缩小了一,limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效

* hard core  0    表示对所有用户生产dump,但默认是注释了的 如果只想对某些用户或用户组打开core dump
* soft nofile 65535   单个进程可打开的文件描述符的最大数(超过会警告)
* hard nofile 65535   单个进程可打开的文件描述符的最大数(超过会报错)
* soft nproc   131072       单个用户可用的最大进程数量(超过会警告);
* hard nproc   131072     单个用户可用的最大进程数量(超过会报错);
其中'*'号表示修改所有用户的限制;

关于pam(Pluggable Authentication Modules)认证的补充:

Sun公司1995年开发的一种与认证相关的通用框架机制,PAM只关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开;PAM只是一个框架而已,自身不做认证。

它提供了对所有服务进行认证的中央机制,适用于login\telnet\rlogin\fsh\ftp\pp\su等应用程序中。

PAM-API 调用认证接口
PAM-SPI 提供认证接口

对应的文件名:pam_xxxx()

PAM认证一般遵循这样的顺序:Service->PAM(配置文件)->pam_*.so,这就是调用机制

使用场景:如如配置用户登录时间、设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟或永久锁定、限制组内的用户可通过ssh连接到本机

配置PAM

ssh 中 使用pam认证

cat /etc/ssh/sshd_config | grep  -w  UsePAM
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
UsePAM yes

PAM的目录:

/lib64/security/pam* 全是pam模块
/etc/security/  pam模块的配置文件
/etc/pam.conf  pam主配置文件,默认不存在(不推荐使用)
/etc/pam.d/   pam子配置文件,推荐使用

cat  /etc/systemd/system.conf  (centos7)

cat /etc/systemd/user.conf

DefaultLimitCORE=infinity
DefaultLimitNOFILE=65535
DefaultLimitNPROC=100000

DefaultLimitNOFILE=65535表示软硬设置一致,或者DefaultLimitNOFILE=65535:100000设置两个值

man systemd

soft and hard limits to the same value, or soft:hard to set both limits individually
(e.g. DefaultLimitAS=4G:16G). Use the string infinity to

CentOS7自带的/etc/security/limits.d/20-nproc.conf文件里面默认设置了非root用户的最大进程数为4096

cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

在limits.conf中设置会被limit.d目录中的配置覆盖了。

cat  /etc/security/limits.d/20-nproc.conf

*          soft    nproc     4096
root       soft    nproc     unlimited

用户打开的进程数

ps h -Led -o user | sort | uniq -c | sort -n
      1 chrony
      1 dbus
      7 polkitd
    120 root

定时监控系统的进程数和线程数

*/2 * * * * echo "$(date "+%F %T") Processes: $(ps -e --no-headers | wc -l), Threads: $(ps -eLf --no-headers | wc -l)" >> /var/log/process.log

/etc/sysctl.conf

是用来控制linux网络的配置文件,对于依赖网络的程序(如web服务器和cache服务器)非常重要

(这个目录主要是配置一些系统信息,而且它的内容全部是对应于/proc/sys/这个目录的子目录及文件。)

net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.log_martians = 1
net.ipv4.tcp_timestamps = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.ip_forward=1
net.ipv4.conf.all.proxy_arp = 1

kernel.core_uses_pid = 0    可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
kernel.core_pattern = core   该参数就是可以设定core dump文件的文件名及路径,以及可以利用管道将结果输入给管道右边的程序进行处理。
fs.suid_dumpable = 0
fs.file-max=1100000 
fs.nr_open=1100000 // 进程级别也设置成110万,因为要保证比 hard nofile大

net.ipv4.tcp_fin_timeout = 2           #保持在FIN-WAIT-2状态的时间,使系统可以处理更多的连接。此参数值为整数,单位为秒。
net.ipv4.tcp_tw_reuse = 1              #开启重用,允许将TIME_WAIT socket用于新的TCP连接。默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1            #开启TCP连接中TIME_WAIT socket的快速回收。默认值为0,表示关闭。
net.ipv4.tcp_syncookies = 1            #开启SYN cookie,出现SYN等待队列溢出时启用cookie处理,防范少量的SYN攻击。默认为0,表示关闭。
net.ipv4.tcp_keepalive_time = 600      #keepalived启用时TCP发送keepalived消息的拼度。默认位2小时。
net.ipv4.tcp_keepalive_probes = 5      #TCP发送keepalive探测以确定该连接已经断开的次数。根据情形也可以适当地缩短此值。
net.ipv4.tcp_keepalive_intvl = 15      #探测消息发送的频率,乘以tcp_keepalive_probes就得到对于从开始探测以来没有响应的连接杀除的时间。默认值为75秒,也就是没有活动的连接将在大约11分钟以后将被丢弃。对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值。
net.ipv4.ip_local_port_range = 1024 65000 #指定外部连接的端口范围。默认值为32768 61000。
net.ipv4.tcp_max_syn_backlog = 262144  #表示SYN队列的长度,预设为1024,这里设置队列长度为262 144,以容纳更多的等待连接。
net.ipv4.tcp_max_tw_buckets =5000      #系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值将立刻被清楚并输出警告信息。默认值为180000。对于squid来说效果不是很大,但可以控制TIME_WAIT套接字最大值,避免squid服务器被拖死。 
net.ipv4.tcp_syn_retries = 1           #表示在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_synack_retries = 1        #设置内核放弃连接之前发送SYN+ACK包的数量。
net.core.somaxconn = 16384             #定义了系统中每一个端口最大的监听队列的长度, 对于一个经常处理新连接的高负载 web服务环境来说,默认值为128,偏小。
net.core.netdev_max_backlog = 16384    #表示当在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数量。
net.ipv4.tcp_max_orphans = 16384       #表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击。此值不能太小。

注意:

       1、其实每个 '.' 分割的就代表一个目录,例如,fs.file-max也就代表/proc/sys/fs/file-max (系统级别参数):该参数描述了整个系统可以打开的最大文件数量。但是root用户不会受该参数限制(比如:现在整个系统打开的文件描述符数量已达到fs.file-max ,此时root用户仍然可以使用ps、kill等命令或打开其他文件描述符)

那么/proc/sys/是用来做什么的呢?大家都知道/proc是每次系统启动的时候都要重新挂载的,它反映了系统内存里面的一些状态。通过/proc/可以很好的了解到当前系统的一些信息。而/proc/sys/则是这些信息的一小部分而已。

  2、sysctl -p #生效

             -p   从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

             -w   临时改变某个指定参数的值,如

         sysctl -w net.ipv4.ip_forward=1

如果仅仅是想临时改变某个系统参数的值,可以用两种方法来实现,例如想启用IP路由转发功能

    1) #echo 1 > /proc/sys/net/ipv4/ip_forward

    2) #sysctl -w net.ipv4.ip_forward=1

限制参数

我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是:

  • fs.file-max (系统级别参数):该参数描述了整个系统可以打开的最大文件数量。但是root用户不会受该参数限制(比如:现在整个系统打开的文件描述符数量已达到fs.file-max ,此时root用户仍然可以使用ps、kill等命令或打开其他文件描述符)
  • soft nofile(进程级别参数):限制单个进程上可以打开的最大文件数。只能在Linux上配置一次,不能针对不同用户配置不同的值
  • fs.nr_open(进程级别参数):限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值

这三个参数之间还有耦合关系,所以配置值的时候还需要注意以下三点:

  1. 如果想加大soft nofile,那么hard nofile参数值也需要一起调整。如果因为hard nofile参数值设置的低,那么soft nofile参数的值设置的再高也没有用,实际生效的值会按照二者最低的来。

  2. 如果增大了hard nofile,那么fs.nr_open也都需要跟着一起调整(fs.nr_open参数值一定要大于hard nofile参数值)。如果不小心把hard nofile的值设置的比fs.nr_open还大,那么后果比较严重。会导致该用户无法登录,如果设置的是*,那么所有用户都无法登录

  3. 如果加大了fs.nr_open,但是是用的echo "xxx" > ../fs/nr_open命令来修改的fs.nr_open的值,那么刚改完可能不会有问题,但是只要机器一重启,那么之前通过echo命令设置的fs.nr_open值便会失效,用户还是无法登录。所以非常不建议使用echo的方式修改内核参数!!!

查看帮助  man 5 proc

/proc/sys/fs/file-max

/proc/sys/fs/nr_open

4、centos 7 系统从/usr/lib/sysctl.d/*.conf 和 /etc/sysctl.d/*.conf 加载应用系统配置,加载顺序根据*.conf的文件名确定

手动加载所有的配置文件,执行:

# sysctl --system

单独指定配置文件加载,执行:

# sysctl -p filename.conf

也可以直接通过sysctl工具配置值,执行:

# sysctl kernel.sysrq=1   (效果等同:# echo "1" > /proc/sys/kernel/sysrq)

5、coredump文件抓取设置

ulimit -c unlimited
echo 1 > /proc/sys/kernel/core_uses_pid
echo "/tmp/core-%e-%s-%u-%g-%p-%t" > /proc/sys/kernel/core_pattern
echo 2 > /proc/sys/fs/suid_dumpable

6、在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制。

主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。

  在CentOS 5/6等版本中,资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。

当然,/etc/security/limits.d/ 中可以配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。

  不过,在CentOS 7/RHEL 7的系统中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf 文件的配置作用域缩小了一些。

limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。登录用户的限制,与上面讲的一样,通过/etc/security/limits.conf和 limits.d来配

置即可。

SysV init  和Systemd启动方式的对比自行百度

  PAM模块全称是Pluggable Authentication Module for linux(可插入式授权管理模块),该由Sun公司提供,在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。PAM应用在许多程序与服务上,比如登录程序(login、su)的PAM身份验证(口令认证、限制登录),passwd强制密码,用户进程实时管理,向用户分配系统资源等

对于systemd service的资源限制,如何配置呢?

全局的配置,放在文件/etc/systemd/system.conf/etc/systemd/user.conf

同时,也会加载两个对应的目录中的所有.conf文件/etc/systemd/system.conf.d/*.conf/etc/systemd/user.conf.d/*.conf

其中,system.conf是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。

systemd.conf.d/*.conf中配置会覆盖system.conf。

DefaultLimitCORE=infinity
DefaultLimitNOFILE=100000
DefaultLimitNPROC=100000

注意:修改了system.conf后,需要重启系统才会生效。

针对单个Service,也可以设置,以nginx为例。

编辑/usr/lib/systemd/system/nginx.service文件,或者/usr/lib/systemd/system/nginx.service.d/my-limit.conf文件,做如下配置:

[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

然后运行如下命令,才能生效。

sudo systemctl daemon-reload
sudo systemctl restart nginx.service

查看一个进程的limit设置:

cat /proc/PID/limits

$ cat /proc/$(cat /var/run/nginx.pid)/limits

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        unlimited            unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             100000               100000               processes
Max open files            100000               100000               files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       1030606              1030606              signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

7、针对单个进程设置资源限制

prlimit 这个命令用来设置或者获取某进程的资源限制数.

如临时设置某进程可打开的文件数,
prlimit --pid=9999 --nofile=102400:102400, 这条命令表示设置pid为9999的进程的可打开的文件最大数为102400(soft & hard)

8、设置系统开机自动加载模块

配置启动时加载哪些内核模块,一般位于/etc/modules-load.d/

 如

 cat /etc/modules-load.d/virtualbox.conf
vboxdrv
vboxnetflt
vboxnetadp
vboxpci

三、文件描述符和文件句柄

文件描述符(File Descriptor)和文件句柄(File Handle)是计算机系统中用于表示和操作文件的抽象概念。

1、文件描述符

文件描述符是一个非负整数,用于唯一标识一个打开的文件。它是操作系统内部维护的一个索引,用于跟踪和管理打开的文件。在UNIX和类UNIX系统中,文件描述符是一个索引,指向进程的文件描述符表中的一个条目,该表维护了进程打开的文件的状态信息。 

查看文件描述符

方式1:53430为一个具体的进程号

ls -l /proc/53430/fd
total 0
lrwx------ 1 root root 64 Jun 20 09:08 0 -> /dev/null
lrwx------ 1 root root 64 Jun 20 09:08 1 -> /dev/null
lrwx------ 1 root root 64 Jun 20 09:08 10 -> 'socket:[323067]'
lrwx------ 1 root root 64 Jun 20 09:08 11 -> 'socket:[323068]'
lrwx------ 1 root root 64 Jun 20 09:08 12 -> 'socket:[323069]'
lrwx------ 1 root root 64 Jun 20 09:08 13 -> 'socket:[323070]'
lrwx------ 1 root root 64 Jun 20 09:08 14 -> 'socket:[323071]'
l-wx------ 1 root root 64 Jun 20 09:08 2 -> /var/log/nginx/error.log
lrwx------ 1 root root 64 Jun 20 09:08 3 -> 'socket:[323064]'
l-wx------ 1 root root 64 Jun 20 09:08 4 -> /var/log/nginx/access.log
l-wx------ 1 root root 64 Jun 20 09:08 5 -> /var/log/nginx/error.log
lrwx------ 1 root root 64 Jun 20 09:08 6 -> 'socket:[322345]'
lrwx------ 1 root root 64 Jun 20 09:08 7 -> 'socket:[322346]'
lrwx------ 1 root root 64 Jun 20 09:08 8 -> 'socket:[323065]'
lrwx------ 1 root root 64 Jun 20 09:08 9 -> 'socket:[323066]'

查看占用文件描述符较多的前10

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

查看某个进程打开的文件描述符数量

# lsof -p 2486 |wc -l  (nginx master进程)
59

2、文件句柄

文件句柄是在高级编程语言或操作系统中用于表示文件对象的抽象概念。它是对文件描述符的封装,提供了更高层次的接口和功能。文件句柄通常是一个指向文件对象的指针或引用,它包含了文件描述符以及与该文件相关的其他元数据和状态信息。

文件句柄是一种数据结构,它包含了文件描述符以及其他用于文件访问的信息,比如文件打开方式、文件读写位置等。在Windows系统中,文件句柄被用来标识打开的文件,通过文件句柄可以对文件进行读写操作。 

查看文件句柄(能够查看的信息更多)

root@arm:~# lsof -p 53430
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
nginx   53430 root  cwd    DIR              253,0     4096       2 /
nginx   53430 root  rtd    DIR              253,0     4096       2 /
nginx   53430 root  txt    REG              253,0  1170280  789213 /usr/sbin/nginx
nginx   53430 root  mem    REG              253,0   167216 1195204 /usr/lib/nginx/modules/ngx_stream_module.so
nginx   53430 root  mem    REG              253,0    99000 1195195 /usr/lib/nginx/modules/ngx_mail_module.so
nginx   53430 root  DEL    REG                0,1           322347 /dev/zero
nginx   53430 root    0u   CHR                1,3      0t0       6 /dev/null
nginx   53430 root    1u   CHR                1,3      0t0       6 /dev/null
nginx   53430 root    2w   REG              253,0        0 1183850 /var/log/nginx/error.log
nginx   53430 root    3u  unix 0xffff0000b31eec00      0t0  323064 type=STREAM
nginx   53430 root    4w   REG              253,0        0 1183848 /var/log/nginx/access.log
nginx   53430 root    5w   REG              253,0        0 1183850 /var/log/nginx/error.log
nginx   53430 root    6u  IPv4             322345      0t0     TCP *:http (LISTEN)
nginx   53430 root    7u  IPv6             322346      0t0     TCP *:http (LISTEN)
nginx   53430 root    8u  unix 0xffff0000b31ef400      0t0  323065 type=STREAM
nginx   53430 root    9u  unix 0xffff0000b31efc00      0t0  323066 type=STREAM

注意

  • COMMAND:进程的名称
  • PID:进程标识符
  • USER:进程所有者
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
  • TYPE:文件类型,如DIR、REG等
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

3、两者的关系

文件描述符是操作系统内部用于管理文件的标识符,而文件句柄是编程语言或操作系统提供的一种抽象层,用于简化对文件的操作。

文件句柄隐藏了底层的文件描述符,提供了更高级别的接口,使得程序员可以更方便地进行文件操作,而无需直接处理文件描述符。

 

 

 

 

 第9章.设置文件句柄红帽企业版 Linux 5 |红帽客户门户 (redhat.com)

系统文件数限制_开开心心每一天的技术博客_51CTO博客

https://blog.csdn.net/xinmeiwan/article/details/52934943  Core Dump详解

https://mp.weixin.qq.com/s/1xRc4DzyG4c8e2XYGk28Vg

https://www.cnblogs.com/xiaodoujiaohome/p/6222895.html    Core文件作用、设置及用法

posted @ 2020-09-24 21:04  凡人半睁眼  阅读(685)  评论(0编辑  收藏  举报