drop_caches 的簡單學習

drop_caches 的簡單學習


背景

最近一段時間一直在學習內存相關的知識
Linux系統裏面的內存管理還是非常複雜的. 

我這邊理解 Linux從宏觀層次的 段頁式內存管理
到細節的buddy和slab 以及大頁內存分配
以及page cache 和buffers的緩存等設置. 

最近因爲遇到了CentOS6和CentOS7 free 顯示內存不一致的問題
耗費了自己很大的精力. 
自己這邊有CentOS7的環境, 所以想使用CentOS7進行一下驗證

TLDR版本的結論

1. drop_caches 是有時間成本的. 清理緩存並不能夠達到DDR宣稱的帶寬與速度. 
   DDR號稱的帶寬可以有 2.4G*8*2  至少 51.2GB/S的帶寬 (雙通道,DDR 2400頻率)
   但是實際驗證最多也就15GB/S左右的卸載速度. 說明還是有很多其他損耗的. 

2. linux內核裏面有很多dirty相關的參數, 但是他僅是負責buffer 髒頁的回寫等處理.
   並不會影響只讀的page caches 
   只有內存遇到瓶頸. Linux纔會使用LRU的策略清理page cache. 
   沒有壓力的情況下系統幾乎不會做任何處理. 

3. 系統內核有一個 min free 相關的參數, 可能會影響 page caches的回收時機
   但是非常不建議修改過大的數值,可能會導致系統崩潰. 
   vm.min_free_kbytes 僅好看, 實際效益非常低. 

驗證

cat onefile > filenew 
緩存數據量爲: 11.815G
time echo 3 >/proc/sys/vm/drop_caches

real    0m0.780s
user    0m0.000s
sys     0m0.767s

消耗時間爲 0.78秒

[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13798         382          20       32825       32733
Swap:          8079          14        8065

這次的驅逐時間爲:

緩存數據量爲: 31.532G 
time echo 3 >/proc/sys/vm/drop_caches

real    0m2.163s
user    0m0.000s
sys     0m2.124s

說明cache 太大的情況下進行內存驅逐的時間也是比較久的
並不是沒有成本的. 

虛擬化的情況下 1秒鐘大約可以卸載從pagecache中 15G的內存.
進行了多次驗證, 時間基本上符合2S左右的區間. 

緩存的使用的驅逐

+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name                       | Size           │ Pages       │ Cached Size    │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump             | 5.156G         | 1351552     | 5.156G         | 1351552     | 100.000 |
| /root/xxxxxx301_9999.dump  | 5.907G         | 1548592     | 5.144G         | 1348480     | 87.078  |
| /root/xxxxxx301_9999.dump2 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump3 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump4 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump5 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum                        │ 34.693G        │ 9094512     │ 10.300G        │ 2700032     │ 29.689  │
+----------------------------+----------------+-------------+----------------+-------------+---------+

最開始使用第一個文件讀入緩存

內存範圍內可以使用時都是100%

+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name                       | Size           │ Pages       │ Cached Size    │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump             | 12.334G        | 3233248     | 12.334G        | 3233248     | 100.000 |
| /root/xxxxxx301_9999.dump2 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump  | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G         | 1548592     | 515.500M       | 131968      | 8.522   |
| /root/xxxxxx301_9999.dump4 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump5 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum                        │ 41.871G        │ 10976208    │ 24.652G        │ 6462400     │ 58.876  │
+----------------------------+----------------+-------------+----------------+-------------+---------+

內存有壓力的情況下, 第一個讀入緩存的內容開始減少 符合LRU的特點

+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name                       | Size           │ Pages       │ Cached Size    │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump             | 15.948G        | 4180779     | 15.773G        | 4134853     | 98.901  |
| /root/xxxxxx301_9999.dump2 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump  | 5.907G         | 1548592     | 5.752G         | 1507760     | 97.363  |
| /root/xxxxxx301_9999.dump3 | 5.907G         | 1548592     | 4.138G         | 1084800     | 70.051  |
| /root/xxxxxx301_9999.dump4 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump5 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum                        │ 45.485G        │ 11923739    │ 31.570G        │ 8276005     │ 69.408  │
+----------------------------+----------------+-------------+----------------+-------------+---------+

第一個文件讀入的文件 卸載了緩存之後 開始卸載第二個讀入的文件

+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name                       | Size           │ Pages       │ Cached Size    │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump             | 22.097G        | 5792528     | 15.729G        | 4123232     | 71.182  |
| /root/xxxxxx301_9999.dump3 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump2 | 5.907G         | 1548592     | 5.463G         | 1432089     | 92.477  |
| /root/xxxxxx301_9999.dump4 | 5.907G         | 1548592     | 4.382G         | 1148800     | 74.184  |
| /root/xxxxxx301_9999.dump  | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump5 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum                        │ 51.634G        │ 13535488    │ 31.482G        │ 8252713     │ 60.971  │
+----------------------------+----------------+-------------+----------------+-------------+---------+

最終情況  第一個 第二個讀入的完全卸載了內存 第三個卸載了一部分  合併形成的那文件也只有一部分在內存裏面. 

+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name                       | Size           │ Pages       │ Cached Size    │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump             | 29.537G        | 7742960     | 15.770G        | 4133969     | 53.390  |
| /root/xxxxxx301_9999.dump4 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump5 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G         | 1548592     | 3.947G         | 1034672     | 66.814  |
| /root/xxxxxx301_9999.dump  | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump2 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum                        │ 59.074G        │ 15485920    │ 31.532G        │ 8265825     │ 53.376  │
+----------------------------+----------------+-------------+----------------+-------------+---------+


內核參數的驗證

sysctl -a |grep min |grep free
vm.min_free_kbytes = 27729
修改默認值之前的 free -m 結果 free 最小值爲 359MB
              total        used        free      shared  buff/cache   available
Mem:          47005       13795         359          20       32850       32736
Swap:          8079          13        8066

echo 4096000 >/proc/sys/vm/min_free_kbytes
將最小的可用內存修改爲4GB 再次觀察

[root@oracle12c ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          47005       13783        5397          20       27824       21958
Swap:          8079          18        8061

內存在靠近4GB free的時候就開始 回收page caches 了
但是感覺這個參數意義不大, 只是監控效果好看. 並且會造成內存資源的浪費. 

修改之前和之後 文件緩存的最大比率爲:
修改之前 53.376% 修改之後 43.016%

之後的結果爲: 
+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name                       | Size           │ Pages       │ Cached Size    │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump             | 29.537G        | 7742960     | 12.712G        | 3332341     | 43.037  |
| /root/xxxxxx301_9999.dump5 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump4 | 5.907G         | 1548592     | 5.907G         | 1548592     | 100.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G         | 1548592     | 905.688M       | 231856      | 14.972  |
| /root/xxxxxx301_9999.dump  | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
| /root/xxxxxx301_9999.dump2 | 5.907G         | 1548592     | 0B             | 0           | 0.000   |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum                        │ 59.074G        │ 15485920    │ 25.411G        │ 6661381     │ 43.016  │
+----------------------------+----------------+-------------+----------------+-------------+---------+

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章