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