it-swarm.com.de

Verbessern Sie die anfängliche Verwendung der "find" -Performancezeit

Ich arbeite an einem Projekt, um alle .tar Installationsdateien auf meinem System mit dem folgenden Befehl zu finden:

time find / -type f \( -name "*.tar" -o -name "*.tar.*" \) 2>/dev/null | wc

Das erste Mal, wenn es läuft, bekomme ich:

real    1m10.767s

Das zweite Mal bekomme ich:

real    0m9.847s

Ich möchte immer die zweite Aufführung von <10 Sekunden und auf die erste Aufführung von 1 Minute 10 verzichten Sekunden . Was ist der beste Weg, um die einminütige Strafe zu vermeiden, wenn find zum ersten Mal verwendet wird?


Anmerkungen

  • Ihre anfängliche find ist möglicherweise schneller, da ich eine Ubuntu 16.04-Installation plus zwei Windows 10-Installationen für insgesamt 2 Millionen Dateien habe.
  • OTOH Ihr anfängliches find ist möglicherweise langsamer, da ich Ubuntu 16.04 und eine der Windows 10-Installationen auf einer Samsung Pro 960 NVMe-SSD habe 3.000 MBit/s, während Festplatten mit 140 MBit/s und gute SSDs mit 400 MBit/s bewertet werden.
  • Wenn Sie Tests replizieren möchten, aber keine .tar -Dateien auf Ihrem System haben, ersetzen Sie tar durch bashrc im Abschnitt: -name "*.tar" -o -name "*.tar.*".

TL; DR

Löschen Sie RAM Caches, die den find Datenträgerzugriff beschleunigen

Sie können den ersten/zweiten Leistungstest wiederholen, indem Sie dieses kleine Skript vor dem ersten find aufrufen:

#!/bin/bash
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
sync; echo 1 > /proc/sys/vm/drop_caches
sync; echo 2 > /proc/sys/vm/drop_caches
sync; echo 3 > /proc/sys/vm/drop_caches

GIF zeigt an, wie viel RAM Festplatten-Caching verbraucht

Der Befehl find, der über / ausgeführt wird, belegt ungefähr 500 MB Cache-Puffer, wie der folgende Befehl .gif zeigt, wenn sie gelöscht werden:

drop_caches.gif

^^^ --- Beachten Sie, dass in der Speicherzeile direkt unter dem Terminalfenster ein Abfall von 4,74 GiB auf 4,24 GiB angezeigt wird. Es fällt tatsächlich auf 4.11 GiB, nachdem der Bildschirmrekorder peek die Datei gespeichert und geschlossen hat. Auf meinem System belegt das find Disk-Caching etwa 5% des Arbeitsspeichers.

2

Herausforderndes Projekt

In den folgenden Abschnitten werden Dinge beschrieben, die funktionieren sollten, aber nicht funktionieren. Am Ende war die einzige "sichere" Möglichkeit, diese Arbeit zu machen, mit diesem Bash-Skript:

#!/bin/bash
# NAME: find-cache
# DESC: cache find command search files to RAM
# NOTE: Written for: https://askubuntu.com/questions/1027186/improve-initial-use-of-find-performance-time?noredirect=1#comment1669639_1027186

