併發 - 減少上下文切換

Lmbench3可以測量上下文切換帶來的消耗。
vmstat可以測量上下文切換的次數。

$ vmstat 3 7 //每3秒進行一次採樣,共進行7次

減少上下文切換的方法:
  • 無鎖併發編程:
    避免使用鎖,如將數據的id按照HASH算法取模分段,不同線程處理不同分段的數據。
  • CAS算法:
    Compare and Swap,比較與交換。Java的Atomic包使用CAS算法來更新數據,不用創建鎖。
  • 使用最少線程:
    避免創建多餘的線程,創建多餘的線程會造成大量線程處於等待狀態。
  • 協程
    在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。
減少WAITING的線程數可以減少上下文切換次數。
  1. 查找要處理的線程信息

$ ps -ef | grep xxx

  1. 用jstack命令dump線程信息,查看第1步的線程內容,例如第一步的線程是9527。

$ sudo -u admin /opt/java/bin/jstack 9527 > /home/mydump/dump9527

  1. 統計所有線程狀態,查看處於WAITING(on object monitor)的狀態的線程數量。

$ grep java.lang.Thread.State dump9527 | awk '{print $2$3$4$5}' | sort | uniq -c

  1. 打開dump9527文件查看WAITING(on object monitor)狀態的線程,發現其處於await狀態。
  2. 減少對應的線程數量,重啓服務。再次dump線程信息,查看上下文切換次數是否減少。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章