【发布时间】:2020-02-05 05:39:17
【问题描述】:
如何在 MacOS 上诊断 Docker 的原因,特别是 com.docker.hyperkit 使用 100% 的 CPU?
Docker 统计数据
Docker stats 显示所有正在运行的容器的 CPU、内存、网络 IO 和块 IO 都很低。
iosnoop
iosnoop 显示com.docker.hyperkit 每秒对文件Docker.qcow2 执行大约50 次写入,总计每秒500KB。根据What is Docker.qcow2?,Docker.qcow2 是一个稀疏文件,是所有 Docker 容器的持久存储。
在我的情况下,文件不是那么稀疏。物理大小与逻辑大小匹配。
dtrace (dtruss)
dtruss sudo dtruss -p $DOCKER_PID 显示大量的psynch_cvsignal 和psynch_cvwait 调用。
psynch_cvsignal(0x7F9946002408, 0x4EA701004EA70200, 0x4EA70100) = 257 0
psynch_mutexdrop(0x7F9946002318, 0x5554700, 0x5554700) = 0 0
psynch_mutexwait(0x7F9946002318, 0x5554702, 0x5554600) = 89474819 0
psynch_cvsignal(0x10BF7B470, 0x4C8095004C809600, 0x4C809300) = 257 0
psynch_cvwait(0x10BF7B470, 0x4C8095014C809600, 0x4C809300) = 0 0
psynch_cvwait(0x10BF7B470, 0x4C8096014C809700, 0x4C809600) = -1 Err#316
psynch_cvsignal(0x7F9946002408, 0x4EA702004EA70300, 0x4EA70200) = 257 0
psynch_cvwait(0x7F9946002408, 0x4EA702014EA70300, 0x4EA70200) = 0 0
psynch_cvsignal(0x10BF7B470, 0x4C8097004C809800, 0x4C809600) = 257 0
psynch_cvwait(0x10BF7B470, 0x4C8097014C809800, 0x4C809600) = 0 0
psynch_cvwait(0x10BF7B470, 0x4C8098014C809900, 0x4C809800) = -1 Err#316
更新:Docker 主机上的top
来自https://stackoverflow.com/a/58293240/30900:
docker run -it --rm --pid host busybox top
docker 嵌入式主机的 CPU 使用率约为 3%。我的 MacBook 上的 CPU 使用率约为 100%。因此,docker 嵌入式主机不会导致 CPU 使用率飙升。
更新:运行最常见堆栈跟踪的 dtrace 脚本
来自以下答案中的 dtrace 脚本的堆栈跟踪:https://stackoverflow.com/a/58293035/30900。
这些内核堆栈跟踪看起来无害。
AppleIntelLpssGspi`AppleIntelLpssGspi::regRead(unsigned int)+0x1f
AppleIntelLpssGspi`AppleIntelLpssGspi::transferMmioDuplexMulti(void*, void*, unsigned long long, unsigned int)+0x91
AppleIntelLpssSpiController`AppleIntelLpssSpiController::transferDataMmioDuplexMulti(void*, void*, unsigned int, unsigned int)+0xb2
AppleIntelLpssSpiController`AppleIntelLpssSpiController::_transferDataSubr(AppleInfoLpssSpiControllerTransferDataRequest*)+0x5bc
AppleIntelLpssSpiController`AppleIntelLpssSpiController::_transferData(AppleInfoLpssSpiControllerTransferDataRequest*)+0x24f
kernel`IOCommandGate::runAction(int (*)(OSObject*, void*, void*, void*, void*), void*, void*, void*, void*)+0x138
AppleIntelLpssSpiController`AppleIntelLpssSpiDevice::transferData(IOMemoryDescriptor*, void*, unsigned long long, unsigned long long, IOMemoryDescriptor*, void*, unsigned long long, unsigned long long, unsigned int, AppleIntelSPICompletion*)+0x151
AppleHSSPISupport`AppleHSSPIController::transferData(IOMemoryDescriptor*, void*, unsigned long long, unsigned long long, IOMemoryDescriptor*, void*, unsigned long long, unsigned long long, unsigned int, AppleIntelSPICompletion*)+0xcc
AppleHSSPISupport`AppleHSSPIController::doSPITransfer(bool, AppleHSSPITransferRetryReason*)+0x97
AppleHSSPISupport`AppleHSSPIController::InterruptOccurred(IOInterruptEventSource*, int)+0xf8
kernel`IOInterruptEventSource::checkForWork()+0x13c
kernel`IOWorkLoop::runEventSources()+0x1e2
kernel`IOWorkLoop::threadMain()+0x2c
kernel`call_continuation+0x2e
53
kernel`waitq_wakeup64_thread+0xa7
pthread`__psynch_cvsignal+0x495
pthread`_psynch_cvsignal+0x28
kernel`psynch_cvsignal+0x38
kernel`unix_syscall64+0x27d
kernel`hndl_unix_scall64+0x16
60
kernel`hndl_mdep_scall64+0x4
113
kernel`ml_set_interrupts_enabled+0x19
524
kernel`ml_set_interrupts_enabled+0x19
kernel`hndl_mdep_scall64+0x10
5890
kernel`machine_idle+0x2f8
kernel`call_continuation+0x2e
43395
用户空间中超过 17 秒的最常见堆栈跟踪明显涉及 com.docker.hyperkit。在 17 秒内有 1365 个堆栈跟踪,其中com.docker.hyperkit 创建了平均每秒 80 个线程的线程。
com.docker.hyperkit`0x000000010cbd20db+0x19f9
com.docker.hyperkit`0x000000010cbdb98c+0x157
com.docker.hyperkit`0x000000010cbf6c2d+0x4bd
libsystem_pthread.dylib`_pthread_body+0x7e
libsystem_pthread.dylib`_pthread_start+0x42
libsystem_pthread.dylib`thread_start+0xd
19
Hypervisor`hv_vmx_vcpu_read_vmcs+0x1
com.docker.hyperkit`0x000000010cbd4c4f+0x2a
com.docker.hyperkit`0x000000010cbd20db+0x174a
com.docker.hyperkit`0x000000010cbdb98c+0x157
com.docker.hyperkit`0x000000010cbf6c2d+0x4bd
libsystem_pthread.dylib`_pthread_body+0x7e
libsystem_pthread.dylib`_pthread_start+0x42
libsystem_pthread.dylib`thread_start+0xd
22
Hypervisor`hv_vmx_vcpu_read_vmcs
com.docker.hyperkit`0x000000010cbdb98c+0x157
com.docker.hyperkit`0x000000010cbf6c2d+0x4bd
libsystem_pthread.dylib`_pthread_body+0x7e
libsystem_pthread.dylib`_pthread_start+0x42
libsystem_pthread.dylib`thread_start+0xd
34
com.docker.hyperkit`0x000000010cbd878d+0x36
com.docker.hyperkit`0x000000010cbd20db+0x42f
com.docker.hyperkit`0x000000010cbdb98c+0x157
com.docker.hyperkit`0x000000010cbf6c2d+0x4bd
libsystem_pthread.dylib`_pthread_body+0x7e
libsystem_pthread.dylib`_pthread_start+0x42
libsystem_pthread.dylib`thread_start+0xd
47
Hypervisor`hv_vcpu_run+0xd
com.docker.hyperkit`0x000000010cbd20db+0x6b6
com.docker.hyperkit`0x000000010cbdb98c+0x157
com.docker.hyperkit`0x000000010cbf6c2d+0x4bd
libsystem_pthread.dylib`_pthread_body+0x7e
libsystem_pthread.dylib`_pthread_start+0x42
libsystem_pthread.dylib`thread_start+0xd
135
相关问题
Github - docker/for-mac:com.docker.hyperkit 100% cpu usage is back again #3499 。一条评论建议添加此处描述的卷缓存:https://www.docker.com/blog/user-guided-caching-in-docker-for-mac/。我试过了,CPU 使用率降低了约 10%。
【问题讨论】:
-
您在构建图像吗?我还将专注于执行大量块 IO 的容器。是否启用 Kubernetes 也很重要。
-
我在集群构建并运行几分钟后收集了所有指标。 Kubernetes 已禁用。但是,没有一台机器执行大量的块 IO。容器没有做任何事情。我注意到 CPU 使用率似乎与容器数量大致相关。
-
你的机器有多少个内核/cpu?
-
另外,您是否尝试过重启 docker,而不是容器,而是整个引擎和桌面客户端?
-
我运行的是 2018 MBP 2.8 GHz Core i7,有 4 个内核。我尝试调整 Docker 引擎的 CPU 内核数量。我尝试了 1、3、4 和 6 核。限制为 docker 将 CPU 使用率从 100% 降低到 60%。
标签: macos docker profiling dtrace