阿里云安装docker版的emqx,磁盘空间占用几十G,但是docker stat xxxx又没有大文件,请问,如何排查到底哪里占用了空间
docker stats 不统计磁盘占用。先定位空间是在 Docker 的镜像/可写层、容器 stdout 日志,还是 EMQX 的挂载目录。
把 emqx 换成你的容器名,执行:
cid=emqx
docker ps --size --filter "name=$cid"
docker system df -v
docker inspect "$cid" --format 'LogPath={{.LogPath}}'
docker inspect "$cid" --format '{{range .Mounts}}{{println .Type .Source "->" .Destination}}{{end}}'
log=$(docker inspect "$cid" --format '{{.LogPath}}')
if [ -n "$log" ]; then
sudo ls -lh "$log"
fi
docker exec "$cid" sh -c 'du -sh /opt/emqx/data/* /opt/emqx/log/* 2>/dev/null | sort -h'
sudo du -xhd1 /var/lib/docker | sort -h
LogPath很大:Docker 的json-file日志没限制;EMQX Docker 默认向 console 输出,内容会进入这里。/opt/emqx/log很大:检查emqx.log、轮转文件和trace目录。EMQX 文件日志正常应配置rotation_size和rotation_count。/opt/emqx/data很大:继续看mnesia等子目录;不要直接删除,这里面可能有认证、授权、告警和运行数据。/var/lib/docker/overlay2很大,但挂载目录不大:通常是容器可写层或旧镜像/构建缓存。
如果 df -h 显示空间已占用,但上面的 du 对不上,再执行:
sudo lsof +L1 /var/lib/docker
不要跑 docker system prune,也不要删除 /opt/emqx/data/mnesia。把以上输出、EMQX 版本,以及 Compose 里的 volumes 和 logging 段贴一下。
我用以下指令运行容器:
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
后来发现空间不够,在/etc/docker/daemon.json加了这个:
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “10m”,
“max-file”: “3”
}
然后删除容器,重新建了一个新容器,使用df -h查看,还是占用很大空间:
[root@iZbp11z4s41hgvz6f3bay1Z ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.7G 16K 3.7G 1% /dev/shm
tmpfs 3.7G 648K 3.7G 1% /run
tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/vda3 99G 32G 63G 34% /
/dev/vda2 200M 5.9M 194M 3% /boot/efi
tmpfs 747M 0 747M 0% /run/user/1002
tmpfs 747M 0 747M 0% /run/user/0
overlay 99G 32G 63G 34% /var/lib/docker/overlay2/7695d30d3c22be0e82077a290e10cf5957a84634ce441b836579e50eb3abc339/merged
---------------------------------- 下面您提供的指令的执行结果-------------------
[root@iZbp11z4s41hgvz6f3bay1Z ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ad4a717eb36 emqx/emqx:latest “/usr/bin/docker-ent…” 2 hours ago Up 2 hours 4370/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:8083-8084->8083-8084/tcp, :::8083-8084->8083-8084/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcp, 5369/tcp emqx
[root@iZbp11z4s41hgvz6f3bay1Z ~]# cid=6ad4a717eb36
[root@iZbp11z4s41hgvz6f3bay1Z ~]# docker ps --size --filter “name=$cid”
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
[root@iZbp11z4s41hgvz6f3bay1Z ~]# docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
emqx/emqx latest 37416ecf4500 2 weeks ago 291MB 0B 291MB 1
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
6ad4a717eb36 emqx/emqx:latest “/usr/bin/docker-ent…” 2 0B 2 hours ago Up 2 hours emqx
Local Volumes space usage:
VOLUME NAME LINKS SIZE
2b337dbaa8a5965cb0074c5dd5c649ea71c3f815d0344c286c558ce17419b65b 1 480.3kB
c44921e367c362db683734d5ceee7cbcbd8d9f75669658599140beb5f3de5b1d 1 0B
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
[root@iZbp11z4s41hgvz6f3bay1Z ~]# docker inspect “$cid” --format ‘LogPath={{.LogPath}}’
LogPath=/var/lib/docker/containers/6ad4a717eb36266f466004d6c53a5797c6e3485d96830f8c64f0e04f56711be2/6ad4a717eb36266f466004d6c53a5797c6e3485d96830f8c64f0e04f56711be2-json.log
[root@iZbp11z4s41hgvz6f3bay1Z ~]# docker inspect “$cid” --format ‘{{range .Mounts}}{{println .Type .Source “->” .Destination}}{{end}}’
volume /var/lib/docker/volumes/c44921e367c362db683734d5ceee7cbcbd8d9f75669658599140beb5f3de5b1d/_data → /opt/emqx/log
volume /var/lib/docker/volumes/2b337dbaa8a5965cb0074c5dd5c649ea71c3f815d0344c286c558ce17419b65b/_data → /opt/emqx/data
[root@iZbp11z4s41hgvz6f3bay1Z ~]# log=$(docker inspect “$cid” --format ‘{{.LogPath}}’)
[root@iZbp11z4s41hgvz6f3bay1Z ~]# if [ -n “$log” ]; then
sudo ls -lh “$log”
fi
-rw-r----- 1 root root 2.9K Jul 24 09:59 /var/lib/docker/containers/6ad4a717eb36266f466004d6c53a5797c6e3485d96830f8c64f0e04f56711be2/6ad4a717eb36266f466004d6c53a5797c6e3485d96830f8c64f0e04f56711be2-json.log
[root@iZbp11z4s41hgvz6f3bay1Z ~]# docker exec “$cid” sh -c ‘du -sh /opt/emqx/data/* /opt/emqx/log/* 2>/dev/null | sort -h’
4.0K /opt/emqx/data/cluster.uuid
4.0K /opt/emqx/data/node.uuid
4.0K /opt/emqx/data/patches
4.0K /opt/emqx/data/scripts
4.0K /opt/emqx/data/trace
8.0K /opt/emqx/data/ds
16K /opt/emqx/data/configs
18M /opt/emqx/data/mnesia
[root@iZbp11z4s41hgvz6f3bay1Z ~]# sudo du -xhd1 /var/lib/docker | sort -h
4.0K /var/lib/docker/runtimes
4.0K /var/lib/docker/swarm
4.0K /var/lib/docker/tmp
16K /var/lib/docker/plugins
60K /var/lib/docker/containers
68K /var/lib/docker/network
116K /var/lib/docker/buildkit
868K /var/lib/docker/image
18M /var/lib/docker/volumes
301M /var/lib/docker/overlay2
320M /var/lib/docker
[root@iZbp11z4s41hgvz6f3bay1Z ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.7G 16K 3.7G 1% /dev/shm
tmpfs 3.7G 648K 3.7G 1% /run
tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/vda3 99G 32G 63G 34% /
/dev/vda2 200M 5.9M 194M 3% /boot/efi
tmpfs 747M 0 747M 0% /run/user/1002
tmpfs 747M 0 747M 0% /run/user/0
overlay 99G 32G 63G 34% /var/lib/docker/overlay2/7695d30d3c22be0e82077a290e10cf5957a84634ce441b836579e50eb3abc339/merged
[root@iZbp11z4s41hgvz6f3bay1Z ~]# sudo lsof +L1 /var/lib/docker
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
mysqld 2270 mysql 5u REG 253,3 0 0 132890 /tmp/#132890 (deleted)
mysqld 2270 mysql 6u REG 253,3 0 0 134832 /tmp/#134832 (deleted)
mysqld 2270 mysql 7u REG 253,3 0 0 134835 /tmp/#134835 (deleted)
mysqld 2270 mysql 13u REG 253,3 0 0 134836 /tmp/#134836 (deleted)
BT-Task 2394013 root 1u REG 0,23 0 0 2323047 /dev/shm/#2323047 (deleted)
BT-Task 2394013 root 2u REG 0,23 0 0 2323048 /dev/shm/#2323048 (deleted)
aliyun-se 3843007 root 7uW REG 253,3 0 0 131136 /tmp/AliyunAssistClientSingleLock.lock (deleted)
再麻烦您看看
或者,是不是因为我没挂载卷,所以这个容器的空间,统计的是我们运行网站的空间?(我们这个服务器,同时有运行一个网站,会有比较多的文件和一些日志文件。)
这 32G 不是 EMQX 占的。你贴的结果已经把 Docker 排除了:镜像 291MB、容器可写层 0B、/var/lib/docker 总共 320MB、EMQX 数据 18MB、容器日志 2.9KB。
df -h 里的这两行是同一块 /dev/vda3:
/dev/vda3 99G 32G 63G 34% /
overlay 99G 32G 63G 34% .../merged
overlay 只是把宿主机根文件系统挂进容器后的视图,不是容器额外占了 32G,也不会把网站文件算成 EMQX 文件。
虽然 docker run 没写 -v,这个镜像仍为 /opt/emqx/data 和 /opt/emqx/log 自动创建了两个匿名卷;docker inspect 已经显示出来了。目前它们合计只有约 18MB。
可以继续从宿主机根目录找 32G 在哪里:
sudo du -xhd1 / 2>/dev/null | sort -h
sudo find / -xdev -type f -size +1G -printf '%s %p\n' 2>/dev/null | sort -n
sudo journalctl --disk-usage
先看第一条输出里最大的目录,再对那个目录继续执行 du -xhd1。如果网站放在 /www、/data、/home 或 /var/www,大文件和日志会在这里暴露出来。
如果 du -xhd1 / 汇总明显小于 df 的 32G,再执行不限定 Docker 目录的:
sudo lsof +L1
你前面列出的 deleted 文件大小都是 0,不是这 32G 的来源。把 du -xhd1 / 的输出贴出来即可,EMQX 这边不需要再删数据。
[root@iZbp11z4s41hgvz6f3bay1Z ~]# sudo du -xhd1 / 2>/dev/null | sort -h
4.0K /media
4.0K /mnt
4.0K /srv
8.0K /.Recycle_bin
16K /lost+found
36K /home
52K /tmp
44M /etc
49M /root
183M /boot
374M /opt
1.1G /var
4.9G /usr
25G /www
32G /
应该就是网站本身占用的,非常感谢!!!