Windows 10 WSL2上带有Devilbox的Docker 2.3.0.4非常慢

时间:2020-08-25 04:48:06

标签: php docker devilbox

我有Windows 10 2004、8核AMD CPU,12GB RAM,运行现有的wsl2 debian实例也很好。我可以使用现有的WSL运行典型的Web堆栈php-fpm nginx mariadb redis-server,并且性能很好。我一直在阅读wsl2和docker现在要好得多,并想尝试一下。

我用wsl2安装了docker 2.3.0.4,并安装了devilbox作为Web堆栈。

我使用.wslconfig文件将wls进程限制为4gb和4 cpus,这一切都很酷,而且工作正常。

不能正常工作的是,一个简单的php页面(例如<?php echo time(); ?>可能需要15到30秒才能显示出来!任何与数据库对话的信息都会导致90秒钟的加载时间。 wordpress站点是不可能的。在WSL2的nginx / debian上运行相同的脚本/站点/数据库是完美的。

Windows重新启动后,我无法运行docker桌面应用程序(在重新启动之前,它可以工作)。启动时,放在我桌面上的图标docker安装程序没有任何作用。我看不到任务管理器中出现任何流程。似乎没有崩溃,只是没有用。我可以右键单击任务栏中的docker图标,然后以这种方式进入仪表板。我通常还是在命令行上工作,所以没什么大不了的,以为我已经提到了。

devilbox安装会设置一个本地Web服务器,并且一切正常。我不得不多次docker-compose up才能正确拉出容器,但那时我确实有糟糕的互联网。 Web界面非常灵活,我可以启动phpmyadmin之类的工具,并且它们可以正常加载。如果我尝试用100个表还原一个10mb的数据库,它将超时并崩溃并刻录。即使我的磁盘负载达到90%并在那里停留了5分钟,也可以通过mysql通过外壳恢复相同的数据库工作正常。

我创建的任何虚拟主机Web服务器的性能都非常差。 php页面大约需要90秒才能显示出来。带有phpinfo()的页面可能需要45-90秒的白屏才能显示。

我如何弄清楚为什么与在同一环境下在WSL2上直接安装linux相比,docker是如此糟糕?我猜这与io位Windows任务管理器说磁盘io平均负载为2%有关。

1 个答案:

答案 0 :(得分:0)

我认为是 docker volume 和 windows 文件共享的问题。即使您使用 WSL2,也不意味着您使用 linux 文件系统。如果你使用windows系统的文件,例如:import pickle import os from google_auth_oauthlib.flow import Flow, InstalledAppFlow from googleapiclient.discovery import build from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload from google.auth.transport.requests import Request def Create_Service(client_secret_file, api_name, api_version, *scopes): print(client_secret_file, api_name, api_version, scopes, sep='-') CLIENT_SECRET_FILE = client_secret_file API_SERVICE_NAME = api_name API_VERSION = api_version SCOPES = [scope for scope in scopes[0]] print(SCOPES) cred = None pickle_file = f'token_{API_SERVICE_NAME}_{API_VERSION}.pickle' # print(pickle_file) if os.path.exists(pickle_file): with open(pickle_file, 'rb') as token: cred = pickle.load(token) if not cred or not cred.valid: if cred and cred.expired and cred.refresh_token: cred.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES) cred = flow.run_local_server() with open(pickle_file, 'wb') as token: pickle.dump(cred, token) try: service = build(API_SERVICE_NAME, API_VERSION, credentials=cred) print(API_SERVICE_NAME, 'service created successfully') return service except Exception as e: print('Unable to connect.') print(e) return None def convert_to_RFC_datetime(year=1900, month=1, day=1, hour=0, minute=0): dt = datetime.datetime(year, month, day, hour, minute, 0).isoformat() + 'Z' return dt CLIENT_SECRET_FILE = 'credentials.json' API_SERVICE_NAME = 'drive' API_VERSION = 'v3' SCOPES = ['https://www.googleapis.com/auth/drive'] service = Create_Service(CLIENT_SECRET_FILE,API_SERVICE_NAME,API_VERSION,SCOPES) ,它是windows文件和文件夹,windows会在docker执行之前读取和扫描它们。

我找到了解决方案。它是在 WSL 发行版中安装您的项目。打开你的 linux 发行版,对我来说是 Ubuntu 18.0,你将从 d:/workspace/myproject 开始,在这里安装你的项目,例如:/home/%USER_PATH%

您可以将 IDE 远程连接到 WSL,在 VSCode 中,它通过扩展远程 WSL 支持。这使您的项目仅在 linux 文件系统上工作,而不与 windows 共享,并且速度更快