
并發(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 倍的性能。