31.提示錯誤fopen_means Too many open files
阿新 • • 發佈:2020-12-28
技術標籤:linux
一:列印提示fopen 出錯:
open_file_and_get_length:175 fopen /var/1608536431170.jpg errno = 24, means: Too many open files
二:原因:
1.Too many open files從字面意思來看,就是程式開啟的檔案數過多,
不過這裡的files不單是檔案的意思,也包括開啟的通訊連線(如socket),正在監聽的埠等等;
這個錯誤通常是開啟的檔案超過了系統限制。
因為linux系統提供的檔案描述符最多隻有1024個,如下:
[email protected]:# ulimit - a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files ( -n) 1024 //最大打開個數1024(包含socket的檔案描述符)
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory ( kbytes, -v) unlimited
file locks (-x) unlimited
三:解決:
1.如系統確實需要更多的檔案描述符,可使用命令修改:ulimit -n 2048
但是這種方式修改重啟後還是會恢復預設值。
[email protected]:# ulimit -n 2048
[email protected]:# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 2048 //修改成功:
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 2048
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[email protected]:/mnt/yanghang/testdir/SourceInsight7/MainCode_371/MainCode/build#
2.將允許開啟數寫入到配置檔案;
vim /etc/security/limits.conf
#在最後加入, *號表示所有使用者:
* soft nofile 2048
* hard nofile 2048
3.檢視某一程序佔用檔案描述符的個數:
[email protected]:~$ ps
PID TTY TIME CMD
2580 pts/7 00:00:00 bash
2652 pts/7 00:00:00 ps
[email protected]:~$ lsof -p 2580 | wc -l
18
4.寫入日誌,分析這被開啟的18個檔案描述符:
[email protected]:~$ lsof -p 2580 > /mnt/hgfs/share/test/6/openfiles.log
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2580 aston cwd DIR 8,1 4096 675479 /home/aston
bash 2580 aston rtd DIR 8,1 4096 2 /
bash 2580 aston txt REG 8,1 986672 131079 /bin/bash
bash 2580 aston mem REG 8,1 46812 918593 /lib/i386-linux-gnu/libnss_files-2.19.so
bash 2580 aston mem REG 8,1 92036 918587 /lib/i386-linux-gnu/libnsl-2.19.so
bash 2580 aston mem REG 8,1 11688000 403327 /usr/lib/locale/locale-archive
bash 2580 aston mem REG 8,1 1758972 918518 /lib/i386-linux-gnu/libc-2.19.so
bash 2580 aston mem REG 8,1 13856 918535 /lib/i386-linux-gnu/libdl-2.19.so
bash 2580 aston mem REG 8,1 133164 918664 /lib/i386-linux-gnu/libtinfo.so.5.9
bash 2580 aston mem REG 8,1 26256 400379 /usr/lib/i386-linux-gnu/gconv/gconv-modules.cache
bash 2580 aston mem REG 8,1 42668 918603 /lib/i386-linux-gnu/libnss_nis-2.19.so
bash 2580 aston mem REG 8,1 30560 918589 /lib/i386-linux-gnu/libnss_compat-2.19.so
bash 2580 aston mem REG 8,1 134380 918494 /lib/i386-linux-gnu/ld-2.19.so
bash 2580 aston 0u CHR 136,7 0t0 10 /dev/pts/7
bash 2580 aston 1u CHR 136,7 0t0 10 /dev/pts/7
bash 2580 aston 2u CHR 136,7 0t0 10 /dev/pts/7
bash 2580 aston 255u CHR 136,7 0t0 10 /dev/pts/7
四:是否是程式問題:
1.如果對程式有足夠的瞭解的話,那麼對程式開啟的檔案描述符上限一定有一定的預估,
如果感覺該數字異常,就需要進一步檢視:
lsof -p 程序id > openfiles.log
獲得當前佔用檔案描述符的全部詳情進行分析;
*開啟的這些檔案是不是都是必要的;
*定位到開啟這些檔案的程式碼;
*是否程式操作了檔案寫入,但是沒有進行正常的關閉;
*是否程式進行了socket等通訊,但是沒有正常關閉(也就是沒有超時結束的機制);
如果存在這些問題,無論系統的檔案描述符設定多大,隨著時間的推移,也一定會用完。