liunx系统的文件描述符 及相关的一些问题

本文探讨了Linux系统中文件描述符的概念及其资源限制,包括系统级和用户级的最大打开文件数限制。介绍了如何使用ulimit命令查看和设置文件描述符上限,以及如何检查进程的文件描述符使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/cywosp/article/details/38965239

文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。文件描述符与包括相关信息(如文件的打开模式、文件的位置类型、文件的初始类型等)的文件对象相关联,这些信息被称作文件的上下文。
【程序设计上的句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。】
文件描述符作为系统的一个重要资源,虽然说系统内存有多少就可以打开多少的文件描述符,但是在实际实现过程中内核是会做相应的处理的,一般最大打开文件数会是系统内存的10%(以KB来计算)(称之为系统级限制)。

内核为了不让某一个进程消耗掉所有的文件资源,其也会对单个进程最大打开文件数做默认值处理(称之为用户级限制),默认值一般是1024,使用ulimit -n命令可以查看。
【实际问题:如果当前系统[Liux]已经达到了文件描述符的最大使用量,可以使用cd等linux命令,但无法使用 ps 以及 ll 等命令时:可以使用 ulimit -u 2000 来临时扩大描述符的上线,然后kill掉一些问题进程[指占据大量文件描述符的进程],然后关闭重新登录,文件描述符的最大使用量和改变之前一样,如果想永久的更改,需要在配置文件中定义。】
1、使用ulimit -a 查看linux打开文件的限制,
ulimit -a
系统属性名                标识符        数量设置
core file size          (blocks, -c) 65535
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 257133
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 81920
real-time priority              (-r) 0
stack size              (kbytes, -s) 1024
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
查看open files对应的数量默认(10240),这个可以通过命令 ulimit -n 40960[设置最大打开值] 设置。
【通过这种方法可以短时间内解决大部分因文件描述符引起的Too many open files 问题,但并非根本方法。究其根本原因是在程序运行过程中大量使用文件句柄后未及时关闭,释放Socket,而导致的后面的操作无句柄可用。】
2、查看进程的最大文件描述符
使用ps -ef |grep java 查看java的相关进程,可以确定进程号。
命令:cat /proc/[进程号]/limists |grep “Max open files”查看修改是否生效。

查看指定进程中打开的文件数:lsof -p PID |wc -l
查看指定进程打开了多少句柄数: lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more | grep PID

显示目前在Linux系统上的文件系统的磁盘使用情况统计:df [option] ...[FILE]...
    fILE -a, --all 包含所有的具有 0 Blocks 的文件系统
    fILE --block-size={SIZE} 使用 {SIZE} 大小的 Blocks
    fILE -h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...)
    fILE -H, --si 很像 -h, 但是用 1000 为单位而不是用 1024
    fILE -i, --inodes 列出 inode 资讯,不列出已使用 block
    fILE -k, --kilobytes 就像是 --block-size=1024
    fILE -l, --local 限制列出的文件结构
    fILE -m, --megabytes 就像 --block-size=1048576
    fILE --no-sync 取得资讯前不 sync (预设值)
    fILE -P, --portability 使用 POSIX 输出格式
    fILE --sync 在取得资讯前 sync
    fILE -t, --type=TYPE 限制列出文件系统的 TYPE
    fILE -T, --print-type 显示文件系统的形式
    fILE -x, --exclude-type=TYPE 限制列出文件系统不要显示 TYPE
    fILE -v (忽略)
    fILE --help 显示这个帮手并且离开
    fILE --version 输出版本资讯并且离开
    
df -h:
Filesystem     1K-blocks    Used     Available Use% Mounted on
/dev/sda6       29640780 4320704     23814388  16%     /
udev             1536756       4     1536752    1%     /dev
tmpfs             617620     888     616732     1%     /run
none                5120       0     5120       0%     /run/lock
none             1544044     156     1543888    1%     /run/shm
可以看到输出显示的数字形式的'G'(千兆字节),"M"(兆字节)和"K"(千字节)。
第一列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。
使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。

du -sh *查看当前目录下各个文件及目录占用空间大小

还有top命令是用来浏览查看系统内存及进程的情况
这个blog介绍的很详细:https://www.cnblogs.com/zhoug2020/p/6336453.html

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值