Homestead / vagrant / virtualbox rất chậm trên Mac OSX


8

Tôi đang sử dụng Homestead + Vagrant + Virtualbox trên máy Mac .

Vấn đề

Trong khi tôi tìm thấy rất nhiều chủ đề / câu trả lời làm thế nào để khắc phục thời gian phản hồi chậm (ví dụ TTFB) thì không có chủ đề nào hoạt động. Thời gian phản hồi của tôi thay đổi trong khoảng 25 - 32 giây, điều này rõ ràng là không thể chấp nhận được đối với sự phát triển địa phương.

Đề xuất các giải pháp

Tôi đã thử rất nhiều giải pháp được đề xuất từ ​​đây: https://github.com/laravel/homestead/issues/901

Và cũng đã đọc và thử nhiều đề xuất từ ​​các chủ đề này:

Mặc dù đã có câu trả lời được chấp nhận, nhưng không ai trong số họ giúp tôi.

Vô hiệu hóa xdebug

Tôi có thể nói rằng Vô hiệu hóa xdebug như đã giải thích ở đây đã giúp tôi tiết kiệm 5 giây.

Thay đổi kích thước đĩa

Trong khi thay đổi kích thước đĩa của VM từ động sang cố định như được đề xuất ở đây và được giải thích ở đây không giúp ích gì cả (kết quả thậm chí còn tệ hơn).

Sử dụng NFS (thư mục đồng bộ hóa) theo đề xuất ở đây

Ngoài ra, việc đặt homestead / vagrant thành NFS cũng không giúp được gì.

Đã thử (tập tin mơ hồ):

Vagrant.configure("2") do |config|
  config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options:['nolock,vers=3,udp,noatime,actimeo=1']
end

Cũng đã thử (homestead.yaml)

folders:
    -
        map: '/Users/myuser/PhpstormProjects/example.com'
        to: /home/vagrant/code
        type: "nfs"
        options:
            mount_options: ['nolock','vers=3','udp','noatime','actimeo=1']

NFS đã hoạt động trong cả hai trường hợp nhưng nó không thay đổi điều gì về TTFB khi tải trang.

Cài đặt natdnshostresolver: tắt

Tôi cũng đã cố gắng tắt natdnshostresolver như đề xuất ở đây Nó không thay đổi gì cả.

Điều chỉnh hình ảnh hộp ảo

Tất nhiên tôi cũng đã cố gắng tăng RAM, CPU, đồ họa, v.v. nhưng như bạn có thể thấy nó không giúp ích gì.

Bất cứ một đề nghị nào khác

Cho đến bây giờ tôi cũng sẵn sàng thử ví dụ như người phục vụ hoặc cho bất kỳ đề xuất / giải pháp nào khác mà bạn có thể đưa ra.

Cảm ơn rất nhiều trước!

Cập nhật 1

Việc thay đổi nginx.conf trên máy ảo của tôi (sau khi @emotality đề xuất một tinh chỉnh) đã giúp một chút. Để hoàn thiện và khả năng có thể được điều chỉnh thêm một chút nữa, đây là toàn bộ phần http của tệp nginx.conf.

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        # keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        keepalive_disable none;
        keepalive_requests 200;
        keepalive_timeout 300s;

        server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Cập nhật 2

Nội dung của homestead.yaml:

ip: 192.168.10.14
memory: 4096
cpus: 2
provider: virtualbox
natdnshostresolver: off
authorize: ~/.ssh/id_rsa.pub
keys:
    - ~/.ssh/id_rsa
folders:
    -
        map: '/Users/myUser/PhpstormProjects/exampleproject.com'
        to: /home/vagrant/code
        type: "nfs"
        options:
            mount_options: ['nolock','vers=3','udp','noatime','actimeo=1']
sites:
    -
        map: exampleproject.local
        to: /home/vagrant/code
databases:
    - homestead
features:
    -
        mariadb: false
    -
        ohmyzsh: false
    -
        webdriver: false
name: exampleproject
hostname: exampleproject

Nội dung của Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

require 'json'
require 'yaml'

VAGRANTFILE_API_VERSION ||= "2"
confDir = $confDir ||= File.expand_path("vendor/laravel/homestead", File.dirname(__FILE__))

homesteadYamlPath = File.expand_path("Homestead.yaml", File.dirname(__FILE__))
homesteadJsonPath = File.expand_path("Homestead.json", File.dirname(__FILE__))
afterScriptPath = "after.sh"
customizationScriptPath = "user-customizations.sh"
aliasesPath = "aliases"

require File.expand_path(confDir + '/scripts/homestead.rb')

