簡體   English   中英

Jetty IOException:打開的文件太多

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM