1. 程式人生 > >Java執行緒CPU親和性工具

Java執行緒CPU親和性工具

Thread Affinity

為什麼需要執行緒的CPU親和性

應用通過多執行緒的方式執行,多數情況下執行緒能夠被合理的排程。但在某些情況下某個重要的執行緒被暫停,而時間片被分配給了一個無關重要的執行緒。當一個執行緒每次被暫停休眠,然後被喚醒之後,需要重新載入“cache line”(cpu L1/L2 cache)。當執行緒的工作時間很短暫,需要被頻繁的被喚醒,意味著整個流程執行都很慢,有可能比單執行緒情況下慢2-5倍。

應用的有些執行緒可能需要一直執行,不因CPU的排程而休眠,這需要使執行緒一直在某個CPU上執行。

https://github.com/OpenHFT/Java-Thread-Affinity

實現了將執行緒繫結到CPU上,例如:執行緒X必須使用一個物理CPU,執行緒Y和Z使用同一個物理CPU的不同邏輯CPU(CPU超執行緒技術)。這個程式碼能夠識別獨立的CPU,根據開發人員提供的規則將執行緒繫結到合適的CPU上。這個工具能夠識別獨立的CPU,基於最優效果原則,根據提供的規則將執行緒分配到CPU上。即使沒有獨立的核心也能做到最好。

原理

這個工具讀取/proc/cpuinfo/來決定CPU的佈局。如果沒有這個檔案則認為每個CPU一個插槽。
預設情況只在未被使用的CPU上來查詢獨立的CPU。例如總共16個CPU,有8個在通常不被使用(在啟動時候設定的執行緒親和性決定的),那麼Java-Thread-Affinity會使用這些CPU。

注意

如果多個程序程使用這個庫,則需要為某個程序指定CPU,否則這幾個程序會共用CPU。在命令列新增-Daffinity.reserved={cpu-mark-in-hex} 就可以指定程序使用哪個CPU來解決問題。

PS

執行緒切換的原因

  • 1、當前執行任務的時間片用完之後,系統CPU正常排程下一個任務。
  • 2、 當前執行任務碰到IO阻塞, 排程器將掛起此任務, 繼續下一任務
  • 3、 多個任務搶佔鎖資源, 當前任務沒有搶到,被排程器掛起, 繼續下一任務
  • 4、 使用者程式碼掛起當前任務, 讓出CPU時間
  • 5、 中斷。硬體中斷:外設傳送電訊號給處理器,非同步,IRQ(interrupt request);軟中斷:異常情況 or 特殊指令集,軟中斷可以用來實現system call。

上下文切換涉及:saving and loading registers and memory maps, updating various tables and lists etc.

A context switch can mean aregister context switch, atask context switch, astack frame switch, athread context switch, or a process context switch.(表現形式:程序之間,執行緒之間,棧幀之間)

相關推薦

Java執行CPU親和工具

Thread Affinity 為什麼需要執行緒的CPU親和性 應用通過多執行緒的方式執行,多數情況下執行緒能夠被合理的排程。但在某些情況下某個重要的執行緒被暫停,而時間片被分配給了一個無關重要的執行緒。當一個執行緒每次被暫停休眠,然後被喚醒之後,需要重

Java執行--LockSupport阻塞/喚醒工具

LockSupport執行緒阻塞/喚醒工具類 目錄 LockSupport執行緒阻塞/喚醒工具類 LockSupport原理  LockSupport示例 LockSupport原理  LockSupport類,是個工具類。內部的實

程序,執行,核心設定cpu親和

程序與cpu繫結 sched_setaffinity可以將某個程序繫結到一個特定的CPU。 SCHED_SETAFFINITY(2) Linu

java執行10.構建同步工具

建立狀態依賴類的最簡單方法通常是在類庫中現有狀態依賴類的基礎上進行構造。如果類庫中沒有提供你需要的功能,可以使用java語言和類庫提供的底層機制來構造自己的同步機制,包括內建的條件佇列、顯示地Condition物件以及AbstractQueuedSynchronizer框架。 在單執行緒程式中呼叫方法時,如

JAVA執行的生命週期和分析工具

執行緒的生命週期的六種狀態  其中一種 有效的方法就是看原始碼 1、NEW 在 虛擬機器的 中建立物件,初始化 成員變數。 2、RUNNABLE 在虛擬中建立執行緒 私有的程式計數器,虛擬機器棧, 等待虛擬機器 執行緒排程器,分配時間片。 3、BLOCKED

java程式中執行cpu使用率計算

原文地址:https://www.imooc.com/article/27374 最近確實遇到題目上的剛需,也是花了一段時間來思考這個問題。 cpu使用率如何計算     計算使用率在上學那會就經常算,不過往往計算的是整個程式執行的時間段,現

Java 執行工具

1. CountDownLatch CountDownLatch首先定義任務次數,並呼叫await()方法等待任務完成。呼叫countDown()方法表明已經完成一項任務,當任務全部完成後,繼續await()方法後的任務。 public class CountDownLatchT

1.java 執行常用工具

一 Timer 定時器 Timer 類主要是用來完成定時任務的功能,比如鬧鐘這種週期性變化的事物。 ** 1 一個最簡單的定時器** 兩秒鐘後引爆一個定時炸彈。 @Test public void test() { new Timer(

Java基礎學習總結(104)——多執行、併發、工具類相關的面試題

執行緒的概念 執行緒是程式執行的最小單位,也是作業系統排程和分派CPU的最小單元,是程序中的一個實體,是程序中的實際運作單位。可以在一個程序中啟動多個執行緒來完成不同的任務,這些執行緒共享該程序擁有的資源。 執行緒程序區別 程序是程式的實體,也是執行緒的容器,一個程序可以包含多個執行緒,程序是資源分配的基本單

Java執行安全的日期格式化工具

/** * 日期格式化輔助類 * * @author hkb <br> */ public final class DateUtils { /** 執行緒安全的日期格式物件 */ private static final

JAVA 執行之記憶體可見

什麼是記憶體可見性 先介紹幾個概念: 共享變數: 如果一個變數在多個執行緒的工作記憶體中都存在副本,那麼這個變數就是這幾個執行緒的共享變數 可見性: 一個執行緒對共享變數值的修改,能夠及時地被其他執行緒看到 JMM( JAVA記憶體模型)

如何定位cpu佔用率高的java執行

檢視cup的使用情況,在Linux下可以使用 top 或者 htop命令 top -u ${使用者} -c top -u devops -c 在命令列提示符執行top命令,輸入大寫P,

Java執行之釋放鎖,釋放資源,釋放CPU

多執行緒中的wait與sleep到底誰釋放了鎖 首先,多執行緒中會使用到兩個延遲的函式,wait和sleep。 wait是Object類中的方法,而sleep是Thread類中的方法。 sleep是Thread類中的靜態方法。無論是在a執行緒中呼叫b的sl

如何在Linux下找出大量佔用CPUjava執行

首先獲取jvm的程序pid。 [[email protected] ~]$ jps -v 26048 Server -Xms256m -Xmx2048m -Dweblogic.Name=bi_server1 -Djava.security.policy=/home

Java之多執行記憶體可見_2(synchronized可見原理)

可見性:要實現共享變數的可見性,必須保證2點:1.執行緒修改後的共享變數值能夠及時從工作記憶體重新整理到主記憶體中。2.其他執行緒能夠及時把共享變數的最新值從主記憶體更新到自己的工作記憶體中。 以下的記錄都是來源於慕課網-細說java多執行緒之記憶體可見性 Java語言層

Java執行同步工具-Semaphore

Semaphore:訊號燈 特點:控制每次執行的執行緒數,達到控制執行緒併發的效果 測試程式碼 package com.zhiwei.thread; import java.util.Rand

檢視JAVA程序中哪個執行CPU消耗最高

一,在centos linux 上檢視程序佔用cpu過高 top  shift+h 檢視哪個程序程消耗最高 二,檢視JAVA程序中哪個執行緒消耗最高 2.1 匯出java執行的執行緒資訊 jstack 程序id(jps檢視) jstack 程序id

在Linux中找出佔用大量CPUJava程式碼(將Java執行與Linux PID進行關聯)

英文原文:http://blogs.manageengine.com/appmanager/2011/02/09/identify-java-code-consuming-high-cpu-in-linux-linking-jvm-thread-and-linux-pid

java執行併發工具類CyclicBarrier、CountDownLatch及Semaphore

一、CyclicBarrier   (原文連結:http://www.studyshare.cn/blog-front/blog/index ) 1、定義 CyclicBarrier是執行緒併發工具類之一,俗稱柵欄。當一組執行緒全部執行完後,到達柵欄屏障,就放開屏障,繼續往後

java執行併發工具

  本次內容主要講Fork-Join、CountDownLatch、CyclicBarrier以及Callable、Future和FutureTask,最後再手寫一個自己的FutureTask,絕對乾貨滿滿!   1、Fork-Join 1.1 什麼是Fork-Join   Java多執行緒的開發可