1. 程式人生 > >解決生產環境too man open files的問題

解決生產環境too man open files的問題

最大文件打開數

一、問題發現

剛剛上線的項目,前端使用的LVS+Haproxy做的負載均衡,支持高並發訪問量,但是支撐一段時間後總是出問題,查看日誌,發現有如下Too many open files的問題。

May 12, 2017 12:49:20 AM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
        at java.net.ServerSocket.implAccept(ServerSocket.java:530)
        at java.net.ServerSocket.accept(ServerSocket.java:498)
        at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
        at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:222)
        at java.lang.Thread.run(Thread.java:745)

二、最大文件打開數描述

1、首先普及幾個知識

  • Linux下一切都是文件,包括輸入輸出設備、網絡連接、socket、管道等;

  • 與文件打開數最相關的是文件描述符(有的人喜歡稱作文件標識符,英文為file descriptor),文件打開數的實質就是文件描述符的數量;

  • 文件打開數的多少取決於系統種類、內存大小,int(語言關鍵字,如C99的int)長度(非負整數),以及系統管理員的設定;

  • 最大文件打開數是針對一個進程而言,即一個進程能打開的文件句柄數目是有限的,不能超過最大文件打開數;

  • ulimit 命令只對當前shell有效,因此在編寫Shell腳本時,如果需要並能控制文件最大打開數,則先執行“ulimit -n 文件打開數”命令,在去執行下面的內容;

  • 在Linux中被打開的文件描述符存放在/proc/PID/fd/,其中PID就是process identifier。

除了需要註意,還需要註意ulimit -v unlimited,最大可用的虛擬內存(The maximum amount of virtual memory available to the shell and, on some systems, to its children)

2、最大文件打開數的全局設置

在CentOS和Ubuntu中ulimit是一個bash裏面的內置命令,就像if、shift一樣,並不是一個單獨的命令,因此在Ubuntu中通常會遇到有人使用sudo ulimit -n 65535命令時遇到找不到這個命令的提示(也許是sudo的bug),

ulimit提供shell或者進程可用資源的控制,這些可用資源包括但不限於最大文件打開數、最大可用虛擬內存、最大進程數量、socket buffer等,它有兩種限制等級hard和soft,分別對應的參數開關是-H和-S,hard限制使得非root用戶不得增加(超過)設定的值,soft限制允許非root用戶增加到hard的限制值,通常一般會將hard值和soft值設置成一個相同的值,命令是ulimit -HSn 65535。

ulimit只對當前shell有效,要想在任何地方生效,除了先執行ulimit命令以外就是更改配置文件,也就是更改最大文件打開數的全局設置,方法是編輯/etc/security/limits.conf文件,添加以下兩行,重新登錄系統生效。

*  hard  nofile  65535
*  soft  nofile  65535

其中,“*”表示所有用戶都生效,重啟後,在任何地方執行ulimit -n就會顯示65535。

3、一些與文件打開數相關的命令以及其他相關命令

  1. 查看當前系統的文件打開總數(Maximum number of opened files):cat /proc/sys/fs/file-max

  2. 查看當前進程的文件打開數:lsof -p 16075 | wc –l

  3. 查看當前端口的文件打開數:lsof -i:80 | wc -l

  4. 在使用lsof之前需要註意,lsof不適合查看一個連接數很高或者數量動態變化過快的進程或端口

  5. 查看某個進程使用的文件:lsof -p 16075

  6. 查看某個端口使用的文件:lsof -i:80

  7. 查看使用某個文件的用戶和程序:fuser -v /bin/bash

三、註意事項

1、使用ulimit -n 65535可以立刻生效,但是重新登錄之後會恢復成系統初始設置1024。

2、也可以在/etc/profile的最後配置ulimit -n 65535,使其生效。


本文出自 “運維點滴記錄” 博客,請務必保留此出處http://wzlinux.blog.51cto.com/8021085/1925366

解決生產環境too man open files的問題