亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

運行時.getRuntime().可用處理器() 返回 1,即使 ECS AWS 上有許多內核可用

運行時.getRuntime().可用處理器() 返回 1,即使 ECS AWS 上有許多內核可用

瀟湘沐 2022-09-28 09:54:11
我正在 AWS 的 ECS 上通過 Docker 運行一個任務。該任務執行一些受 CPU 限制的計算,我想并行運行這些計算。我使用指定的線程數啟動一個線程池,該線程池在我的PC上本地工作正常。出于某種原因,在 AWS ECS 上,即使有多個內核可用,也始終返回 1。因此,我的計算按順序運行,不使用多核。Runtime.getRuntime().availableProcessors()例如,現在,我有一個任務在“t3.medium”實例上運行,根據文檔,該實例應該有2個內核。當我執行以下代碼時:System.out.println("Java reports " +      Runtime.getRuntime().availableProcessors() + " cores");然后,日志上將顯示以下內容:Java reports 1 cores我沒有在 ECS 的任務定義中指定參數。我看到在 ECS 管理控制臺的任務列表中,它有一列“CPU”,我的任務顯示為 0。我還注意到,在實例列表(= VM)中,它將“CPU可用”列為2048,這可能與VM具有2個內核的事實有關。cpu我希望我的 Java 程序能夠查看 VM 必須提供的所有內核。(通常情況下,當Java程序在沒有Docker的計算機上運行時的情況是這樣的)。我該怎么做?
查看完整描述

1 回答

?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

如果您啟動大量線程,它們絕對會被調度到多個內核。這個答案只是關于返回正確的值。許多“線程池”啟動的線程數與該方法返回的線程數一樣多:它應該返回可用的內核數。Runtime.getRuntime().availableProcessors()

似乎有兩個主要的解決方案,兩者都不是理想的:

  • 在任務定義中設置參數。例如,如果您有 2 個內核,并且想要同時使用它們,則必須在任務的定義中進行設置。這不是很方便,原因有兩個:cpu"cpu":2048

    • 如果選擇更大的實例,則必須確保更新此參數。

    • 如果您希望同時運行兩個任務,這兩個任務都可以偶爾使用所有核心進行短期活動,AWS 不會在具有 的 2 核系統上安排兩個任務。它說從CPU的角度來看,VM是“滿”的。這違背了分時(Unix等)的理念,即每個任務都采用它需要的東西(例如,想象一下,在臺式PC上,如果你在雙核計算機上運行Word和Excel,而Windows不允許你啟動任何其他任務,理由是Word可能需要所有一個核心,而Excel也可能這樣做, 因此,如果另一個程序可能同時需要所有內核,則沒有足夠的內核。"cpu":2048

  • 在 JDK 10 及更高版本中使用 JVM 選項,如此所述。這并不方便,因為:-XX:ActiveProcessorCount=xx

    • 如上所述,如果您更改實例類型,則必須更改該值。

我寫了一篇更長的博客文章,在這里描述了我的發現:https://www.databasesandlife.com/java-docker-aws-ecs-multicore/


查看完整回答
反對 回復 2022-09-28
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號