[英]Jetty IOException: Too many open files
我在網站上運行 Jetty,每秒處理大約 100 個請求,前面是 nginx。 我剛剛在日志中注意到,在部署並啟動 Jetty 幾分鍾后,有一段時間它在發送垃圾郵件:
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:163)
at org.mortbay.jetty.nio.SelectChannelConnector$1.acceptChannel(SelectChannelConnector.java:75)
at org.mortbay.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:673)
at org.mortbay.io.nio.SelectorManager.doSelect(SelectorManager.java:192)
at org.mortbay.jetty.nio.SelectChannelConnector.accept(SelectChannelConnector.java:124)
at org.mortbay.jetty.AbstractConnector$Acceptor.run(AbstractConnector.java:708)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
一兩分鍾。 我做了一個“lsof -u jetty”並看到了數百行:
java 15892 jetty 1020u IPv6 298105434 0t0 TCP 192.168.1.100:http-alt->192.168.1.100:60839 (ESTABLISHED)
java 15892 jetty 1021u IPv6 298105438 0t0 TCP 192.168.1.100:http-alt->192.168.1.100:60841 (ESTABLISHED)
java 15892 jetty 1022u IPv6 298105441 0t0 TCP 192.168.1.100:http-alt->192.168.1.100:60842 (ESTABLISHED)
java 15892 jetty 1023u IPv6 298105443 0t0 TCP 192.168.1.100:http-alt->192.168.1.100:60843 (ESTABLISHED)
其中 192.168.1.100 是服務器內部 IP。
如您所見,這使打開文件的數量達到默認最大值 1024。我可以增加它,但我想知道為什么首先會發生這種情況? 是在Jetty的nio socket acceptor里面,請問這是連接請求風暴造成的嗎?
雖然 Jetty 中可能存在錯誤,但我認為更可能的解釋是您打開的文件 ulimits 太低了。 通常,1024 默認值對於中等使用的 web 服務器來說根本不夠用。
對此進行測試的一個好方法是使用 apache 工作台來模擬您看到的入站流量。 在遠程主機上運行它會生成 1000 個請求,每個請求超過 10 個並發連接。
ab -c 10 -n 1000 [http://]hostname[:port]/path
現在使用 .netstat 計算 web 服務器上的 sockets...
netstat -a | grep -c 192.168.1.100
希望您會發現您的 sockets 將穩定在某個不會顯着大於 1024 的值(我的是 16384)。
要確保的另一件好事是連接在您的業務邏輯中正確關閉。
netstat -a | grep -c CLOSE_WAIT
如果您看到此數字在應用程序的整個生命周期內持續增長,則您可能錯過了幾次對 Connection.close() 的調用。
我通過將 Spring 引導升級到最新的 2.4.1 解決了由於 Spring 引導應用程序(版本 2.2.8 或 2.3.1)中的錯誤引起的類似問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.