在本地虛擬機中壓測時,單進程同一個方法,如果沒有數(shù)據(jù)庫寫入通訊基本上不是什么問題,單進程每秒4000多的回復(fù)速度。但哪怕只有數(shù)據(jù)庫操作時,哪怕2個客戶端每秒只請求100次,都會卡住,數(shù)據(jù)會丟失,并沒有全部寫入數(shù)據(jù)庫。
不知道產(chǎn)生這樣情況的原因?有沒有解決辦法?數(shù)據(jù)庫操作后來也試過原生的pdo,試過原生pdo的單例,都沒用,都會堵死。直接連數(shù)據(jù)庫寫入速度是完全沒有問題的,每秒鐘上千條的寫入速度。gateway寫入數(shù)據(jù)庫的速度也很快,0.01秒就寫入一條數(shù)據(jù),但為啥承載力這么低下,百思不得其解
是二進制雙向通信,business寫的業(yè)務(wù)邏輯
linux系統(tǒng)用命令
strace -ttp 進程pid
能看到到底卡在哪里了
運行了這個命令,沒能看懂。。這幾天測試發(fā)現(xiàn),不僅是操作數(shù)據(jù)庫,還有curl,寫文件,都會造成這種情況,不像是阻塞,因為監(jiān)看mysql的時候發(fā)現(xiàn)它很閑,非??臻e,top看cup也只用了百分之50,更像是gateway占用著資源不釋放,導(dǎo)致后面的請求得不到處理。
還有就是,同事的電腦虛擬機分配的一核1g內(nèi)存,發(fā)生這種情況很顯著,我的虛擬機分配的2核4g內(nèi)存,情況好很多,但是請求量大一樣會發(fā)生這種情況,比如說線程達到1000時,這種情況產(chǎn)生后,數(shù)據(jù)庫只能每秒寫入一條數(shù)據(jù)的速度。。。
你用的單進程,你描述是0.01秒才寫入一條數(shù)據(jù),那么一個進程一秒鐘只能寫入100條數(shù)據(jù)。你測試時有兩個客戶端,每個客戶端每秒請求100次,假如每次寫一次數(shù)據(jù)庫,那個需要每秒寫入200條數(shù)據(jù),已經(jīng)超過單進程的承載能力,所以請求可能會擠壓,出問題也是正常的。
問題是,當發(fā)生狀況后,數(shù)據(jù)一秒鐘寫入一個,workerman忙的要死,數(shù)據(jù)庫閑的要死。是什么原因?qū)е碌模拷鉀Q辦法是?不然一臺服務(wù)器cpu百分之50的利用率都用不到就上線顯然是不行的
同樣的業(yè)務(wù)把數(shù)據(jù)庫操作去掉后,連16000用戶都可以,只是每秒回復(fù)只有幾千條而已,并不會出現(xiàn)像這樣占著茅坑不拉屎現(xiàn)象。
之前的描述有點不準確,2個線程連接gateway,循環(huán)100次,當收到回復(fù)發(fā)起第二次請求。有時候執(zhí)行到100多次就卡住了,有時候執(zhí)行到幾十次就卡住了。后面的寫入速度很慢,每秒只寫入個位數(shù)的記錄。當循環(huán)完了發(fā)現(xiàn)數(shù)據(jù)庫里記錄只存了幾十條或者100多條,卡住后的很多數(shù)據(jù)都丟失了
單獨測workerman吞吐的時候,定時發(fā)送請求測的,雖然說回復(fù)量沒有跟上請求量,但一直在回復(fù),沒有這種卡死的情況,沒有這種秒回復(fù)量驟減到個位數(shù)的情況
看起來是沒有優(yōu)化linux內(nèi)核導(dǎo)致的,根據(jù)手冊優(yōu)化下linux內(nèi)核 http://doc3.workerman.net/appendices/kernel-optimization.html 。另外需要安裝event擴展或者libevent擴展,參考手冊 http://doc3.workerman.net/install/install.html
并不是所有服務(wù)器的默認配置都能支持壓測,默認內(nèi)核配置都比較低,需要優(yōu)化才能壓測出好成績,才能在正式環(huán)境使用。要想高并發(fā),正式環(huán)境PHP的event擴展或者libevent擴展也是必須要裝的。
性能提高了不少,但后來報了這樣的錯SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready
還是卡住了
上面還有。。PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /mnt/hgfs/workspace/baiyi/GatewayWorker/Workerman/Connection/TcpConnection.php on line 360內(nèi)存用盡?
我的也是這種情況。但是我的是一個連接每3秒進行一次數(shù)據(jù)存儲,過了大概20多分鐘,就會卡住??ㄗ〉谋憩F(xiàn)就是別的請求反應(yīng)慢,或者回復(fù)的消息不正確。樓主最后解決問題了嗎??請教??!
看看這個workerman與thinkphp5的實戰(zhàn)教學(xué)視頻,就都會了。
http://study.163.com/course/introduction/1005015012.htm?share=2&shareId=400000000388007