本文以一個現代的、實際的我的電腦爲對象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各種子系統的運行速度——延遲和數據吞吐量。經過粗略的估算PC各個組件的相對運行速度,但願能給你們留下一個比較直觀的印象。本文中的數據來自實際應用,而非理論最大值。時間的單位是納秒(ns,十億分之一秒),毫秒(ms,千分之一秒),和秒(s)。吞吐量的單位是兆字節(MB)和千兆字節(GB)。讓咱們先從CPU和內存開始,下圖是北橋部分:html
第一個使人驚歎的事實是:CPU快得離譜。在Core 2 3.0GHz上,大部分簡單指令的執行只須要一個時鐘週期,也就是1/3納秒。即便是真空中傳播的光,在這段時間內也只能走10釐米(約4英寸)。把上述事實記在心中是有好處的。當你要對程序作優化的時候就會想到,執行指令的開銷對於當今的CPU而言是多麼的微不足道。前端
當CPU運轉起來之後,它便會經過L1 cache和L2 cache對系統中的主存進行讀寫訪問。cache使用的是靜態存儲器(SRAM)。相對於系統主存中使用的動態存儲器(DRAM),cache讀寫速度快得多、造價也高昂得多。cache通常被放置在CPU芯片的內部,加之使用昂貴高速的存儲器,使其給CPU帶來的延遲很是低。在指令層次上的優化(instruction-level optimization),其效果是與優化後代碼的大小息息相關。因爲使用了高速緩存技術(caching),那些可以總體放入L1/L2 cache中的代碼,和那些在運行時須要不斷調入/調出(marshall into/out of)cache的代碼,在性能上會產生很是明顯的差別。linux
正常狀況下,當CPU操做一塊內存區域時,其中的信息要麼已經保存在L1/L2 cache,要麼就須要將之從系統主存中調入cache,而後再處理。若是是後一種狀況,咱們就碰到了第一個瓶頸,一個大約250個時鐘週期的延遲。在此期間若是CPU沒有其餘事情要作,則每每是處在停機狀態的(stall)。爲了給你們一個直觀的印象,咱們把CPU的一個時鐘週期看做一秒。那麼,從L1 cache讀取信息就好像是拿起桌上的一張草稿紙(3秒);從L2 cache讀取信息則是從身邊的書架上取出一本書(14秒);而從主存中讀取信息則至關於走到辦公樓下去買個零食(4分鐘)。數據庫
主存操做的準確延遲是不固定的,與具體的應用以及其餘許多因素有關。好比,它依賴於列選通延遲(CAS)以及內存條的型號,它還依賴於CPU指令預取的成功率。指令預取能夠根據當前執行的代碼來猜想主存中哪些部分即將被使用,從而提早將這些信息載入cache。緩存
看看L1/L2 cache的性能,再對比主存,就會發現:配置更大的cache或者編寫能更好的利用cache的應用程序,會使系統的性能獲得多麼顯著的提升。若是想進一步瞭解有關內存的諸多信息,讀者能夠參閱Ulrich Drepper所寫的一篇經典文章《What Every Programmer Should Know About Memory》。網絡
人們一般把CPU與內存之間的瓶頸叫作馮·諾依曼瓶頸(von Neumann bottleneck)。當今系統的前端總線帶寬約爲10GB/s,看起來很使人滿意。在這個速度下,你能夠在1秒內從內存中讀取8GB的信息,或者10納秒內讀取100字節。遺憾的是,這個吞吐量只是理論最大值(圖中其餘數據爲實際值),並且是根本不可能達到的,由於主存控制電路會引入延遲。在作內存訪問時,會遇到不少零散的等待週期。好比電平協議要求,在選通一行、選通一列、取到可靠的數據以前,須要有必定的信號穩定時間。因爲主存中使用電容來存儲信息,爲了防止因天然放電而致使的信息丟失,就須要週期性的刷新它所存儲的內容,這也帶來額外的等待時間。某些連續的內存訪問方式可能會比較高效,但仍然具備延時。而那些隨機的內存訪問則消耗更多時間。因此延遲是不可避免的。dom
圖中下方的南橋鏈接了不少其餘總線(如:PCI-E, USB)和外圍設備:性能
使人沮喪的是,南橋管理了一些反應至關遲鈍的設備,好比硬盤。就算是緩慢的系統主存,和硬盤相比也可謂速度如飛了。繼續拿辦公室作比喻,等待硬盤尋道的時間至關於離開辦公大樓並開始長達一年零三個月的環球旅行。這就解釋了爲什麼電腦的大部分工做都受制於磁盤I/O,以及爲什麼數據庫的性能在內存緩衝區被耗盡後會陡然降低。同時也解釋了爲什麼充足的RAM(用於緩衝)和高速的磁盤驅動器對系統的總體性能如此重要。優化
雖然磁盤的「連續」存取速度確實能夠在實際使用中達到,但這並不是故事的所有。真正使人頭疼的瓶頸在於尋道操做,也就是在磁盤表面移動讀寫磁頭到正確的磁道上,而後再等待磁盤旋轉到正確的位置上,以便讀取指定扇區內的信息。RPM(每分鐘繞轉次數)用來指示磁盤的旋轉速度:RPM越大,耽誤在尋道上的時間就越少,因此越高的RPM意味着越快的磁盤。這裏有一篇由兩個Stanford的研究生寫的很酷的文章,其中講述了尋道時間對系統性能的影響:《Anatomy of a Large-Scale Hypertextual Web Search Engine》網站
當磁盤驅動器讀取一個大的、連續存儲的文件時會達到更高的持續讀取速度,由於省去了尋道的時間。文件系統的碎片整理器就是用來把文件信息重組在連續的數據塊中,經過儘量減小尋道來提升數據吞吐量。然而,說到計算機實際使用時的感覺,磁盤的連續存取速度就不那麼重要了,反而應該關注驅動器在單位時間內能夠完成的尋道和隨機I/O操做的次數。對此,固態硬盤(SSD)能夠成爲一個很棒的選擇。
硬盤的cache也有助於改進性能。雖然16MB的cache只能覆蓋整個磁盤容量的0.002%,可別看cache只有這麼一點大,其效果十分明顯。它能夠把一組零散的寫入操做合成一個,也就是使磁盤可以控制寫入操做的順序,從而減小尋道的次數。一樣的,爲了提升效率,一系列讀取操做也能夠被重組,並且操做系統和驅動器固件(firmware)都會參與到這類優化中來。
最後,圖中還列出了網絡和其餘總線的實際數據吞吐量。火線(fireware)僅供參考,Intel X48芯片組並不直接支持火線。咱們能夠把Internet看做是計算機之間的總線。去訪問那些速度很快的網站(好比google.com),延遲大約45毫秒,與硬盤驅動器帶來的延遲至關。事實上,儘管硬盤比內存慢了5個數量級,它的速度與Internet是在同一數量級上的。目前,通常家用網絡的帶寬仍是要落後於硬盤連續讀取速度的,但「網絡就是計算機」這句話可謂名符其實。若是未來Internet比硬盤還快了,那會是個什麼景象呢?
我但願這些圖片能對您有所幫助。當這些數字一塊兒呈如今我面前時,真的很迷人,也讓我看到了計算機技術發展到了哪一步。前文分開的兩個圖片只是爲了敘述方便,我把包含南北橋的整張圖片也貼出來,供您參考。
原文標題:What Your Computer Does While You Wait