我在Windows上使用Docker作为本地开发环境。我已将docker-compose
设置为使用3个单独的容器:
容器主持Symfony 4网站。当我加载页面时,请求需要700-900毫秒才能完成。但是,如果我像这样运行ApacheBench:
ab.exe -n 1000 -c 1 http://localhost/
当我现在加载页面时(在浏览器中,当ab
正在运行时),请求时间现在降至100-200ms。将symfony环境设置为prod
时会发生同样的情况。在不运行ApacheBench的情况下,加载时间为400-500ms,但运行ApacheBench时,加载时间突然降至约30ms。
有没有什么办法可以让我无需经常运行ApacheBench即可获得快速响应时间?
答案 0 :(得分:0)
事实证明这是一个缓存问题,但与PHP或nginx无关。
相反,它与Docker for Windows挂载卷的方式有关。它使用本地SMB共享,事实证明 - 它真的很慢。每当文件发生变化时,它都会检查文件是否在每次访问文件时都发生了变化,而不是同步更改。
由于我对cifs
知之甚少,似乎Docker将所有cifs挂载配置为具有1秒缓存。因此,当运行ApacheBench时,它将大约每0.7秒加载一页。这使cifs
缓存保持温暖,这反过来意味着在ApacheBench运行时在浏览器中手动加载页面的速度很快。
我的解决方案是编写一个小批量脚本,手动同步每秒可能发生变化的源部分:
#! /bin/bash
shopt -s dotglob
cd /host_override
HOST_OVERRIDES="`echo *`"
for FILE in *; do
echo "Override found for $FILE"
cd /var/www/html
rm -rf "$FILE"
ln -s "/host_override/$FILE"
cd /host_override
done
# Initial sync
cd /host_data
for FILE in *; do
if ! [ -e "/host_override/$FILE" ]; then
echo "Initial sync of $FILE ..."
rsync -a "$FILE" "/var/www/html/"
fi
done
echo "Done."
# Small sync of files that actually change
while true;
do
for FILE in src config templates public .env; do
rsync -aut "$FILE" "/var/www/html/"
done
sleep 1
done
我覆盖docker-compose.yml
中的入口点,如下所示:
entrypoint: ["bash", "-c", "docker-sync & docker-php-entrypoint php-fpm"]
volumes:
- .:/host_data:ro
- /host_override
- ./var:/host_override/var:rw
- /host_override/var/log
- /host_override/var/cache
- ./var/user_uploads/:/host_override/var/user_uploads/:rw
- ./docker/php/docker-sync.sh:/usr/local/bin/docker-sync
编辑文件与主机上出现的更改之间的1秒延迟是不明显的,并且网站的性能比以前好得多。即使在dev
环境中,响应时间也是<100ms
。在prod
环境中,响应时间为~20ms
。