Vagrant.require_version '>= 2.2.4'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
    if File.exist? aliasesPath then
        config.vm.provision "file", source: aliasesPath, destination: "/tmp/bash_aliases"
        config.vm.provision "shell" do |s|
            s.inline = "awk '{ sub(\"\r$\", \"\"); print }' /tmp/bash_aliases > /home/vagrant/.bash_aliases"
        end
    end

    if File.exist? homesteadYamlPath then
        settings = YAML::load(File.read(homesteadYamlPath))
    elsif File.exist? homesteadJsonPath then
        settings = JSON::parse(File.read(homesteadJsonPath))
    else
        abort "Homestead settings file not found in " + File.dirname(__FILE__)
    end

    Homestead.configure(config, settings)

    if File.exist? afterScriptPath then
        config.vm.provision "shell", path: afterScriptPath, privileged: false, keep_color: true
    end

    if File.exist? customizationScriptPath then
        config.vm.provision "shell", path: customizationScriptPath, privileged: false, keep_color: true
    end

    if Vagrant.has_plugin?('vagrant-hostsupdater')
        config.hostsupdater.aliases = settings['sites'].map { |site| site['map'] }
    elsif Vagrant.has_plugin?('vagrant-hostmanager')
        config.hostmanager.enabled = true
        config.hostmanager.manage_host = true
        config.hostmanager.aliases = settings['sites'].map { |site| site['map'] }
    end
end

Dùng nginx hay apache?
biểu tượng

@emotality Cảm ơn bình luận của bạn! Đó là nginx / 1.15.8
wbq

Đã trả lời, không chắc có vấn đề gì không nhưng để xem? Hãy cho tôi biết :)
biểu tượng

cố gắng cài đặt plugin bindfs vagrant plugin install vagrant-bindfsvà giữ ánh xạ trong homestead.yamltệp không rõ ràng. Tôi cũng đề nghị phá hủy VM và bắt đầu mới.
Dao cạo

@Razor cảm ơn lời đề nghị của bạn. Tôi đã cài đặt Bindfs và tôi nhận được ==> myproject: Bindfs seems to not be installed on the virtual machine, installing now myproject: Bindfs 1.13.7 is installed ==> myproject: Machine is ready to use bindfs! ==> myproject: Creating bind mounts after synced_folders... myproject: /home/vagrant/code => /home/vagrant/code. Thật không may, nó đã không giải quyết được vấn đề.
wbq

Câu trả lời:


3

Các dự án Laravel của tôi cũng chậm nhưng chỉ khi sử dụng Postman, giả sử nó khởi động mỗi khi tôi thực hiện một yêu cầu có thêm 10 - 15 giây cho mỗi yêu cầu. Giải pháp của tôi là điều chỉnh các Keep-Alivethiết lập.

Giả sử những gì đang xảy ra là nó sẽ mở ra một kết nối mới, bắt tay, chuyển tài nguyên, kết nối chặt chẽ và lặp lại cho mọi tài nguyên trên trang của bạn. Tôi có thể sai nhưng hãy thử bên dưới và xem. :)

Điều này chỉ dành cho phát triển địa phương, tôi không đề xuất điều này cho môi trường sản xuất.


Apache

$ sudo nano /etc/apache2/httpd.conf

Ở trên cùng:

KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 300

Sau đó khởi động lại apache


nginx

$ sudo nano /etc/nginx/nginx.conf

Trong http {}khối:

keepalive_disable none;
keepalive_requests 200;
keepalive_timeout 300s;

Sau đó khởi động lại nginx


Cảm ơn bạn rất nhiều vì câu trả lời rộng rãi của bạn. Tôi đã đăng nhập vào vagrant và chỉnh sửa nginx.conf bằng nano. Tôi nhận xét keepalive_timeout 65;và thêm các dòng gợi ý của bạn. Tôi nhận ra mức giảm nhẹ khoảng 3 giây trong TTFB, nhưng tổng cộng tôi vẫn có 22-23 giây (trường hợp tốt nhất) cho một lần tải trang. Vì vậy, nó dường như đã giúp một chút cho đến nay. Có lẽ có bất kỳ chỉnh sửa nào khác trong nginx.conf mà tôi có thể làm, đó là lý do tại sao tôi sẽ thêm phần http của nginx.conf vào câu hỏi của mình. Cám ơn!
wbq

Khỉ thật, điều này đang làm phiền tôi bây giờ .. Bạn đã thử phá hủy VM và bắt đầu làm mới chưa?
emotality

vâng, nhiều lần Không phải với những thay đổi nginx của bạn mặc dù. Tôi sẽ cố gắng để làm như vậy.
wbq

