據說你只知內存,而不知緩存?CPU表示很傷心!

通常咱們的開發同窗們都知道本身機器的CPU是幾核、內存是多大。可是對於CPU內部對程序性能影響較大的緩存倒是隻知其一;不知其二。有些開發同窗都是計算機的緩存有L一、L二、L3,可是再詳細一點的問題,可能就不多有同窗能答的完整了。若是下面這幾個問題你能脫口而出,請跳過本節。例如:php

  • 緩存究竟在哪裏?
  • L1有幾種?
  • 你的緩存有幾級,分別是多大?
  • 你的24核的機器,一二三級緩存分別有幾個,存在共享的狀況嗎?

其實緩存對計算機程序運行性能影響極大,可是他們在開發同窗心目中的存在感卻不如內存高。要知道CPU緩存以及緩存算法的設計是現代CPU設計的核心任務之一。飛哥以爲緩存們必定感到很傷心。redis

Intel CPU體系結構

其實在286以前的時代的CPU本是沒有緩存的,由於當時的CPU和內存速度差別沒有如今這麼大,CPU直接訪問內存。可是到386時代,CPU和內存的速度不匹配了,第一次出現了緩存。並且最先的緩存並無放在CPU模塊裏,而是放在主板上的。再日後CPU愈來愈快,如今CPU的速度比內存要快百倍以上,因此就逐步演化出了L一、L二、L3三級緩存結構,並且都集成到的CPU芯片裏,以進一步提升訪問速度。算法

咱們來看下現代Intel的CPU架構的基本結構。windows

file

L1最接近於CPU,速度也最快,可是容量最小。通常現代CPU的L1會分紅兩個,一個用來cache data,一個用來cache code,這是由於code和data的更新策略並不相同,並且由於CISC的變長指令,code cache要作特殊優化。 通常每一個核都有本身獨立的data L1和code L1。
越往下,速度越慢,容量越大。L2通常也能夠作到每一個核一個獨立的。可是L3通常就是整顆CPU共享的了。
UEFIBlog裏提供了一個比較好的物理解剖圖,比較好地展現了出來: 緩存

file

實際查看

上面介紹的只是籠統的概念。可是每一個CPU的緩存都是不同的,並且「紙上得來終覺淺」,我以爲咱們仍是有必要進行下一步的實機勘探工做。架構

Linux的內核的開發者定義了一套框架模型來完成這一目的,它就是CPUFreq系統。
CPUFreq提供的sysfs接口,可讓咱們看到比/proc/cpuinfo更爲詳細的CPU詳細信息。框架

# cd /sys/devices/system/cpu/;ll
drwxr-xr-x 7 root root    0 Apr 15 15:29 cpu0  
drwxr-xr-x 7 root root    0 Apr 15 15:29 cpu1  
......
  • L1一級緩存查看:
# cat cpu0/cache/index0/level  
1  
# cat cpu0/cache/index0/size  
32K  
# cat cpu0/cache/index0/type  
Data  
# cat cpu0/cache/index0/shared_cpu_list  
0,12  
# cat cpu0/cache/index1/level  
1
# cat cpu0/cache/index1/size  
32K  
# cat cpu0/cache/index1/type  
Instruction  
# cat cpu0/cache/index1/shared_cpu_list  
0,12

從上面的level接口能夠看出index0和index1都是一級緩存,只不過一個是Data數據緩存,一個是Instruction也就是代碼緩存。
等等,上面提到的是每一個Core是獨立的L1緩存,爲何shared_cpu_list顯示有共享?對了咱們這裏看到的cpu0並非物理Core,而是邏輯核,都是超線程技術虛擬出來的。 實際上cpu0和cpu12是屬於一個物理Core,因此每一個Data L1和Instruction是這兩個邏輯核共享的。
個人這臺電腦裏,總共是有12個Data L1,12個Instrunction L1,大小都是32K。ide

  • L2二級緩存查看:
# cat cpu0/cache/index2/size  
256K  
# cat cpu0/cache/index2/type 
Unified  
# cat cpu0/cache/index2/shared_cpu_list  
0,12

二級緩存要比一級緩存大很多,有256K,可是不分Data和Instruction。另外L2和L1同樣,也是總共有12個,每兩個邏輯核共享一個L2。函數

  • L3三級緩存查看:
# cat cpu0/cache/index3/size  
12288K  
# cat cpu0/cache/index3/type  
Unified  
# cat cpu0/cache/index3/shared_cpu_list  
0-5,12-17  
#cat cpu6/cache/index3/shared_cpu_list  
6-11,18-23

L3達到了12M,你去買CPU的時候商品裏能看到的緩存屬性通常告訴你的就是這個L3屬性。由於L3要比L2和L1看起來要大的多,能激發你購買的慾望。但實際上個人這臺電腦裏L3只有兩個,每一個CPU各一個,不像是L二、L1有不少。第0-5,12-17號邏輯核共享一個L3,由於它們是在一個物理CPU上。6-11,18-23共享另外一個。 性能

另外,Linux上還有個dmidecode命令,也能查看到一些關於CPU緩存的信息,感興趣的小夥伴們能夠試試

# dmidecode -t cache

可能有的同窗會問了,我用的操做系統是windows啊,怎麼看?打開cmd命令行,輸入如下命令試試吧,飛哥在windows上知道的就這麼多了,感興趣的話你本身google上搜搜吧。

# wmic cpu get L2CacheSize,L3CacheSize

擴展知識

Cache Line:咱們前面只介紹了各個級別的緩存,可是這裏面有個很重要的概念就是Cache Line,就是本級緩存向下一層取數據時的基本單位。能夠經過以下方式查看:

# cd /sys/devices/system/cpu/;ll
# cat cpu0/cache/index0/coherency_line_size
64
# cat cpu0/cache/index1/coherency_line_size
64
# cat cpu0/cache/index2/coherency_line_size
64
# cat cpu0/cache/index3/coherency_line_size
64

能夠看到L一、L二、L3的Cache Line大小都是64字節(注意是字節)。就是說每次cpu從內存獲取數據的時候,都是以該單位來進行的,哪怕你只取一個bit,CPU也是給你取一個Cache Line而後放到各級緩存裏存起來。請你們緊緊記住這個概念,之後的文章中咱們會用到。


file


開發內功修煉之CPU篇專輯:


個人公衆號是「開發內功修煉」,在這裏我不是單純介紹技術理論,也不僅介紹實踐經驗。而是把理論與實踐結合起來,用實踐加深對理論的理解、用理論提升你的技術實踐能力。歡迎你來關注個人公衆號,也請分享給你的好友~~~

相關文章
相關標籤/搜索