⑴ Too many open files的四種解決辦法
一 單個進程打開文件句柄數過多
二 操作系統打開的文件句柄數過多
三 systemd對該進程進行了限制
四 inotify達到上限.
ulimit中的nofile表示單進程可以打開的最大文件句柄數,可以通過ulimit -a查看,子進程默認繼承父進程的限制(注意,是繼承,不是共享,子進程和父進程打開的文件句柄數是單獨算的)。
網上還有一種解讀是nofile表示單用戶可以打開的文件句柄數,因為他們在limit.conf中看到類似於「openstack soft nofile 65536」,便認為是openstack用戶最多可以打開的文件句柄數。該解讀是錯誤的,「openstack soft nofile 65536」表示的含義是當你執行"su - openstack"切換到openstack用戶後,你創建的所有進程最大可以打開的文件句柄數是65536。
要查看一個進程可以打開的文件句柄數,可以通過「cat /proc/<pid>/limits」查看。
要修改ulimit中的nofile,可以通過修改/etc/security/limits.conf文件,在其中加入類似「openstack soft nofile 65536」的語句來進行修改。修改完成後,可以通過「su - openstack」切換用戶,或者重新登錄,來使該配置生效。
要動態修改一個進程的限制,可以使用prlimit命令,具體用法為:「prlimit --pid ${pid} --nofile=102400:102400」。
整個操作系統可以打開的文件句柄數是有限的,受內核參數「fs.file-max」影響。
可以通過執行「echo 100000000 > /proc/sys/fs/file-max」命令來動態修改該值,也可以通過修改"/etc/sysctl.conf"文件來永久修改該值。
該場景僅針對被systemd管理的進程(也就是可以通過systemctl來控制的進程)生效,可以通過修改該進程的service文件(通常在/etc/systemd/system/目錄下),在「[Service]」下面添加「LimitNOFILE=20480000」來實現,修改完成之後需要執行"systemctl daemon-reload"來使該配置生效。
inotify是linux提供的一種監控機制,可以監控文件系統的變化。該機制受到2個內核參數的影響:「fs.inotify.max_user_instances」和「fs.inotify.max_user_watches」,其中「fs.inotify.max_user_instances」表示每個用戶最多可以創建的inotify instances數量上限,「fs.inotify.max_user_watches」表示么個用戶同時可以添加的watch數目,當出現too many open files問題而上面三種方法都無法解決時,可以嘗試通過修改這2個內核參數來生效。修改方法是修改"/etc/sysctl.conf"文件,並執行"sysctl -p"。
原文地址: https://www.cnblogs.com/huaweicloud/p/11861475.html
⑵ Linux怎麼修改文件打開數
limits.conf 文件實際是 Linux PAM(插入式認證模塊,Pluggable Authentication Moles)中 pam_limits.so 的配置文件,而且只針對於單個會話。
limits.conf的格式如下:
username|@groupname type resource limit
username|@groupname:設置需要被限制的用戶名,組名前面加@和用戶名區別。也可以用通配符*來做所有用戶的限制。
type:有 soft,hard 和 -,soft 指的是當前系統生效的設置值。hard 表明系統中所能設定的最大值。soft 的限制不能比har 限制高。用 - 就表明同時設置了 soft 和 hard 的值。
resource:
core - 限制內核文件的大小
date - 最大數據大小
fsize - 最大文件大小
memlock - 最大鎖定內存地址空間
nofile - 打開文件的最大數目
rss - 最大持久設置大小
stack - 最大棧大小
cpu - 以分鍾為單位的最多 CPU 時間
noproc - 進程的最大數目
as - 地址空間限制
maxlogins - 此用戶允許登錄的最大數目
要使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啟動文件中。查看 /etc/pam.d/login 文件中有:
session required /lib/security/pam_limits.so
例如:修改文件描述符大小(65536)
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
在線:
# ulimit -n 65535
# ulimit -n
65535
# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3806
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) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 3806
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
⑶ linux如何設置用戶打開的文件數
具體操作,需要修改兩處,並且需重新啟動Linux伺服器。
首先SSH登錄伺服器,執行ulimit -a查看當前限制。這一步是可選,主要是看下限制,心裡有數。
第一處修改:
vim /etc/security/limits.conf
在文件尾部增加:
* soft nofile 65535
* hard nofile 65535
第二處修改
vim /etc/profile
在文件尾部增加:
ulimit -S 65535
ulimit -H 65535
ulimit -n 65535
ulimit -f 6553500
保存修改後,重啟Linux伺服器。重啟完畢後,SSH登入伺服器,執行ulimit -a查看系統限制。
補充:ulimit命令的參數詳細介紹
-H 設置硬資源限制.
-S 設置軟資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
-u <程序數目> 用戶最多可開啟的程序數目
⑷ Linux下如何查看進程打開的文件以及修改進程打開文件數上限
1. 查看進程打開文件 在/proc下,對應每個進程有一個以進程號命名的目錄,該目錄下有一個fd目錄,該目錄下面的每個文件是一個符號連接,其文件名對應該進程佔用的一個文件描述符,而連接指向的內容表示文件描述符對應的實際文件。 2. 修改進程打開文件數上限Linux默認的進程打開文件上限是1024個,可以通過ulimit 把所有用戶的進程打開文件上限改為65536,可以加入下面兩行 * soft nofile 65535 還可以只真對某個用戶或某個組做修改,具體方法參見文件注釋。修改後需要重新啟動系統才能生效。
⑸ linux 一個進程最多打開多少個文件
1、在linux系統中,理論上一個進程可以打開的文件數可以通過如下命令查找到。在終端執行:ulimit -a命令,找到open files一行即可。
2、這個值只是一個理論值,隨著你的系統硬體資源而變化,如果配置低,可能遠達不到這個值,如果系統配置很高級,也可以設置增加這個值。
⑹ linux系統打開文件數過大會產生什麼問題
在Linux下,我們使用ulimit-n命令可以看到單個進程能夠打開的最大文件句柄數量(socket連接也算在裡面)。系統默認值1024。對於一般的應用來說(象Apache、系統進程)1024完全足夠使用。但是如何象squid、mysql、java等單進程處理大量請求的應用來說就有點捉襟見肘了。如果單個進程打開的文件句柄數量超過了系統定義的值,就會提到「toomanyfilesopen」的錯誤提示。如何知道當前進程打開了多少個文件句柄呢?下面一段小腳本可以幫你查看:lsof-n|awk'{print$2}'|sort|uniq-c|sort-nr|more在系統訪問高峰時間以root用戶執行上面的腳本,可能出現的結果如下:#lsof-n|awk'{print$2}'|sort|uniq-c|sort-nr|其中第一行是打開的文件句柄數量,第二行是進程號。得到進程號後,我們可以通過ps命令得到進程的詳細內容。ps-aef|grep24204mysql24204241629916:15?00:24:25/usr/sbin/mysqld哦,原來是mysql進程打開最多文件句柄數量。但是他目前只打開了131個文件句柄數量,遠遠底於系統默認值1024。但是如果系統並發特別大,尤其是squid伺服器,很有可能會超過1024。這時候就必須要調整系統參數,以適應應用變化。Linux有硬性限制和軟性限制。可以通過ulimit來設定這兩個參數。方法如下,以root用戶運行以下命令:ulimit-HSn4096以上命令中,H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的打開文件句柄數量。個人覺得最好不要超過4096,畢竟打開的文件句柄數越多響應時間肯定會越慢。設定句柄數量後,系統重啟後,又會恢復默認值。如果想永久保存下來,可以修改.bash_profile文件,可以修改/etc/profile把上面命令加到最後。
⑺ 在linux中如果用ls查看文件,如果目錄或文件太多,只顯示幾十行,怎麼辦
在linux中如果用ls查看文件,如果目錄或文件太多,需要只顯示幾十行,可以使用ls | head 命令。
ls | head 命令默認只顯示ls出來數據的前十個,如果要顯示更多的數據,可以在ls | head 後面加上 -n [number]來控制顯示的數據量。例如:
要顯示ls出來的前20行數據,使用ls | head -n 20 即可。
(7)linux打開文件過多擴展閱讀
linux下head命令介紹:
1、head命令可以取出文件的前面幾行,語法為:
head [-n number] 文件
2、參數和示例:
-n :後面接數字,代表顯示幾行的意思例如:
head /var/access.log
默認的情況中,head命令只顯示前面 10 行,若要顯示前 30 行,可以這樣使用:
head -n 30 /var/access.log