2017-05-26 75 views
0

通常,當進程線程進行讀系統調用時,線程的執行被暫停,並且讀操作本身在OS內核中發生(或計劃發生)。一旦讀取完成,內核會安排暫停的線程繼續執行。我理解這部分。從持久存儲讀取時CPU核心是否忙碌?

我的問題是,當內核從永久性存儲器(例如HDD或SSD)中讀取數據時,是否有一個CPU內核正在忙着編排?

我要求幫助確定我的過程中線程的最佳數量。例如,如果我的進程中有一個4核CPU和一個線程在讀取系統調用時被阻塞,那麼有多少其他線程可以在等待讀取完成的同時以並行方式運行? 3? 4? 3至4之間更微妙的東西?

+0

硬盤存儲的典型延遲是在... https://gist.github.com/jboner/2841832 10毫秒或30000000種CPU滴答; SSD速度更快,大約在1-0.5毫秒或1500000-3000000(3 GHz CPU - 每秒3個滴答,每個3000個,每毫秒300萬)。因此,當文件讀取錯過已經緩存在內存中的文件數據並生成外部I/O讀取時,CPU可能不會忙於等待請求並允許其他線程運行。 – osgx

+1

而不是嘗試確定線程的數量,使用*非阻塞*調用。 –

回答

2

不,讀取不會使CPU內核忙碌。

這裏是一個正在發生的事情,當你嘗試從驅動器讀取的(非常)簡單的描述:

  • 應用程序請求操作系統閱讀。
  • 如果從文件讀取:文件系統檢查其緩存。如果請求的數據在緩存中,它會立即返回。如果否,文件系統會要求存儲驅動程序從驅動器獲取數據。請參閱下一步。
  • 存儲驅動程序向存儲設備(例如硬盤驅動器)發送請求以獲取數據。這個請求然後由驅動器異步處理。
  • OS使應用程序進入休眠狀態(更確切地說:等待讀取的線程)。
  • ...一些時間過去了......
  • 存儲設備已完成讀取所請求的數據。它引發了一箇中斷。
  • 調用操作系統/驅動程序的中斷處理程序,它將數據複製到應用程序的內存中。
  • 應用程序的被阻止的線程被取消阻止並被安排執行。
  • 應用程序的線程繼續運行。

正如你所看到的那樣,在任何地方都沒有忙碌的等待。當應用程序被阻塞等待讀取時,CPU可以用於其他任務(或者如果沒有其他任務,則可以空閒)。

編輯:作爲osgx在評論中提到,也有例外。至少在Linux中,網絡和存儲層都會採用忙輪詢的方式,在某些情況下,當它快速地阻塞而不是異步繼續時。

+1

有了網絡驅動程序,有時候會出現臨時中斷不忙的等待模式:[NAPI輪詢](https://www.researchgate.net/figure/222684748_fig1_Fig-1-NAPI-polling-algorithm)([有時候使用低延遲](https://lwn.net/Articles/540281/))。對於80,120或200 IOPS的SATA/SAS HDD,不需要這種模式,但對於IOPS超過10000的現代SSD,驅動程序中也應該有輪詢模式(每秒10000箇中斷數量很大,SATA/SAS爲90k或者NVMe的150000更大)。 – osgx

+0

@osgx感謝您獲取這些附加信息。我已將這添加到我的答案中。 –

+0

Rolf,某些網絡的輪詢是正確的,[對於某些NVMe SSD(blk_mq_poll/io_poll_delay)]可能如此(http://events.linuxfoundation.org/sites/events/files/slides/lemoal-nvme-polling- vault-2017-final_0.pdf),但僅限於系統範圍的視圖。對於單個進程,單個請求不會在短的輪詢時間內完成,並且它會一直睡到中斷。只有當有很多進程和許多請求輪詢模式時,可以通過跳過中斷進入/退出或上下文切換來降低平均延遲。 – osgx

1

硬盤存儲的典型延遲大約... https://gist.github.com/jboner/2841832延遲數每個程序員都應該知道 生

Read 4K randomly from SSD*    150,000 ns  150 us   ~1GB/sec SSD 
Read 1 MB sequentially from SSD*  1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory 
Disk seek       10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip 
Read 1 MB sequentially from disk 20,000,000 ns 20,000 us 20 ms 80x memory, 20X SSD 
  • 對於HDD 10毫秒或種類的3000 CPU蜱;對於速度更快的SSD:大約1-0.5毫秒或大約1500000-3000000(3 GHz CPU - 每秒3個滴答,每個3000個,每毫秒300萬)。

因此,當文件讀取錯過已經緩存在內存中的文件數據並生成外部I/O讀取時,CPU可能不會忙於等待請求並允許其他線程運行。 CPU將用於通過VFS子系統和I/O驅動程序生成I/O請求。並且完成的請求將(在典型情況下)生成中斷到需要數據加載到存儲器的信號驅動器。

相關問題