php - Docker 项目要慢得多
问题描述
我所做的是将项目转移到使用 docker 容器。这个项目非常大,我最终得到了大约 12 个容器。
现在有 2 台相同的服务器运行 Ubuntu 18.04。
- 在第一台服务器上,项目照常部署:运行Nginx、PHP7.2-fpm、MySQL5.7等服务。
- 在第二台服务器上,在 docker 上提出了一个项目
问题的症结在于,在测试两台服务器处理多个请求的速度时,docker上的服务器表现出的性能要差得多。
这是原始服务器上的项目(使用 ApacheBench n100 c100 测试):
Server Software: nginx
Server Hostname: test.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
TLS Server Name: test.com
Document Path: /
Document Length: 119121 bytes
Concurrency Level: 100
Time taken for tests: 1.827 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 12038500 bytes
HTML transferred: 11912100 bytes
Requests per second: 54.74 [#/sec] (mean)
Time per request: 1826.828 [ms] (mean)
Time per request: 18.268 [ms] (mean, across all concurrent requests)
Transfer rate: 6435.39 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 144 152 4.4 152 160
Processing: 50 899 469.8 938 1660
Waiting: 48 896 469.7 936 1658
Total: 203 1051 473.8 1090 1819
Percentage of the requests served within a certain time (ms)
50% 1090
66% 1330
75% 1458
80% 1550
90% 1702
95% 1770
98% 1815
99% 1819
100% 1819 (longest request)
这是一个 docker 项目(使用 ApacheBench n100 c100 进行测试):
Server Software: nginx/1.19.1
Server Hostname: test-dev.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
TLS Server Name: test-dev.com
Document Path: /
Document Length: 724822 bytes
Concurrency Level: 100
Time taken for tests: 12.573 seconds
Complete requests: 100
Failed requests: 99
(Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
Non-2xx responses: 100
Total transferred: 72592310 bytes
HTML transferred: 72476910 bytes
Requests per second: 7.95 [#/sec] (mean)
Time per request: 12572.860 [ms] (mean)
Time per request: 125.729 [ms] (mean, across all concurrent requests)
Transfer rate: 5638.41 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 135 140 3.4 140 146
Processing: 1351 8110 3454.4 10254 12421
Waiting: 1338 8066 3443.4 10211 12416
Total: 1486 8250 3457.5 10397 12566
Percentage of the requests served within a certain time (ms)
50% 10397
66% 10789
75% 11078
80% 11260
90% 11801
95% 12334
98% 12519
99% 12566
100% 12566 (longest request)
我已经查看了很多手册、文章和其他内容。尝试了很多建议。没有什么帮助。
- 在 docker 中修改网络
- 在php中禁用调试器
- 使用了不同版本的 docker-compose
- 配置 docker 守护进程的规则
所有操作都为一位用户带来了足够好的速度。但是在负载下,docker 非常慢。
这是 docker-compose.yml(PHP、Mysql、Nginx 位于后面部分):
version: '3'
volumes:
dump:
services:
# ------------- Front --------------
# project base ------------------------------------
bb_base:
build:
context: ../front/project-base
dockerfile: Dockerfile
args:
- WORKDIR=${BB_BASE_WORKDIR}
container_name: ${BB_BASE_WORKDIR}
restart: always
working_dir: /var/www/${BB_BASE_WORKDIR}
volumes:
- ../front/project-base:/var/www/${BB_BASE_WORKDIR}
# project ui-kit ----------------------------------
bb_ui-kit:
build:
context: ../front/project-ui-kit
dockerfile: Dockerfile
args:
- WORKDIR=${BB_UI_KIT_WORKDIR}
container_name: ${BB_UI_KIT_WORKDIR}
restart: always
working_dir: /var/www/${BB_UI_KIT_WORKDIR}
volumes:
- ../front/project-ui-kit:/var/www/${BB_UI_KIT_WORKDIR}
- ../front/project-base:/var/www/${BB_BASE_WORKDIR}
command: sh /var/www/${BB_UI_KIT_WORKDIR}/entrypoint.sh
depends_on:
- bb_base
# project auth ----------------------------------
bb_auth:
build:
context: ../front/project-auth
dockerfile: Dockerfile
args:
- WORKDIR=${BB_AUTH_WORKDIR}
container_name: ${BB_AUTH_WORKDIR}
restart: always
working_dir: /var/www/${BB_AUTH_WORKDIR}
volumes:
- ../front/project-auth:/var/www/${BB_AUTH_WORKDIR}
- ../front/project-base:/var/www/${BB_BASE_WORKDIR}
- ../front/project-ui-kit:/var/www/${BB_UI_KIT_WORKDIR}
command: sh /var/www/${BB_AUTH_WORKDIR}/entrypoint.sh
depends_on:
- bb_ui-kit
# project crm ----------------------------------
bb_crm:
build:
context: ../front/project-crm
dockerfile: Dockerfile
args:
- WORKDIR=${BB_CRM_WORKDIR}
container_name: ${BB_CRM_WORKDIR}
restart: always
working_dir: /var/www/${BB_CRM_WORKDIR}
volumes:
- ../front/project-crm:/var/www/${BB_CRM_WORKDIR}
- ../front/project-base:/var/www/${BB_BASE_WORKDIR}
- ../front/project-ui-kit:/var/www/${BB_UI_KIT_WORKDIR}
command: sh /var/www/${BB_CRM_WORKDIR}/entrypoint.sh
depends_on:
- bb_ui-kit
# project link ----------------------------------
bb_link:
build:
context: ../front/project-link
dockerfile: Dockerfile
args:
- WORKDIR=${BB_LINK_WORKDIR}
container_name: ${BB_LINK_WORKDIR}
restart: always
working_dir: /var/www/${BB_LINK_WORKDIR}
volumes:
- ../front/project-link:/var/www/${BB_LINK_WORKDIR}
- ../front/project-base:/var/www/${BB_BASE_WORKDIR}
- ../front/project-ui-kit:/var/www/${BB_UI_KIT_WORKDIR}
command: sh /var/www/${BB_LINK_WORKDIR}/entrypoint.sh
depends_on:
- bb_ui-kit
# --------------- Back ----------------
# PHP -----------------------------------------------
bb_php:
user: "${USER_ID}:1000"
build:
context: ../back/project-back/images/php
dockerfile: Dockerfile
args:
- DOMAIN=${DOMAIN}
- ENV=${DOCKER_ENV}
container_name: ${BB_PHP_WORKDIR}
restart: always
# ports:
# - "${PORT_PHP}:9000"
working_dir: /var/www/${BB_PHP_WORKDIR}
volumes:
- ../back/project-back:/var/www/${BB_PHP_WORKDIR}
#- photos:/var/www/${BB_PHP_WORKDIR}/storage/app/photos-mount
depends_on:
- bb_mysql
# Nginx -----------------------------------------------
bb_nginx:
build:
context: ../back/project-back/images/nginx
dockerfile: Dockerfile
args:
- DOMAIN=${DOMAIN}
- ENV=${DOCKER_ENV}
- BACK_DIR=${BB_PHP_WORKDIR}
- LOCAL_DIR=${BB_NGINX_WORKDIR}
- LINK_DIR=${BB_LINK_WORKDIR}
- AUTH_DIR=${BB_AUTH_WORKDIR}
- CRM_DIR=${BB_CRM_WORKDIR}
container_name: ${BB_NGINX_WORKDIR}
restart: always
ports:
- "${PORT_HTTP}:80"
- "${PORT_HTTPS}:443"
working_dir: /var/www/${BB_NGINX_WORKDIR}
volumes:
- ../back/project-back:/var/www/${BB_NGINX_WORKDIR}
- ../front/project-crm:/var/www/${BB_CRM_WORKDIR}
- ../front/project-auth:/var/www/${BB_AUTH_WORKDIR}
- ../front/project-link:/var/www/${BB_LINK_WORKDIR}
depends_on:
- bb_php
# MySQL -------------------------------------------------
bb_mysql:
image: gitlab.project.ru:5050/project/backend/project/mysql:1.0
container_name: ${BB_MYSQL_WORKDIR}
restart: always
tty: true
ports:
- "${PORT_MYSQL}:3306"
volumes:
- dump:/var/lib/mysql
- ../back/project-back/images/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
- ../back/project-back/images/mysql/mysqldump.cnf:/etc/mysql/conf.d/mysqldump.cnf
- ../back/project-back/images/mysql/optimize.cnf:/etc/mysql/conf.d/optimize.cnf
env_file:
- ../back/project-back/.env
# Redis -------------------------------------------------
bb_redis:
image: redis:6-alpine
container_name: ${BB_REDIS_WORKDIR}
restart: always
# ports:
# - "${PORT_REDIS}:6379"
volumes:
- ../back/project-back/images/redis/redis.conf:/redis.conf
depends_on:
- bb_php
- bb_mysql
command: [ "redis-server", "/redis.conf" ]
# Mysql-cron-backup --------------------------------------
bb_mysql_cron_backup:
build:
context: ../back/project-back/images/mysql-cron-backup
dockerfile: Dockerfile
container_name: ${BB_MYSQL_CRON_BACKUP}
restart: always
volumes:
- ${VOLUME_PATH}/backup:/backup
environment:
- MAX_BACKUPS=${MAX_BACKUPS}
- INIT_BACKUP=0
- CRON_TIME=*/15 * * * *
- GZIP_LEVEL=9
depends_on:
- bb_mysql
env_file:
- ../back/project-back/.env
# --------------- Services -------------
# Socket -----------------------------------------------
bb_socket:
build:
context: ../back/project-services/project-sockets
dockerfile: Dockerfile
container_name: ${BB_SOCKETS_WORKDIR}
restart: always
working_dir: /var/www/${BB_SOCKETS_WORKDIR}
volumes:
- ../back/project-services/project-sockets:/var/www/${BB_SOCKETS_WORKDIR}
# Recommend products ------------------------------------
bb_recommend:
image: prod_rec:latest
build:
context: ../back/project-services/project-recommendation
dockerfile: Dockerfile
container_name: ${BB_RECCOMEND_WORKDIR}
restart: always
ports:
- "${PORT_RP}:5000"
environment:
- FLASK_APP=${FLASK_APP}
- FLASK_DEBUG=${FLASK_DEBUG}
- SECRET_KEY=${SECRET_KEY}
- DATABASE_URL_APP=${DATABASE_URL_APP}
- DATABASE_URL_PROD=${DATABASE_URL_PROD}
volumes:
- ../back/project-services/project-recommendation/config.py:/home/prod_rec/config.py
- ../back/project-services/project-recommendation/app.py:/home/prod_rec/app.py
- ../back/project-services/project-recommendation/app:/home/prod_rec/app
- ../back/project-services/project-recommendation/migrations:/home/prod_rec/migrations
depends_on:
- bb_recommend_mysql
links:
- bb_recommend_mysql:dbserver
# Recommend products MySQL ------------------------------------
bb_recommend_mysql:
image: mysql/mysql-server:5.7
container_name: ${BB_RECCOMEND_MYSQL_WORKDIR}
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${RP_MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${RP_MYSQL_DATABASE}
- MYSQL_USER=${RP_MYSQL_USER}
- MYSQL_PASSWORD=${RP_MYSQL_MYSQL_PASSWORD}
volumes:
- ../back/project-services/project-recommendation/my.cnf:/etc/my.cnf:ro
# Cdek ----------------------------------------------
bb_cdek:
image: cdek:latest
build:
context: ../back/project-services/project-cdek
dockerfile: Dockerfile
container_name: ${BB_CDEK_WORKDIR}
restart: always
ports:
- "${PORT_CDEK}:8080"
env_file:
- ../back/project-services/project-cdek/.env
environment:
- DEBUG_VALUE=FALSE
volumes:
- ../back/project-services/project-cdek/flask_api.py:/home/cdek/cdek/flask_api.py
- ../back/project-services/project-cdek/boot.sh:/home/cdek/cdek/boot.sh
# MoySklad -----------------------------------------------
bb_moysklad:
image: moysklad:latest
build:
context: ../back/project-services/project-moysklad
dockerfile: Dockerfile
container_name: ${BB_MOYSKLAD_WORKDIR}
restart: always
ports:
- "${PORT_MOYSKLAD}:5000"
environment:
- QUART_APP=${QUART_APP}
- QUART_DEBUG=${QUART_DEBUG}
- SECRET_KEY=${MS_SECRET_KEY}
- ENV=${MS_ENV}
volumes:
- ../back/project-services/project-moysklad/app.py:/home/moysklad/app.py
- ../back/project-services/project-moysklad/webhook.log:/home/moysklad/webhook.log
- ../back/project-services/project-moysklad/async_file.py:/home/moysklad/async_file.py
- ../back/project-services/project-moysklad/config.py:/home/moysklad/config.py
- ../back/project-services/project-moysklad/start.py:/home/moysklad/start.py
嗯,这就是问题所在。如何解决项目负载高的速度问题?为什么docker在负载下这么慢?有任何想法吗?
如果您需要更多数据,我会附上。
解决方案
推荐阅读
- javascript - Typescript / JavaScript 比较未定义的值
- python - Seaborn 热图 - 多个变量
- r - R 中的数据清理 - 只需从列中取出数字
- javascript - 浏览器端 JS:文件系统 API 与文件系统访问 API?
- spring-boot - HttpServer tcpConfiguration 已弃用
- nuxt.js - 如何使用保存在 Nuxt 商店中的 Vuetify 选择值修复不匹配的子节点?
- java - Java 语言中的元组
- numpy - numpy - 为 np.nditer 使用 'with' 的原因
- reactjs - 如何显示所有这些字段?
- c++ - 条件提升::range::join