Sehr langsames Laravel Homestead / Vagrant / Virtualbox unter Mac OSX


8

Ich verwende Homestead + Vagrant + Virtualbox auf einem Mac .

Problem

Obwohl ich viele Threads / Antworten gefunden habe, wie langsame Antwortzeiten (z. B. TTFB) behoben werden können, hat keiner von ihnen funktioniert. Meine Antwortzeiten variieren zwischen 25 und 32 Sekunden, was für die lokale Entwicklung offensichtlich nicht akzeptabel ist.

Lösungsvorschläge

Ich habe viele Lösungsvorschläge von hier aus versucht: https://github.com/laravel/homestead/issues/901

Und habe auch viele Vorschläge aus diesen Threads gelesen und ausprobiert:

Obwohl es akzeptierte Antworten gab, half mir keine.

Xdebug deaktivieren

Ich kann sagen, dass das Deaktivieren von xdebug wie hier erklärt mir geholfen hat, 5 Sekunden zu sparen.

Disc-Größe ändern

Das Ändern der Festplattengröße der VM von dynamisch auf fest, wie hier vorgeschlagen und hier erklärt, hat überhaupt nicht geholfen (das Ergebnis war sogar noch schlechter).

Verwenden von NFS (Synchronisierungsordner) wie hier vorgeschlagen

Auch das Setzen von Homestead / Vagrant auf NFS half nichts.

Versucht (Vagabunddatei):

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

