首页 > 解决方案 > Ubuntu 18.04 上的 Docker 容器中的进程运行缓慢

问题描述

在 Ubuntu 18 机器上的 Docker 容器中运行进程需要时间。但是具有相同 Docker 版本的相同进程在 Ubuntu 16 机器上运行良好。

我有一个节点应用程序正在侦听某个端口。接受路径“/”和“/docker”上的获取请求,它们分别在主机和 Docker 容器中简单地运行命令“whoami”并返回结果。具有相同 Docker 容器的相同节点应用程序在两台机器(Ubuntu 16 和 Ubuntu 18)上运行。

首先,我尝试向两台机器发送 20 个带有路径“/”的并发获取请求。两台机器平均执行命令的时间为
35-40 毫秒。

其次,我尝试向两台机器发送 20 个带有路径“/docker”的并发获取请求。在这里,Ubuntu 16 机器最多耗时 4.3 秒,平均耗时 3 秒。但是 Ubuntu 18 机器最多耗时 10 秒,平均耗时 9 秒。

我多次尝试上述测试,得出的结论是,在 Docker 内部运行进程时,与 Ubuntu 16 相比,在 Ubuntu 18 机器中执行所需的时间几乎是 Ubuntu 16 的两倍。

我检查了以下内容:

  1. 我尝试通过tophtop在达到 20 个请求时进行监控。但那里的一切似乎都一样。

  2. 还尝试使用perf命令进行监视。但在那里找不到任何不寻常的差异。但是我不是很习惯执行命令,因此无法清楚地理解。

  3. 这 20 个请求正在处理中。我手动运行相同的 Docker 命令strace。并发现随机结果,即有时在 Ubuntu 18 上花费时间clock_gettimefutex (FUTEX_WAIT)有时在+++ exited with 0 +++消息中,但在 Ubuntu 16 上花费的时间更少。

以下是我正在使用和运行的不同配置和代码片段:

Machine1:提供更好的性能。
节点 v10.16.0
npm 6.9.0
码头工人 18.09.8
ubuntu 16.04.3 LTS,xenial

Machine2:性能不佳。
节点 v10.16.0
npm 6.9.0
码头工人 18.09.8
ubuntu 18.04.2 LTS,仿生

节点应用程序代码片段:

// for path "/docker"
var excuteInDocker = function() {
    var cmd = "docker";
    var args = ["exec", "ubuntu", "whoami"];
    return executeCmd(cmd, args);
}

// for path "/"
var execute = function(){
    var cmd = 'whoami';
    var args = [];
    return executeCmd(cmd, args);
}

docker infoubuntu 16 和 18 通用的输出:

Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 2
Server Version: 18.09.8
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
init version: fec3683
Security Options:
 apparmor
 seccomp
  Profile: default
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.296GiB
Name: myhostname
ID: LLLO:OMTS:PNNM:T3MP:AD2F:UMDG:IIZK:OGBO:3ZLL:YDBX:ONAO:AY5G
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 27
 Goroutines: 42
 System Time: 2019-07-25T15:25:54.991694211+05:30
 EventsListeners: 0
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine

WARNING: No swap limit support

docker info特定于 Ubuntu 16:

Kernel Version: 4.4.0-112-generic
Operating System: Ubuntu 16.04.3 LTS
Total Memory: 7.303GiB
ID: FOFI:RW7N:RZSP:HHKH:BKS3:LMWL:TC2J:W7V2:222Y:Q2AU:XMU3:KLU7

docker info特定于 Ubuntu 18:

Kernel Version: 4.15.0-1040-aws
Operating System: Ubuntu 18.04.2 LTS
Total Memory: 7.296GiB
ID: LLLO:OMTS:PNNM:T3MP:AD2F:UMDG:IIZK:OGBO:3ZLL:YDBX:ONAO:AY5G

Ubuntu 16 机器数据:

1. 执行时间数据

2019-07-25 14:06:42.851 INFO  uid: 540ae880-aeb7-11e9-919d-dd32b3cf84d5 time: 475 result: {"success":true,"data":"root"}
2019-07-25 14:06:43.183 INFO  uid: 54145e60-aeb7-11e9-919d-dd32b3cf84d5 time: 745 result: {"success":true,"data":"root"}
2019-07-25 14:06:45.711 INFO  uid: 540c4810-aeb7-11e9-919d-dd32b3cf84d5 time: 3326 result: {"success":true,"data":"root"}
.
.
.
2019-07-25 14:06:46.835 INFO  uid: 541d5f10-aeb7-11e9-919d-dd32b3cf84d5 time: 4338 result: {"success":true,"data":"root"}
  1. 命令日志strace -t docker exec ubuntu whoami

命令 strace Ubuntu 16 的日志

  1. 结果perf top --sort comm,dso

perf 命令的结果 Ubuntu 16


Ubuntu 18 机器数据:

1. 执行时间数据:

2019-07-25 14:07:32.559 INFO  uid: 715a6af0-aeb7-11e9-a5a9-2fffd4e800d1 time: 1008 result: {"success":true,"data":"root"}
2019-07-25 14:07:32.941 INFO  uid: 7178c860-aeb7-11e9-a5a9-2fffd4e800d1 time: 1191 result: {"success":true,"data":"root"}
2019-07-25 14:07:40.363 INFO  uid: 71767e70-aeb7-11e9-a5a9-2fffd4e800d1 time: 8628 result: {"success":true,"data":"root"}
.
.
.
2019-07-25 14:07:41.970 INFO  uid: 718af0d0-aeb7-11e9-a5a9-2fffd4e800d1 time: 10101 result: {"success":true,"data":"root"}

  1. 命令日志strace -t docker exec ubuntu whoami

命令 strace Ubuntu 18 的日志

  1. 结果perf top --sort comm,dso

perf 命令的结果 Ubuntu 18

所以,我需要帮助来调试 Ubuntu 18 机器上的 Docker 有什么问题。或者,如果 Ubuntu 18 上的 Docker 有任何限制,或者可能是某些机器或 Docker 配置问题。

标签: performancedockerubuntu-18.04

解决方案


我在桌面上没有遇到这样的问题,但是 mysql 容器以我无法在我的 ubuntu 笔记本电脑上理解的方式运行非常缓慢。这个解决方案解决了我的问题。


推荐阅读