很多時(shí)候有些SQL查詢比較耗時(shí),假如用
SLEEP(1)
模擬,webman的數(shù)據(jù)庫(kù)是單例的,PDO也是阻塞的,在當(dāng)前進(jìn)程內(nèi)只能同時(shí)有一個(gè)請(qǐng)求在執(zhí)行,如果開(kāi)啟4個(gè)進(jìn)程,并發(fā)查詢20次,那么所有請(qǐng)求完成至少需要5秒鐘,如何能做到所有結(jié)果1秒鐘返回?
進(jìn)程數(shù)設(shè)置原則
1、每個(gè)進(jìn)程占用內(nèi)存之和需要小于總內(nèi)存(一般來(lái)說(shuō)每個(gè)業(yè)務(wù)進(jìn)程占用內(nèi)存大概40M左右)
2、如果是IO密集型,也就是業(yè)務(wù)中涉及到一些阻塞式IO,比如一般的訪問(wèn)Mysql、Redis等存儲(chǔ)都是阻塞式訪問(wèn)的,進(jìn)程數(shù)可以開(kāi)大一些,如配置成CPU核數(shù)的3倍。如果業(yè)務(wù)中涉及的阻塞等待很多,可以再適當(dāng)加大進(jìn)程數(shù),例如CPU核數(shù)的5倍甚至更高。注意非阻塞式IO屬于CPU密集型,而不屬于IO密集型。
3、如果是CPU密集型,也就是業(yè)務(wù)中沒(méi)有阻塞式IO開(kāi)銷(xiāo),例如使用異步IO讀取網(wǎng)絡(luò)資源,進(jìn)程不會(huì)被業(yè)務(wù)代碼阻塞的情況下,可以把進(jìn)程數(shù)設(shè)置成和CPU核數(shù)一樣
這種我一般會(huì)直接拆分出來(lái),圖方便就直接加大進(jìn)程數(shù)咯.
這種瓶頸在數(shù)據(jù)庫(kù),最簡(jiǎn)單的方案是多開(kāi)進(jìn)程。
數(shù)據(jù)庫(kù)連接數(shù)是有限的,這種1秒的慢sql,要把數(shù)據(jù)庫(kù)連接數(shù)用滿才能達(dá)到最大QPS。比如數(shù)據(jù)庫(kù)最大連接數(shù)200,那么極限就是200 QPS,如果是一個(gè)請(qǐng)求里有幾個(gè)慢SQL,那極限QPS也就幾十個(gè),不管你上多進(jìn)程 多線程還是協(xié)程 異步非阻塞都一樣。
還有慢sql很耗費(fèi)性能,幾個(gè)慢sql就可能就可能導(dǎo)致mysql cpu100%(當(dāng)然sleep這種除外)。
有慢sql這種最根本的解決辦法是優(yōu)化sql,或者使用緩存等方案避免頻繁讀寫(xiě)數(shù)據(jù)庫(kù)。