1:生產(chǎn)者和消費者模式下的并發(fā)案例
生產(chǎn)者和消費者之間通過阻塞隊列來進(jìn)行通信秩仆,阻塞隊列相當(dāng)于一個緩存區(qū)据途,平衡了生產(chǎn)者和消費者之間的處理能力。
(1)多生產(chǎn)者殃姓、多消費者場景
(2)線程池與生產(chǎn)消費者模式
A: ? java中線程池其實也是一種生產(chǎn)者和消費者模式的實現(xiàn)方式翔冀。那它為啥比使用一個阻塞隊列來實現(xiàn)實現(xiàn)生產(chǎn)者和消費者模式高明呢导街?
B: ?如何使用線程池來實現(xiàn)多生產(chǎn)者和消費者模式呢?(可以考慮一個線程池1主要處理Io密集型任務(wù)纤子,線程池2主要處理Cpu密集型任務(wù)搬瑰。)
2:如何在生產(chǎn)線上款票,快速定位問題?
通常做法:看日志泽论、系統(tǒng)狀態(tài)艾少、dump線程
細(xì)化通常的做法:
(1)在Linux命令下使用top命令查看每個進(jìn)程的情況。
(2)再使用top的交互命令數(shù)字1查看每個cpu的性能數(shù)據(jù)翼悴。
CPU參數(shù)含義:
(3)使用top的交互命令H查看每個線程的性能信息缚够。可能會出現(xiàn)下面幾種情況:
第一種情況:某個線程CPU利用率一直是100%鹦赎,則說明是這個線程有可能有死循環(huán)谍椅,那么請記住這個PID。
第二種情況:某個線程一直在TOP10的位置古话,這說明這個線程可能有性能問題雏吭。
第三種情況:CPU利用率高的幾個線程在不停變化,說明并不是由某一個線程導(dǎo)致CPU偏高陪踩。
3:如何開發(fā)一個性能測試工具呢杖们?
原理:用戶寫一個java程序向服務(wù)器端發(fā)起請求,這個工具會啟動一個線程池來調(diào)度這些任務(wù)肩狂,可以配置同時啟動多少個線程摘完、發(fā)起請求次數(shù)和任務(wù)間隔時長。將這個程序部署在多臺機器上執(zhí)行傻谁,統(tǒng)計出QPS和響應(yīng)時長孝治。
4:性能測試中使用的命令?
查看網(wǎng)絡(luò)流量:cat ? /proc/net/dev
查看系統(tǒng)平均負(fù)載:cat ? /proc/loadavg
查看系統(tǒng)內(nèi)存情況:cat ? /proc/meminfo
查看CPU的利用率:cat ? /proc/stat
使用netstat命令查詢有多少臺機器連接到壓測程序上:netstat ? -nat | grep ?12200 -c ?注意:12200是壓測程序的端口
使用netstat命令查看已經(jīng)使用了多少個數(shù)據(jù)庫連接:netstat ? -nat | grep ?3306 -c?
使用ps命令查看下線程數(shù)是否增加了:ps ? -eLf ?| ?grep java ? -c
5:java中異步任務(wù)池的使用栅螟?
簡單說一下背景:線程池只能處理本機的任務(wù)荆秦,在集群環(huán)境下不能有效地調(diào)度所有機器的任務(wù)。比如:一個任務(wù)剛?cè)舆M(jìn)線程池力图,運營線程池的程序重啟啦,那么線程池里的任務(wù)就會丟失掺逼。
任務(wù)池的任務(wù)隔離:異步任務(wù)種類比較多吃媒,如:抓取網(wǎng)頁任務(wù)、同步數(shù)據(jù)任務(wù)吕喘。不同類型的任務(wù)優(yōu)先級不一樣赘那。如果任務(wù)類型比較少,建議用任務(wù)類型來隔離氯质;如果任務(wù)類型比較多募舟,比如幾十個,建議采用優(yōu)先級的方式來隔離闻察。
任務(wù)池的重試策略:根據(jù)不同的任務(wù)類型設(shè)置不同的重試策略拱礁。重試間隔隨著次數(shù)的增加琢锋,時間不斷增長,比如間隔幾秒呢灶、幾分鐘到幾小時吴超。
使用任務(wù)池的注意事項:任務(wù)必須無狀態(tài)。任務(wù)不能在執(zhí)行任務(wù)的機器中保存數(shù)據(jù)鸯乃。比如:某任務(wù)時處理上傳文件鲸阻,任務(wù)屬性里有文件上傳路徑,如果文件上傳到機器1缨睡,機器2獲取到了任務(wù)則會處理失敗鸟悴。因為機器1和機器2是隔離的。
異步任務(wù)的屬性:包括任務(wù)名稱奖年、下次執(zhí)行時間细诸、已執(zhí)行次數(shù)、任務(wù)類型拾并、任務(wù)優(yōu)先級和執(zhí)行時的報錯信息(用于快速定位問題)
并發(fā)編程IBM博文:
https://www.ibm.com/developerworks/cn/java/j-concurrent/?ca=j-r#JAVAZ%E7%BA%BF16