Auch ausprobiert (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 funktionierte in beiden Fällen, änderte jedoch nichts an TTFB beim Laden der Seite.

Natdnshostresolver einstellen: aus

Ich habe auch versucht, natdnshostresolver auszuschalten, wie hier vorgeschlagen. Es hat nichts geändert.

Anpassen des Virtualbox-Images

Natürlich habe ich auch versucht, RAM, CPUs, Grafik usw. zu vergrößern, aber wie Sie sich vorstellen können, hat es nicht geholfen.

Irgendwelche anderen Vorschläge

Ab sofort bin ich auch offen für zB Valet oder andere Empfehlungen / Lösungen, die Sie geben könnten.

Vielen Dank im Voraus!

Update 1

Das Ändern der Datei nginx.conf auf meiner VM (nachdem @emotality eine Optimierung vorgeschlagen hatte) hat ein wenig geholfen. Der Vollständigkeit halber und der Möglichkeit, dass noch ein bisschen mehr optimiert werden könnte, hier der gesamte http-Teil der Datei 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/*;
}

Update 2

Inhalt von 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

Inhalt von 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

Mit Nginx oder Apache?
Emotionalität

@emotality Danke für deinen Kommentar! Es ist Nginx / 1.15.8
wbq

Beantwortet, nicht sicher, ob es das Problem ist, aber mal sehen? Lass es mich wissen :)
Emotionalität

Versuchen Sie, das bindfs-Plugin zu installieren vagrant plugin install vagrant-bindfsund die Zuordnung homestead.yamlnicht in der Vagrant-Datei zu belassen . Ich schlage auch vor, die VM zu zerstören und neu zu starten.
Rasiermesser

@ Rasierer danke für deinen Vorschlag. Ich habe Bindfs installiert und bekomme ==> 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. Leider hat es das Problem nicht gelöst.
wbq

Antworten:


3

Meine Laravel-Projekte sind ebenfalls langsam, jedoch nur bei Verwendung von Postman, vorausgesetzt, es wird jedes Mal hochgefahren, wenn ich eine Anfrage stelle, die jeder Anfrage etwa 10 bis 15 Sekunden hinzufügt. Meine Lösung bestand darin, die Keep-AliveEinstellungen zu optimieren .

Angenommen, es wird eine neue Verbindung geöffnet, Handshakes ausgeführt, Ressourcen übertragen, Verbindungen geschlossen und für jede Ressource auf Ihrer Seite wiederholt. Ich könnte mich irren, aber versuche es unten und lass uns sehen. :) :)

Dies ist nur für die lokale Entwicklung gedacht. Ich empfehle dies nicht für die Produktionsumgebung.


Apache

$ sudo nano /etc/apache2/httpd.conf

Oben:

KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 300

Starten Sie dann Apache neu


Nginx

$ sudo nano /etc/nginx/nginx.conf

Im http {}Block:

keepalive_disable none;
keepalive_requests 200;
keepalive_timeout 300s;

Starten Sie dann nginx neu


Vielen Dank für Ihre ausführliche Antwort. Ich habe mich bei vagrant angemeldet und die nginx.conf mit nano bearbeitet. Ich habe keepalive_timeout 65;Ihre vorgeschlagenen Zeilen auskommentiert und hinzugefügt. Ich habe einen leichten Rückgang von ungefähr 3 Sekunden in TTFB festgestellt, aber insgesamt habe ich immer noch 22-23 Sekunden (bester Fall) für das Laden einer einzelnen Seite. Es scheint also bisher ein bisschen geholfen zu haben. Vielleicht gibt es noch andere Verbesserungen in der nginx.conf, die ich vornehmen könnte, weshalb ich meiner Frage den http-Teil der nginx.conf hinzufügen werde. Danke!
wbq

Verdammt, das stört mich jetzt. Hast du versucht, die VM zu zerstören und neu zu starten?
Emotionalität

ja, mehrmals. Nicht mit Ihren Nginx-Änderungen. Ich werde es versuchen.
wbq

Danke noch einmal. Ich habe jetzt den Landstreicher zerstört und ihn wieder erhöht. Haben Sie Ihre vorgeschlagenen Änderungen erneut vorgenommen und außerdem sichergestellt, dass Bindfs (von @Razor vorgeschlagen) ausgeführt wird. Leider immer noch kein Ergebnis zum Besseren. Ich denke, es könnte etwas mit der Anzahl der Dateien zu tun haben (14242)?
wbq

3

Vielen Dank an euch alle, aber ich habe eine ziemlich interessante Lösung gefunden oder eher ein Problem, das ich hatte.

Ich habe die lokale Umgebung für eine WordPress-Installation verwendet. Im Ordner wp-content befand sich eine Datei mit dem Namen " object-cache.php ", die Memcached verwendet. Memcached ist in Homestead installiert, scheint aber eine andere Konfiguration zu haben als mein Live-Server.

Dies führt dazu, dass lokale Dateien nicht ordnungsgemäß zwischengespeichert werden, was letztendlich dazu führt, dass der Code für jede Anforderung alle verfügbaren Optionen aus der Datenbank abruft.

Insgesamt war es also ein großes Caching-Problem.

Das Entfernen der Datei object-cache.php ist jetzt meine Lösung (was zu einem TTFB von 1,23 Sekunden führt).

Ich lasse dies hier, falls jemand auf ein ähnliches Problem stößt. Nochmals vielen Dank für all die Hilfe und dachte, ihr habt das getan.


0

Ich hatte einmal eine Site, die für die Entwicklung eine Verbindung zu 'localhost' anstelle von '127.0.0.1' auf meinem lokalen Netzwerk herstellte. Diese kleine Tatsache ließ die DNS-Suche ewig dauern, und selbst GraphQL brauchte 3 Sekunden, um zu antworten. Vielleicht ist es etwas Ähnliches an Ihrem Ende.


Danke für die Antwort. Ich habe es gerade herausgefunden und werde mein Ergebnis in ein paar Minuten veröffentlichen.
wbq

0

Vagrant über VirtualBox auf Catalina (MacMini Ende 2012 (Dual-SSD und 16 MB RAM) nach dem Upgrade) war für mich unglaublich langsam, nicht nur für PHP- oder Javascript-Projekte, obwohl ich hauptsächlich daran gearbeitet habe. Ich habe ein wenig Zeit mit Nachforschungen verbracht und die Lösung, die für mich funktioniert hat, war, /sbin/nfsdund hinzuzufügenVirtualBox zu Full Disk Accessin Settings->Privacyauf dem Mac, wie unten auf den Link beschrieben. Ich hoffe das wird jemand anderem helfen. In meinem Fall ging TTFB von ungefähr 15 Sekunden auf weniger als 1 zurück. (Das ist ziemlich gut für Vagrant, ha!)

Das Hinzufügen und Aktivieren von nfsd zur vollständigen Festplattenzugriffsliste sollte funktionieren

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


1
Diese Antwort hat tatsächlich nicht so viel geholfen wie angegeben. Ich bin mir nicht sicher, ob ich sie redigieren soll oder was? Ich wechselte zu Laravel Valet, flink und einfach, aber mehr Variante von der Produktionsumgebung, na ja.
Jeremy Anderson

-1

Für diejenigen, die Homestead unter macOS "High Sierra" oder höher ausführen, war die Lösung, die für mich funktionierte, so einfach wie das Ändern einiger Einstellungen in der Datei homestead.rb .

Wo immer Sie in Ihrer homestead.rb- Datei finden, settings['cpus'] ||= 1 ändern Sie die Einstellungen für settings['cpus'] ||= 2. Sie können auch die Speichergröße erhöhen (ich habe es nicht getan) und den Wert größer als den Standardwert einstellen settings['memory'] ||= 2048.

Bevor ich fast jede im Web gefundene Lösung ausprobiert habe, wurde sichergestellt, dass sie nfsfestgelegt wurde, Skripte und andere Vorschläge hinzugefügt wurden und keine funktionierte, bis ich die Einstellungen für den CPU- Standardwert auf Einstellungen ['cpus'] || = erhöhte 2

Im Terminal dauerte die einfache Ausführung npm run devvon php artisanBefehlen oder Befehlen etwa 10 bis 15 Sekunden bis die Eingabeaufforderung frei war, mit anderen Befehlen fortzufahren.

Mit den obigen Änderungen, dauert es jetzt nur noch 2 bis 3 Sekunden !

Ich hoffe, dies hilft jedem, der die gleiche langsame Leistung erlebt, insbesondere unter macOS. "High Sierra" oder später. Ich bin auf macOS "Catalina" und alles funktioniert jetzt gut.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.