Großartiger Kommentar von @Thiago Silveira über die erste Ausgabe des iex. Der Teil [smp:8:8]
sagt aus, wie viele Prozesse auf Betriebssystemebene Erlang verwendet. Sie können dies mit Flagge steuern --smp
, wenn Sie es deaktivieren möchten:
iex --erl '-smp disable'
Dadurch wird sichergestellt, dass Sie nur ein Systemprozess haben. Sie können ein ähnliches Ergebnis erzielen, indem Sie die symmetrische Mehrfachverarbeitung aktiviert lassen, aber direkt NumberOfShcedulers:NumberOfSchedulersOnline
setzen.
iex --erl '+S 1:1'
Jedes Betriebssystem Prozess benötigt einen eigenen Scheduler für Erlang Prozesse haben, so können Sie leicht sehen, wie viele von ihnen haben Sie zur Zeit:
:erlang.system_info(:schedulers_online)
Ihre Frage über die Leistung zu beantworten. Wenn Ihre Prozessoren nicht mit voller Kapazität arbeiten (100%) und keiner von ihnen nichts tut (0%), ist es wahrscheinlich, dass die Last nicht gleichmäßiger verteilt wird, wenn sie gleichmäßiger verteilt wird. Warum?
Die CPU-Auslastung wird gemessen, indem der Prozessorstatus zu vielen Zeitpunkten untersucht wird. Diese Zustände sind entweder "Arbeiten" oder "Leerlauf". Eine CPU-Auslastung von 82% bedeutet, dass Sie mehrere Aufgaben auf dieser CPU ausführen können, ohne andere Aufgaben zu verlangsamen.
Erlang-Scheduler versuchen, intelligent zu sein und Erlang-Prozesse zwischen Kernen nicht zu migrieren, es sei denn, sie müssen es, weil sie kopiert werden müssen. Die Migration findet beispielsweise statt, wenn einer der Scheduler im Leerlauf ist. Es kann dann einen Prozess von anderen Scheduler-Run-Queue ausleihen.
Das nächste, was solch eine große Diskrepanz zwischen ungeraden und geraden Kernen verursachen kann, ist Hyper Threading. Auf meinem Dual-Core-Prozessor htop
zeigt 4 logische Kerne. In Ihrem Fall haben Sie wahrscheinlich 4 physische Kerne und 8 logische wegen HT. Es kann der Fall sein, dass Sie Ihre physischen Kerne mit 100% verwenden.
Eine andere Sache: pmap muss Ergebnis in separaten Prozess berechnen, aber am Ende sendet es an den Anrufer, die ein Engpass sein kann. Je mehr Nachrichten gesendet werden, desto weniger CPU-Auslastung können Sie erzielen. Sie können versuchen, den Prozessen eine Aufgabe zu geben, die wirklich CPU-intensiv ist, wie die Berechnung Ackerman function.Mit Amdahl's law können Sie sogar berechnen, wie viel von Ihrem Job der sequentielle Teil und wie viel parallel ist, und die Ausführungszeiten für verschiedene Kerne messen.
Zusammenfassend: die CPU-Auslastung von Screenshot sieht wirklich toll aus! Für leistungsintensivere Aufgaben müssen Sie nichts ändern.
Was ist die erste Ausgabezeile von iex? zB: "Erlang/OTP 18 [erts-7.3] [Quelle] [64-Bit] [smp: 4: 4] [async-threads: 10] [hipe] [kernel-poll: false] [dtrace]" –
@ ThiagoSilveira'Erlang/OTP 18 [erts-7.3] [Quelle] [64-bit] [smp: 8: 8] [async-threads: 10] [hipe] [kernel-poll: false] [dtrace] ' – user456584