Begrenzung der Anzahl von Unicorns, Speichernutzung und Swapping

Ich betreibe einen kleinen Server (1 GB RAM) und auch eine kleine Website (offizielle Discourse-Installation, die seit fast 8 Jahren läuft). Es gibt mehr Festplatten-Swapping als mir lieb ist, also habe ich angefangen, den Speicherverbrauch zu untersuchen.

Mir ist aufgefallen, dass ich die Anzahl der Unicorns vor einiger Zeit auf nur 2 begrenzt habe, um den Speicherverbrauch zu begrenzen (und das Swapping zu reduzieren). Discourse-Version 3.1.0 wird ausgeführt.

Wenn ich jedoch htop ausführe, sehe ich 20 laufende Unicorns (10 für Worker 0 und 10 für Worker 1).

Was übersehe ich hier? Warum laufen 20 Unicorns, während die app.yml 2 angibt?

Gibt es außerdem andere Möglichkeiten, den Speicherverbrauch zu reduzieren (z. B. wenn ich db_shared_buffers auf 128 MB reduziere, gibt es Nebenwirkungen?) Kann ich den Speicherverbrauch von Sidekiq reduzieren?

Dies ist vmstat 5 5
image

free -h
image

1 „Gefällt mir“

Ich vermute, htop zeigt Threads statt Prozesse an – jedenfalls sehe ich bei htop dasselbe wie du, aber laut

ps uaxf|egrep unicorn.?worker

nur zwei Unicorns.

Auch mein free sieht aus wie deins:

# free -h
              total        used        free      shared  buff/cache   available
Mem:           985M        782M         61M         60M        141M         32M
Swap:          2.0G        992M        1.0G

Übrigens ist es an sich kein Problem, etwas Swap-Nutzung zu sehen. Es ist das eigentliche Swapping (Paging), das wichtig wäre. Versuche vmstat 5 5 und schau dir die Spalten si und so an.

# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 1041832  63176   5716 127408  367  325   601   393    8   10  2  1 95  2  0
 0  0 1041576  60976   5724 127408  399    0   399    21  212  653  1  1 96  2  0
 0  0 1043544  77036   2296 120688  807  803   807   837  404 1144  1  2 94  3  0
 0  0 1043288  65040   3704 129476  254    0  2292     5  255  780  1  1 96  2  0
 0  0 1048736  81936   2916 119016  762 1499   919  1565  470 1171  3  2 90  5  0

Ich würde es vorziehen, nichts über 1000 zu sehen, aber ich bin nicht allzu besorgt. Ein zweiter Durchlauf zeigte ein viel ruhigeres Bild:

# vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 1048452  82712   2532 120848  367  325   601   393    8   10  2  1 95  2  0
 0  0 1047684  74552   2548 124816  285    0  1049    10  230  655  2  1 95  2  0
 0  0 1046660  66556   3692 129008  196    0  1261    16  219  672  1  1 96  2  0
 1  0 1046404  65812   3700 129284   54    0    97    13  137  364  1  0 98  0  0
 0  0 1046148  65280   3700 129288   50    0    50     3  132  344  1  0 98  0  0

Edit: Die H-Taste in htop wechselt zwischen Threads und Prozessen:

  CPU[                                                       0.0%]   Tasks: 66; 1 running
  Mem[||||||||||||||||||||||||||||||||||||||||||||||||||824M/985M]   Load average: 0.19 0.12 0.05
  Swp[||||||||||||||||||||||||||||||                  1015M/2.00G]   Uptime: 52 days, 00:50:42

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
13246 1000       20   0  966M  362M  6448 S  0.0 36.8 51:01.52 unicorn worker[0] -E production -c config/unicorn.conf.rb
13237 1000       25   5 1004M  194M  3780 S  0.0 19.8 22:38.19 sidekiq 6.5.9 discourse [0 of 5 busy]
13258 1000       20   0  919M 70176  3632 S  0.0  7.0  5:02.87 unicorn worker[1] -E production -c config/unicorn.conf.rb
12412 systemd-r  20   0  212M 60928 56916 S  0.0  6.0  0:00.23 postgres: 13/main: discourse discourse [local] idle
12818 systemd-r  20   0  212M 39228 34868 S  0.0  3.9  0:00.07 postgres: 13/main: discourse discourse [local] idle
12719 systemd-r  20   0  211M 28400 25336 S  0.0  2.8  0:00.03 postgres: 13/main: discourse discourse [local] idle
13117 1000       20   0  541M 13768  2048 S  0.0  1.4  1:08.11 unicorn master -E production -c config/unicorn.conf.rb

Edit: Ich habe db_shared_buffers: "128MB" schon sehr früh gesetzt und hatte damit keine Probleme.

1 „Gefällt mir“

Danke, sehr hilfreich. Was ist der Nachteil, wenn man zu einem einzigen Unicorn-Worker wechselt? Würde das die Antwortzeit verbessern oder verschlechtern (ist ein Unicorn-Worker auf eine eingehende Verbindung beschränkt, d. h. würden 2 Worker eine einzelne eingehende Verbindung schneller verarbeiten?), vorausgesetzt, ich habe nur wenige Verbindungen pro Minute?

Wenn ich die Website durchsuche, sieht vmstat 5 5 so aus. Haben Sie Vorschläge, wie ich das Swapping reduzieren kann (ich habe die Swappiness auf 10 eingestellt)?

EDIT: Gibt es eine Möglichkeit, die Speichernutzung von Sidekiq zu reduzieren, ohne die Leistung zu beeinträchtigen?

Es sieht sicherlich so aus, als ob Ihre Website schneller wäre, wenn Sie mehr RAM hätten. Aber wenn die Antwortzeit kein Problem darstellt, gibt es kein Problem. Betrachten Sie einfach Ihre persönliche Kosten-Nutzen-Gleichung.

Vielleicht interessiert Sie die Lektüre von MKJs Meinung zur Discourse-Deployment-Konfiguration. Es gibt ein paar Kernel-Tweaks auf Systemebene, die eine gute Idee sind. Ich weiß nicht, ob sie einen Unterschied machen werden oder nicht.

Ich weiß es nicht, aber ich denke, jedes Unicorn kann eine Anfrage bearbeiten. Wenn Sie also nur ein Unicorn haben und genügend Traffic für eine zweite Anfrage, bevor die erste abgeschlossen ist, muss diese zweite Anfrage warten. Sie können aus meiner htop-Ausgabe sehen, dass ein Unicorn 10x mehr CPU-Zeit als das andere verbraucht hat. Ich würde das so interpretieren, dass mein Forum zu 90 % der Zeit nur ein Unicorn benötigt und zu 10 % der Zeit das zweite Unicorn hilfreich ist. Ich sehe keine Notwendigkeit, ein drittes hinzuzufügen, und es wäre für meine Forenmitglieder vielleicht kein großes Problem, wenn ich auf eines reduzieren würde. Aber ich sehe keinen Grund dafür: Es mag Speicher verbrauchen, aber wenn es im Leerlauf ist, wird es ausgetauscht. Kein großes Problem: Lassen Sie das virtuelle Speichersystem damit umgehen.

Bearbeiten: Ich habe die Swappiness nie angepasst. Sie scheint bei 60 zu liegen. Aggressiveres Swapping könnte nützlich sein, wenn es mehr RAM für I/O-Puffer freigibt. Ich weiß es nicht.

2 „Gefällt mir“

Gibt es eine Möglichkeit, nur neu zu starten, ohne neu zu erstellen über ./launcher rebuild app, wenn ich db_shared_buffers und UNICORN_WORKERS ändere?