Docker启动时Jmeter持续在containerd-shim运行,如何彻底移除?
问题描述
去年使用Jmeter做Web性能测试,后来发现预发布环境持续收到大量API访问,才发现Jmeter一直在运行。排查后发现Ubuntu 22.04机器上的Jmeter进程在containerd-shim中,每次启动Docker(sudo systemctl start docker)都会跟着启动,可通过ps aux | grep jmeter和pstree -p | grep jmeter查看进程。尝试用sudo kill -9 [pid]杀死进程会自动重启;执行docker ps -a和docker images无任何结果;停止containerd(sudo systemctl stop containerd)能终止Jmeter,但重启Docker后又会恢复。需要彻底停止并移除这个containerd中的Jmeter进程。
附上进程排查输出:
irene@irene-OP-LP2:~$ ps aux | grep jmeter root 21933 0.0 0.0 2220 1584 ? Ss 11:30 0:00 bash /jmeter/bin/run-lp-endpoint-tests.sh root 21966 0.0 0.0 1584 888 ? S 11:30 0:00 /bin/sh /opt/apache-jmeter-5.4.2/bin/jmeter -n -t /jmeter/tests/z-api/lp-endpoints.jmx -l log -f -e -o output/results -JtestGroup= -Jhost= -Jprotocol= -Jport= -Jthreads= -JloopCount= root 22008 4.8 0.7 2597216 186152 ? Sl 11:30 0:05 /usr/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -jar /opt/apache-jmeter-5.4.2/bin/ApacheJMeter.jar -n -t /jmeter/tests/z-api/lp-endpoints.jmx -l log -f -e -o output/results -JtestGroup= -Jhost= -Jprotocol= -Jport= -Jthreads= -JloopCount= irene 22123 0.0 0.0 10124 2400 pts/0 S+ 11:32 0:00 grep --color=auto jmeter irene@irene-OP-LP2:~$ pstree -p | grep jmeter |-containerd-shim(21912)-+-bash(21933)---jmeter(21966)---java(22008)-+-{java}(22009)
解决方案
1. 通过containerd原生工具清理残留容器
由于Docker依赖containerd作为运行时,而docker ps无法识别到该容器,直接用containerd的命令行工具ctr处理:
- 列出所有containerd管理的容器:
找到对应Jmeter进程的容器ID(可通过进程关联的路径或名称判断)sudo ctr containers list - 停止容器对应的任务:
sudo ctr tasks kill -s SIGKILL <容器ID> - 删除该容器:
sudo ctr containers rm <容器ID> - 检查是否还有遗留任务,如有则删除:
sudo ctr tasks list sudo ctr tasks rm <任务ID>
2. 清理containerd运行时残留目录
如果上述操作后仍有问题,手动清理containerd的runtime目录:
- 停止Docker和containerd服务:
sudo systemctl stop docker containerd - 删除对应容器的runtime目录(默认路径下,子目录名为容器ID):
sudo rm -rf /run/containerd/io.containerd.runtime.v2.task/moby/<容器ID> - 重启服务:
sudo systemctl start docker
3. 彻底重置Docker/containerd数据(谨慎操作)
如果前两步都无效,可彻底清理Docker和containerd的所有数据(注意:这会删除所有本地容器、镜像、卷等,需备份重要数据):
- 停止相关服务:
sudo systemctl stop docker containerd docker.socket - 删除所有数据目录:
sudo rm -rf /var/lib/docker /var/lib/containerd /run/containerd - 重新启动服务:
sudo systemctl start docker
内容的提问来源于stack exchange,提问作者tokyo-dev-onna
相关产品推荐
相关产品推荐

