问题描述
我在windows 下安装的 docker for windows 自己创建了lnmp环境,
但是遇到了很尴尬的问题同样的代码,在我的云服务器上响应时间很短:
但是在windows docker 环境下 响应时间需要一两秒,相差几乎十倍
docker-compose
文件如下:
问题出现的平台版本及自己尝试过哪些方法
出现平台:windwos
我自己在网络上查找了相关的解决办法,说是io的问题 需要加上cached 参数
但是我加入这个参数之后,响应速度几乎没有提升?
请问有什么可以解决的办法吗??
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
version: "3"
services:
nginx:
image: nginx
container_name: lnmp_nginx
ports:
- "80:80"
- "443:443"
networks:
lnmp:
ipv4_address: ${NGINXADDR}
volumes:
- ./log/nginx/nginx:/var/log/nginx
- ./code/php:/var/www/html/:cached
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./config/nginx/conf.d:/etc/nginx/conf.d
mysql:
image: mysql
container_name: lnmp_mysql
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data/mysql:/var/lib/mysql
networks:
lnmp:
ipv4_address: ${MYSQLADDR}
ports:
- "3306:3306"
phpfpm:
build: ./Dockerfiles/php/
container_name: lnmp_phpfpm
links:
- mysql:mysql
- redis:redis
volumes:
- ./code/php:/var/www/html/:cached
- ./config/php/:/usr/local/etc/
networks:
lnmp:
ipv4_address: ${PHPFPMADDR}
ports:
- "9000:9000"
- "9501:9501"
- "8000:8000"
redis:
image: redis
ports:
- "6379:6379"
container_name: redis
volumes:
- ./data/redis:/data
networks:
lnmp:
ipv4_address: ${REDISADDR}
command: redis-server --appendonly yes
networks:
lnmp:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
Docker for Windows是在Hyper-V虚拟机上跑Linux,文件挂载是通过SMB协议从Windows挂载到Linux,文件读写都经过网络,遇到Laravel这种每次启动就要加载几百个文件的框架,文件性能问题就尤其明显。
最好的验证方法就是进到容器里,strace一下php-fpm进程,看下系统调用的耗时,你就会发现大部分时间都是在stat或read,所以解决的思路就是减少网络文件系统的读写。
方案0: 开opcache,减少read调用
方案1:不使用SMB协议挂载文件,通过union、rsync之类的工具同步文件修改。
方案2: 用WSL2
方案3:修改cifs内核模块,单独加大vendor目录的缓存时间,因为vendor目录下的文件很少变更,加大文件信息的缓存时间可以减少大量网络调用。加上方案0,响应时间从1秒减少到0.1秒。(现在我就在用这个方案,自己在Hyper-V跑Arch Linux + 修改过的cifs模块化 + docker)
Github有相关的讨论:Shared Volumes Slow ,基本都是方案0-2。