docker stats 跟 RSS的差距

今天用戶回報,他觀看memory usage的時候

發現使用docker stats指令看得使用量跟實際用ps aux看到的使用量有很大的差距

使用ps指令觀看RSS記憶體使用量

$ docker exec  my-app ps -o rss,vsz,sz 1
  RSS    VSZ    SZ
945120 23754744 5938686

RSS是物理記憶體使用量,當初設定記憶體監控的時候是以這個為準

可是登上server的時候使用docker指令去看卻差了很多

docker stats my-app
CONTAINER           CPU %               MEM USAGE / LIMIT   MEM %               NET I/O             BLOCK I/O           PIDS
my-app        14.02%              1.965GiB / 5GiB     33.31%              0B / 0B             8.25MB / 50.1MB     276

使用ps指令看到的只有900多MB,使用docker指令看卻有1.96GiB

上網收尋了一下資料

查到了

Note: On Linux, the Docker CLI reports memory usage by subtracting page cache usage from the total memory usage. The API does not perform such a calculation but rather provides the total memory usage and the amount from the page cache so that clients can use the data as needed.

使用docker stats的時候,顯示的是RSS+Cache的使用量

想要看詳細記憶體使用量可以用下面的指令

cat /sys/fs/cgroup/memory/docker/$CONTAINER_ID/memory.stat
cache 1203441664
rss 938504192
rss_huge 0
mapped_file 4300800
swap 0
pgpgin 4679655
pgpgout 4156719
pgfault 99018704
pgmajfault 388
inactive_anon 4096
active_anon 938471424
inactive_file 799027200
active_file 404389888
unevictable 0
hierarchical_memory_limit 5368709120
hierarchical_memsw_limit 10737418240
total_cache 1203441664
total_rss 938504192
total_rss_huge 0
total_mapped_file 4300800
total_swap 0
total_pgpgin 4679655
total_pgpgout 4156719
total_pgfault 99018704
total_pgmajfault 388
total_inactive_anon 4096
total_active_anon 938471424
total_inactive_file 799027200
total_active_file 404389888
total_unevictable 0

這會影響的是如果我設定docker container的memory limit的時候,必須考慮RSS+Cache的使用量才行

有個方法可以手動的清掉cache

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

用上面的指令可以暫時舒緩container的記憶體使用

這邊做個紀錄

comments powered by Disqus