Cảm ơn một lần nữa. Bây giờ tôi đã phá hủy những người lang thang và nâng nó lên một lần nữa. Đã thực hiện lại các thay đổi được đề xuất của bạn và cũng đảm bảo Bindfs (được đề xuất bởi @Razor) đang chạy. Thật không may vẫn không có kết quả tốt hơn. Tôi đoán Nó có thể có liên quan đến số lượng tệp (14242)?
wbq

3

Cảm ơn tất cả các bạn, nhưng tôi đã tìm thấy một giải pháp khá thú vị hay đúng hơn là một vấn đề mà tôi có.

Tôi đã sử dụng môi trường cục bộ để cài đặt wordpress. Có một tệp gọi là " object-cache.php " trong thư mục wp-content sử dụng Memcached. Memcached được cài đặt trong homestead nhưng dường như có cấu hình khác với máy chủ trực tiếp của tôi.

Điều này dẫn đến các tệp cục bộ không được lưu trữ đúng cách, điều này dẫn đến việc mã kéo tất cả các tùy chọn có sẵn từ cơ sở dữ liệu cho mỗi yêu cầu.

Vì vậy, tóm lại nó là một vấn đề lớn.

Xóa tệp object-cache.php bây giờ là giải pháp của tôi (kết quả là TTFB là 1,23 giây).

Tôi chỉ để điều này ở đây trong trường hợp bất cứ ai gặp phải một vấn đề tương tự. Cảm ơn một lần nữa cho tất cả sự giúp đỡ và nghĩ rằng các bạn đưa vào này.


0

Tôi đã từng có một trang web kết nối với 'localhost' thay vì '127.0.0.1' trên địa phương để phát triển, thực tế nhỏ đó đã khiến việc tra cứu DNS mất nhiều thời gian và thậm chí GraphQL mất 3 giây để phản hồi. Có lẽ đó là một cái gì đó tương tự vào cuối của bạn.


Cảm ơn vi đa trả lơi. Tôi đã tìm ra nó ngay bây giờ và sẽ đăng kết quả của tôi trong một vài phút.
wbq

0

Vagrant qua VirtualBox trên Catalina (MacMini Cuối năm 2012 (nâng cấp SSD kép và 16 MB RAM)) rất chậm đối với tôi, không giới hạn ở các dự án PHP hoặc Javascript, mặc dù đó hầu hết là những gì tôi đang làm. Tôi đã dành một chút thời gian nghiên cứu và các giải pháp mà làm việc cho tôi là để thêm /sbin/nfsdVirtualBoxđể Full Disk AccessSettings->Privacytrên Mac, như mô tả tại liên kết dưới đây. Tôi hy vọng điều này sẽ giúp người khác. Trong trường hợp của tôi, TTFB đã chuyển từ khoảng 15 giây xuống dưới 1. (Điều đó khá tốt cho Vagrant, ha!)

chỉ cần thêm và bật nfsd vào danh sách truy cập đĩa đầy đủ sẽ hoạt động

https://github.com/hashicorp/vagrant/issues/10961#issuecomment-567430897


1
Câu trả lời này thực sự không giúp được nhiều như đã chỉ ra, tôi không chắc liệu tôi có nên làm lại nó hay không? Tôi đã chuyển sang Laravel Valet, zippy và đơn giản, nhưng biến thể nhiều hơn từ môi trường sản xuất, ah tốt.
Jeremy Anderson

-1

Đối với những người chạy Homestead trên macOS "High Sierra" trở lên, giải pháp hiệu quả với tôi cũng đơn giản như thay đổi một vài cài đặt trong tệp homestead.rb .

Bất cứ nơi nào bạn tìm thấy trong tệp homestead.rb của mình , các cài đặt để settings['cpus'] ||= 1 thay đổi nó thành settings['cpus'] ||= 2 . ngoài ra, bạn có thể tăng kích thước bộ nhớ (tôi đã không) và đặt giá trị lớn hơn giá trị mặc định settings['memory'] ||= 2048.

Trước khi tôi thử hầu hết mọi giải pháp tìm thấy trên web, từ việc đảm bảo nfsđã được đặt, thêm tập lệnh và các đề xuất khác và không có giải pháp nào hoạt động cho đến khi tôi tăng cài đặt giá trị mặc định của cpu lên cài đặt ['cpus'] || = 2

Trong thiết bị đầu cuối, tác vụ đơn giản là chạy npm run devhoặc bất kỳ php artisanlệnh nào mất khoảng 10 đến 15 giây cho đến khi lời nhắc được tự do thực hiện với các lệnh khác.

Với những thay đổi ở trên, giờ chỉ mất 2 đến 3 giây !

Tôi hy vọng điều này sẽ giúp bất cứ ai gặp phải hiệu suất chậm tương tự, đặc biệt là trên macOS. "Sierra cao" trở lên. Tôi đang dùng macOS "Catalina" và tất cả đều hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.