Lmbench3可以測量上下文切換帶來的消耗。
vmstat可以測量上下文切換的次數。
$ vmstat 3 7 //每3秒進行一次採樣,共進行7次
減少上下文切換的方法:
- 無鎖併發編程:
避免使用鎖,如將數據的id按照HASH算法取模分段,不同線程處理不同分段的數據。 - CAS算法:
Compare and Swap,比較與交換。Java的Atomic包使用CAS算法來更新數據,不用創建鎖。 - 使用最少線程:
避免創建多餘的線程,創建多餘的線程會造成大量線程處於等待狀態。 - 協程
在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。
減少WAITING的線程數可以減少上下文切換次數。
- 查找要處理的線程信息
$ ps -ef | grep xxx
- 用jstack命令dump線程信息,查看第1步的線程內容,例如第一步的線程是9527。
$ sudo -u admin /opt/java/bin/jstack 9527 > /home/mydump/dump9527
- 統計所有線程狀態,查看處於WAITING(on object monitor)的狀態的線程數量。
$ grep java.lang.Thread.State dump9527 | awk '{print $2$3$4$5}' | sort | uniq -c
- 打開dump9527文件查看WAITING(on object monitor)狀態的線程,發現其處於await狀態。
- 減少對應的線程數量,重啓服務。再次dump線程信息,查看上下文切換次數是否減少。