for i in {1..10}; do
    echo "========================" >> /tmp/find-cache.log
    printf "find-cache.log # $i: "  >> /tmp/find-cache.log
    date                            >> /tmp/find-cache.log
    echo "Free RAM at start:"       >> /tmp/find-cache.log
    free -h | head -n2              >> /tmp/find-cache.log
    printf "Count of all files: "   >> /tmp/find-cache.log
    SECONDS=0                       # Environment variable
    time find /* 2>/dev/null|wc -l  >> /tmp/find-cache.log
    duration=$SECONDS               # Set elapsed seconds
    echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds for find." \
                                    >> /tmp/find-cache.log
    echo "Free RAM after find:"     >> /tmp/find-cache.log
    free -h | head -n2              >> /tmp/find-cache.log
    echo "Sleeping 15 seconds..."   >> /tmp/find-cache.log
    sleep 15
done

Kopieren Sie den obigen Text in eine Skriptdatei mit dem Namen: find-cache. Geben Sie den Skriptnamen in Startup Applications ein. Verwenden Sie die Anweisungen im nächsten Abschnitt, aber ersetzen Sie den Befehlsnamen /usr/bin/find... durch /<path-to-script>/find-cache.

Vergessen Sie nicht, das Skript als ausführbar zu kennzeichnen:

chmod a+x /<path-to-script>/find-cache

<path-to-script> sollte sich in Ihrer $ PATH-Umgebung befinden, z. B. /usr/local/bin oder vorzugsweise /home/<your-user-name>/bin. Um dies zu überprüfen, verwenden Sie echo $PATH, um die Umgebungsvariable anzuzeigen.

Jedes Mal, wenn ich mich anmelde, starte ich normalerweise conky und firefox. Sie machen wahrscheinlich andere Dinge. Überprüfen Sie die Protokolldatei, um die Einstellungen für Ihr System zu optimieren:

$ cat /tmp/find-cache.log
========================
find-cache.log # 1: Sun Apr 22 09:48:40 MDT 2018
Free RAM at start:
              total        used        free      shared  buff/cache   available
Mem:           7.4G        431M        5.9G        628M        1.1G        6.1G
Count of all files: 1906881
0 minutes and 59 seconds for find.
Free RAM after find:
              total        used        free      shared  buff/cache   available
Mem:           7.4G        1.1G        3.0G        599M        3.3G        5.3G
Sleeping 15 seconds...
========================
find-cache.log # 2: Sun Apr 22 09:49:54 MDT 2018
Free RAM at start:
              total        used        free      shared  buff/cache   available
Mem:           7.4G        1.2G        2.9G        599M        3.3G        5.3G
Count of all files: 1903097
0 minutes and 9 seconds for find.
Free RAM after find:
              total        used        free      shared  buff/cache   available
Mem:           7.4G        1.1G        3.0G        599M        3.3G        5.3G
Sleeping 15 seconds...

    (... SNIP ...)

Hinweis: zwischen der 1. und 2. iterationsfreien Version RAM werden 3 GB gelöscht, aber firefox stellt gleichzeitig 12 Registerkarten wieder her .

Was ist los? Aus welchem ​​Grund auch immer, wenn find nur einmal in einem Start-Bash-Job oder einer cron Neustart-Bash ausgeführt wird Job denkt der Linux-Kernel: "Sie wollen den Seiten-Cache wahrscheinlich nicht behalten, also werde ich ihn leeren, um RAM zu sparen" . Wenn jedoch der Befehl find zehnmal ausgeführt wird, wie in diesem Skript, denkt der Linux-Kernel: "Whoaa, sie mögen dieses Zeug wirklich im Seiten-Cache, ich räume es besser nicht aus" .

Zumindest ist das meine beste Vermutung. Unabhängig vom Grund funktioniert dieser Ansatz vielfach getestet.


Was sollte funktionieren, funktioniert aber nicht

Es folgen zwei Versuche, dieses Projekt zum Laufen zu bringen. Ich habe sie hier gelassen, damit andere keine Zeit damit verschwenden, sie zu wiederholen. Wenn du denkst, dass du sie mit allen Mitteln verbessern kannst, poste eine Antwort und ich werde fröhlich abstimmen.

Verwenden Sie Startup-Anwendungen

Tippen Sie auf und lassen Sie die Windows / Super Schlüssel (es hat das Symbol: Winkey1 oder Winkey2 oder Winkey3), um dash aufzurufen.

Geben Sie im Suchfeld startup ein und Sie sehen das Symbol Startup Applications . Klicken Sie auf das Symbol. Wenn das Fenster geöffnet wird, klicken Sie rechts auf Add. Füllen Sie die neuen Felder des Startprogramms wie folgt aus:

  • Tragen Sie den Namen als Cache Find to RAM ein.
  • Füllen Sie den Befehl als sleep 30 && find /* 2>/dev/null | wc aus.
  • Fügen Sie einen Kommentar hinzu, z. B. "Erste Ausführung des Befehls" Suchen "zum Zwischenspeichern des Datenträgers zum RAM".
  • Klicken Sie unten auf die Schaltfläche Add.

Starten Sie jetzt neu und überprüfen Sie die Leistung des Befehls find.

Credits: Windows Key Icons kopiert vom Super User post .


Cron beim Neustart

Sie können cron verwenden, um den Befehl find beim Booten aufzurufen und die langsame Festplatte im schnellen RAM zwischenzuspeichern. Führen Sie den Befehl crontab -e aus und fügen Sie die folgende Zeile unten hinzu:

@reboot /usr/sleep 30 && /usr/bin/find /* 2>/dev/null | wc -l
  • @reboot weist cron an, diesen Befehl bei jedem Start/Neustart auszuführen.
  • /usr/sleep 30 lässt den Befehl find 30 Sekunden warten, bevor er ausgeführt wird, damit der Start so schnell wie möglich ausgeführt wird. Erhöhen Sie diesen Wert je nach Startgeschwindigkeit, Anmeldezeit und auszuführenden Startanwendungen auf 45 oder 60.
  • /usr/bin/find /* 2>/dev/null | wc-l ruft den Befehl find auf, der alle Dateien durchsucht (/*). Alle Fehlermeldungen werden von 2>/dev/null ausgeblendet. Die Anzahl der Dateien wird mit | wc -l gezählt. Auf meinem System sind es aufgrund einer Ubuntu-Installation und zweier Windows 10-Installationen ungefähr 2 Millionen.
  • Nach dem Hinzufügen der Linie verwenden Ctrl+O gefolgt von Enter um die Datei zu speichern.
  • Nach dem Speichern der Datei verwenden Ctrl+X um den nano -Editor zu verlassen, der von cron verwendet wird. Wenn Sie einen anderen Editor als nano ausgewählt haben, verwenden Sie die entsprechenden Befehle zum Speichern und Beenden.

Wie immer gilt das Akronym YMMV (Ihr Kilometerstand kann variieren).

Nach dem Neustart habe ich diese Tests durchgeführt, um zu beweisen, dass nicht funktioniert :

[email protected]:~$ time find / -type f \( -name "*.tar" -o -name "*.tar.*" \) 2>/dev/null | wc
     26      26    1278

real    1m10.022s
user    0m7.246s
sys     0m12.840s
───────────────────────────────────────────────────────────────────────────────────────────
[email protected]:~$ time find / -type f \( -name "*.tar" -o -name "*.tar.*" \) 2>/dev/null | wc
     26      26    1278

real    0m8.954s
user    0m2.476s
sys     0m3.709s
2