Docker技巧
基础应用篇¶
docker修改文件,主机无权限¶
| Text Only | |
|---|---|
docker 打包镜像¶
docker运行命令示例¶
| Text Only | |
|---|---|
Docker进程监控–内存篇¶
查看内存是否泄露,可以关注:
- memory.stat[rss]
- free 命令的available(包括free字段和page cache字段)
- top命令 进程对应的RES值
- cat /proc/1442/status | grep RSS
- vmstat 2 (每隔2s打印free值)
- cat /proc/1442/status | grep VmSize (vmpeak:进程历史上使用的最大虚拟内存大小,单位为字节。vmsize:进程当前使用的虚拟内存大小,单位为字节。)
如果一个进程一直在malloc数据,但是没有使用,且没有free内存,应该关注虚拟内存是否上涨。 判断程序或者容器是否OMM-kill,可以关注:
- journalctl -k
- docker inspect 中的status
我们通过查看内核的日志,使用用 journalctl -k 命令,或者直接查看日志文件 /var/log/message,我们会发现当容器发生 OOM Kill 的时候,内核会输出下面的这段信息,大致包含下面这三部分的信息:
第一个部分就是容器里每一个进程使用的内存页面数量。在”rss”列里,“rss’是 Resident Set Size 的缩写,指的就是进程真正在使用的物理内存页面数量。
从这里我们发现,Page Cache 内存对我们判断容器实际内存使用率的影响,目前 Page Cache 完全就是Linux 内核的一个自动的行为,只要读写磁盘文件,只要有空闲的内存,就会被用作 Page Cache。
所以,判断容器真实的内存使用量,我们不能用 Memory Cgroup 里的memory.usage_in_bytes(rss + Page Cache),而需要用memory.stat里的 rss 值。
这个很像我们用free命令查看节点的可用内存,不能看”free”字段下的值,而要看包括 Page Cache 之后的”available”字段下的值。free 和 available 的区别在于,free 表示系统中真正空闲的内存,而 available 表示系统当前可以用来分配给新进程的内存,包括了部分用作缓存的内存。
使用top命令查看:对应进程的VIRT对应的是malloc等方式申请的虚拟内存,RES和RSS相同,代表的是实际使用的物理页面大小。
参考:
【精选】Docker 容器内存:我的容器为什么被杀了?_docker oomkilled-CSDN博客
【精选】09 | Page Cache:为什么我的容器内存使用量总是在临界点?_res pagecache-CSDN博客