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 │
+----------------------------+----------------+-------------+----------------+-------------+---------+