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_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 #生效
-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(进程级别参数):限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值
这三个参数之间还有耦合关系,所以配置值的时候还需要注意以下三点:
-
如果想加大soft nofile,那么hard nofile参数值也需要一起调整。如果因为hard nofile参数值设置的低,那么soft nofile参数的值设置的再高也没有用,实际生效的值会按照二者最低的来。
-
如果增大了hard nofile,那么fs.nr_open也都需要跟着一起调整(fs.nr_open参数值一定要大于hard nofile参数值)。如果不小心把hard nofile的值设置的比fs.nr_open还大,那么后果比较严重。会导致该用户无法登录,如果设置的是*,那么所有用户都无法登录
-
如果加大了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)
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)
https://blog.csdn.net/xinmeiwan/article/details/52934943 Core Dump详解
https://mp.weixin.qq.com/s/1xRc4DzyG4c8e2XYGk28Vg