問:假設(shè)此刻有任務(wù)A和任務(wù)B,有以下兩種執(zhí)行方式,請問哪種方式執(zhí)行更快呢?
- 方式一:一個線程,先執(zhí)行A,執(zhí)行完后再執(zhí)行B
- 方式二:兩個線程,一個線程執(zhí)行A,另一個線程執(zhí)行B
答:方式一更快。CPU在切換線程的時候,有一個上下文切換的事件,這個上下文切換是非常耗時的,假設(shè)一個CPU主頻是2.6GHz,這意味著每秒可以執(zhí)行2.6 * 10^9 個指令, 那么每個指令的時間大概是0.38ns!而一次上下文切換,就將近需要耗時2000ns!在這個時間內(nèi),CPU什么都干不了,只是做了保存上下文的動作。
問: 為什么一般是在I/O操作的時候要用多線程呢?
答: 因?yàn)镮/O操作一般可以分為兩個階段,即等待I/O準(zhǔn)備就緒和真正操作I/O資源!以磁盤為例,磁盤上的數(shù)據(jù)是分磁道,分簇存儲的,但是數(shù)據(jù)往往不是連續(xù)排列在同一磁道上的,所以磁頭在讀取數(shù)據(jù)時往往需要在磁道之間反復(fù)移動,這里就有一個尋道耗時,盤面旋轉(zhuǎn)將請求數(shù)據(jù)所在扇區(qū)移至讀寫頭下方也是需要時間的,同時這里還包含一個旋轉(zhuǎn)耗時,所以在這一段時間內(nèi),線程是阻塞著等待磁盤的,此時操作系統(tǒng)可以將那個空閑的CPU核心用于服務(wù)其他線程。因此I/O操作的情況下,使用多線程,效率會更高。
因?yàn)閞edis不涉及I/O操作,所以設(shè)計為單線程的效率是最高的!
問: redis的性能和CPU無關(guān),那redis的性能瓶頸在哪呢?
答:redis的性能瓶頸在于:
1. 網(wǎng)絡(luò)帶寬
2. 機(jī)器內(nèi)存大小
redis客戶端執(zhí)行一條命令分為四個過程,發(fā)送命令,命令排隊(duì),命令執(zhí)行,返回結(jié)果。其中發(fā)送命令+返回結(jié)果這一過程被稱為Round Trip Time(RTT,往返時間)redis的客戶端和服務(wù)器,可能部署在不同的機(jī)器上,例如客戶端在北京,服務(wù)端在上海,兩地直線距離約為1300公里,那么1次RTT時間=1300×2/300000×2/3)= 13毫秒(光在真空中傳輸速度為每秒30萬公里,這里假設(shè)光纖為光速的2/3),那么客戶端在1秒內(nèi)大約只能執(zhí)行80次左右的命令。
參考:https://blog.csdn.net/u010122604/article/details/92829855