最佳線程數(shù)計(jì)算

并發(fā)編程適用于什么場(chǎng)景?

根據(jù)應(yīng)用場(chǎng)景

  • CPU 密集型
  • I/O密集型程序

CPU 密集型

一個(gè)完整請(qǐng)求,I/O操作可以在很短時(shí)間內(nèi)完成, CPU還有很多運(yùn)算要處理,也就是說 CPU 計(jì)算的比例占很大一部分

最佳線程= cpu核數(shù)(邏輯) +1

I/O密集型程序

與 CPU 密集型程序相對(duì),一個(gè)完整請(qǐng)求,CPU運(yùn)算操作完成之后還有很多 I/O 操作要做,也就是說 I/O 操作占比很大部分

單核:

最佳線程數(shù) = (1/CPU利用率) = 1 + (I/O耗時(shí)/CPU耗時(shí)))
計(jì)算示例

多核:

最佳線程數(shù) = CPU核心數(shù) * (1/CPU利用率) = CPU核心數(shù) * (1 + (I/O耗時(shí)/CPU耗時(shí)))

家里不是有礦,CPU核數(shù)一般都在16或者32

公式來源:并發(fā)編程實(shí)戰(zhàn)-8.2章節(jié)

I/O耗時(shí)和CPU耗時(shí)和CPU利用率怎樣獲取

APM (Application Performance Manager)工具可以幫我們得到準(zhǔn)確的數(shù)據(jù)

  • SkyWalking
  • zipkin

例子:

假設(shè)要求一個(gè)系統(tǒng)的 TPS(Transaction Per Second 或者 Task Per Second)至少為20,然后假設(shè)每個(gè)Transaction由一個(gè)線程完成,繼續(xù)假設(shè)平均每個(gè)線程處理一個(gè)Transaction的時(shí)間為4s

如何設(shè)計(jì)線程個(gè)數(shù),使得可以在1s內(nèi)處理完20個(gè)Transaction?

計(jì)算操作需要5ms,DB操作需要 100ms,對(duì)于一臺(tái) 8個(gè)CPU的服務(wù)器,怎么設(shè)置線程數(shù)呢?

線程數(shù) = 8 * (1 + 100/5) = 168 (個(gè))
  • 那如果DB的 QPS(Query Per Second)上限是1000,此時(shí)這個(gè)線程數(shù)又該設(shè)置為多大呢?

題外話:增加 CPU 核數(shù)一定能解決問題嗎?

這個(gè)結(jié)論告訴我們,假如我們的串行率是 5%,那么我們無論采用什么技術(shù),最高也就只能提高 20 倍的性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容