首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >诊断Docker for Mac上的高CPU使用率

诊断Docker for Mac上的高CPU使用率
EN

Stack Overflow用户
提问于 2019-10-08 06:13:01
回答 7查看 31.9K关注 0票数 79

如何诊断MacOS,特别是com.docker.hyperkit占用100%cpu的原因?

Docker统计信息

Docker的统计数据显示,所有正在运行的容器的CPU、内存、net IO和block IO都很低。

iosnoop

iosnoop显示,com.docker.hyperkit每秒对文件Docker.qcow2执行大约50次写操作,总计500KB /秒。根据What is Docker.qcow2?的说法,Docker是一个稀疏文件,它是所有Docker.qcow2容器的持久存储。

在我的例子中,文件并没有那么稀疏。物理大小与逻辑大小匹配。

dtrace (dtruss)

dtruss sudo dtruss -p $DOCKER_PID显示了大量的psynch_cvsignalpsynch_cvwait调用。

代码语言:javascript
复制
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

代码语言:javascript
复制
docker run -it --rm --pid host busybox top

docker嵌入式主机的CPU使用率约为3%。我的MacBook上的CPU使用率约为100%。因此,docker嵌入式主机不会导致CPU使用率峰值。

更新:运行大多数常见堆栈跟踪的dtrace脚本

在下面的答案中,堆栈跟踪来自dtrace脚本:https://stackoverflow.com/a/58293035/30900

这些内核堆栈跟踪看起来是无害的。

代码语言:javascript
复制
              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个线程。

代码语言:javascript
复制
              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%。

EN

回答 7

Stack Overflow用户

发布于 2019-11-26 04:04:42

我也有同样的问题。删除所有卷后,我的CPU %恢复正常。

代码语言:javascript
复制
docker system prune --volumes

我还手动删除了一些命名卷:

代码语言:javascript
复制
docker volume rm NameOfVolumeHere

这并没有解决不能与Docker for mac一起使用卷的整体问题。现在,我只是在注意我使用的卷的数量,并在不使用的时候关闭Docker桌面。

票数 38
EN

Stack Overflow用户

发布于 2019-10-09 03:56:13

我怀疑这个问题与IO有关。对于MacOS卷,这涉及到osxfs,您可以在其中执行一些性能调优。主要是,如果您可以接受较少的一致性检查,则可以将卷模式设置为delegated以获得更快的性能。有关更多细节,请参阅文档:https://docs.docker.com/docker-for-mac/osxfs-caching/。但是,如果您的图像包含大量的小文件,性能将受到影响,特别是如果您也有大量的图像层。

您还可以尝试使用以下命令来调试docker使用的嵌入式VM中的任何进程问题:

代码语言:javascript
复制
docker run -it --rm --pid host busybox top

(要退出,请使用<ctrl>-c)

若要追踪是否为IO,您也可以尝试以下操作:

代码语言:javascript
复制
$ docker run -it --rm --pid host alpine /bin/sh
$ apk add sysstat
$ pidstat -d 5 12

它将在运行在VM pid名称空间中的高山容器内运行,显示来自任何进程的任何IO,无论该进程是否在容器内。统计数据是在一分钟(12次)内每5秒统计一次,然后它会给出每个进程的平均表。然后您可以使用<ctrl>-d来销毁高山容器。

从评论和编辑中,这些统计数据可能会得到验证。4核MBP有8个线程,所以如果MacOS报告与其他基于Unix的系统相同,那么完整的CPU利用率应该是800%。在VM内部,top命令中显示的过去一分钟的平均负载超过100% (尽管低于5和15的平均值),这与您在主机上看到的hyperkit进程大致相同。从顶部开始,即时使用率超过12%,而不是3%,因为您需要添加系统和用户百分比。pidstat中显示的IO数量与您看到的写入qcow2映像的数量大致一致。

如果docker引擎本身正在颠簸(例如,重新启动容器,或运行大量健康检查),则可以通过查看以下命令的输出进行调试:

代码语言:javascript
复制
docker events
票数 16
EN

Stack Overflow用户

发布于 2020-06-30 11:28:30

将卷更改为使用委派配置对我很有效,并导致CPU使用率急剧下降。请参阅文档:https://docs.docker.com/docker-for-mac/osxfs-caching/#delegated

如何在我的docker-compose.yml中设置:

代码语言:javascript
复制
version: "3"
services: 
  my_service:
    image: python3.6
    ports:
      - "80:10000"
    volumes:
      - ./code:/www/code:cached

对我来说这是可行的,macOS 10.15.5,Docker Desktop 2.3.0

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58277794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档