
我正在使用 Java 中的 Vert.x 開發伺服器,並且在運行 Ubuntu 12.04 的專用伺服器上運行時我注意到一些效能問題。
伺服器接收傳入的 HTTP 請求,使用 HMAC 進行一些身份驗證,解析請求正文,進行一些文字處理,然後透過 UDP 將資料傳送到不同的伺服器。沒有磁碟 I/O,並且只有相對少量的記憶體使用(遠不及交換)。我正在使用 Grinder 和 AWS 實例對伺服器進行負載測試,但即使使用裝備良好的伺服器,我每秒也無法獲得超過 10k 的請求。
我看到的是,伺服器電腦上的一個核心完全固定,主要在核心中,而其他核心的使用率僅為 20-25%。我的假設是 CPU 用來接收傳入的 TCP 連線。 JMX 報告我的大部分時間都在io.netty.channel.nio.NioEventLoop.select() 中,我假設它計算了等待內核的時間,而strace 顯示了在futex() 和epoll_wait() 上花費的大量時間。我嘗試過使用核心設定來增加伺服器的吞吐量,但我沒有任何運氣。
分析器運作:
原始網址:https://i.stack.imgur.com/6wIZA.png
CPU使用率:
原始網址:https://i.stack.imgur.com/9mM5u.png
我想知道可以在核心層級調整什麼來幫助解決這個問題。我嘗試過調整 TCP 緩衝區大小、增加文件句柄、關閉 TCP 功能等,但無濟於事。這個伺服器作業系統實際上在 Xen 上運行,它是「專用」的,因為它是唯一的駐留作業系統。
答案1
我會仔細檢查您的應用程式及其正在使用的程式庫。就 Linux 核心而言,JVM 執行緒是作為 Linux 上的本機執行緒(輕量級進程)實現的,至少在 Sun/Oracle JVM 實作中是如此。
JVM 是一個具有多個執行緒的單一進程。它啟動的每個執行緒都可以在任何可用的核心上運行。 Linux 中的單一行程可以有多個執行緒。
您可能還想看看這些資源: