容器內獲取 CPU 核數問題


現在越來越多的公司將服務通過容器來部署,但這里其實對Java的應用有一個坑。很多超時敏感的應用其實對GC的要求還是比較高的,減少GC的時間變得很重要,比如你可以根據當前機器的CPU核數得到一個較好的並發GC線程數 -XX:ParallelGCThreads,從而減少STW的時長。

但在早期的JDK版本中,比如我們使用的Jdk1.8u102,當你使用Java的Runtime獲取CPU數量時,在容器里面會返回容器所在宿主機的核數,而不是容器自身的:

int cores = Runtime.getRuntime().availableProcessors();

這其實是JDK的一個問題,已經trace在JDK-8140793,原因是獲取CPU核數是通過讀取兩個環境變量,其中

ENV Description
_SC_NPROCESSORS_CONF number of processors configured
_SC_NPROCESSORS_ONLN The number of processors currently online (available)

其中_SC_NPROCESSORS_CONF 就是我們需要容器真實的CPU數量。
在這里插入圖片描述
獲取CPU數量的源碼

怎么解決

第一種辦法是使用新版本的Jdku131以上的版本1

另外一個辦法是使用自編譯上面的源代碼,通過LD_PRLOAD的方式將修改后的so文件加載進去Mock掉CPU的核數

Java SE support for Docker CPU and memory limits


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM