Isolierende Ursache für eine höhere CPU-Auslastung bei RHEL 6 gegenüber RHEL 5

9

Ich versuche derzeit, unser System von RHEL 5 auf RHEL 6 zu verschieben, aber ich bin auf einen Haken mit unerwartet hoher CPU-Auslastung auf den RHEL 6-Computern gestoßen. Es scheint, dass dies zumindest teilweise auf die Verwendung selecteines unterbrechbaren Schlafes zurückzuführen ist. Hier ist ein einfaches Beispiel, das das Verhalten zeigt:

#include <sys/select.h>

int main()
{
  timeval ts;
  for (unsigned int ii=0; ii<10000; ++ii) {
    ts.tv_sec = 0;
    ts.tv_usec = 1000;
    select(0, 0, 0, 0, &ts);
  }

  return 0;
}

Auf einem RHEL 5-Computer bleibt die CPU-Auslastung bei 0%, auf derselben Hardware mit installiertem RHEL 6 werden jedoch etwa 0,5% der CPU verbraucht. Wenn also 30 bis 50 Programme ausgeführt werden select, um einen Ruhezustand auszuführen, wird a verbraucht große Menge der CPU unnötig.

Ich habe ein Bugzilla geöffnet und versucht, OProfile auszuführen. Es zeigt einfach 100% in main für die Anwendung und etwas mehr als 99% in poll_idle, wenn ich mir den Kernel anschaue (ich habe idle = poll in meinen Grub-Optionen festgelegt, damit alles erfasst werden kann).

Irgendwelche anderen Ideen, was ich tun kann, um herauszufinden, was die Ursache für die höhere CPU-Auslastung ist?

UPDATE: Ich habe das Perf-Tool gefunden und die folgende Ausgabe erhalten:

# Events: 23K cycles
#
# Overhead  Command        Shared Object                                Symbol
# ........  .......  ...................  ....................................
#
    13.11%  test_select_sma  [kernel.kallsyms]    [k] find_busiest_group
     5.88%  test_select_sma  [kernel.kallsyms]    [k] schedule
     5.00%  test_select_sma  [kernel.kallsyms]    [k] system_call
     3.77%  test_select_sma  [kernel.kallsyms]    [k] copy_to_user
     3.39%  test_select_sma  [kernel.kallsyms]    [k] update_curr
     3.22%  test_select_sma  ld-2.12.so           [.] _dl_sysinfo_int80
     2.83%  test_select_sma  [kernel.kallsyms]    [k] native_sched_clock
     2.72%  test_select_sma  [kernel.kallsyms]    [k] find_next_bit
     2.69%  test_select_sma  [kernel.kallsyms]    [k] cpumask_next_and
     2.58%  test_select_sma  [kernel.kallsyms]    [k] native_write_msr_safe
     2.47%  test_select_sma  [kernel.kallsyms]    [k] sched_clock_local
     2.39%  test_select_sma  [kernel.kallsyms]    [k] read_tsc
     2.26%  test_select_sma  [kernel.kallsyms]    [k] do_select
     2.13%  test_select_sma  [kernel.kallsyms]    [k] restore_nocheck

Es scheint, dass die höhere CPU-Auslastung vom Scheduler stammt. Ich habe auch das folgende Bash-Skript verwendet, um 100 davon gleichzeitig zu starten:

#!/bin/bash

for i in {1..100}
do
  ./test_select_small &
done

Bei RHEL 5 bleibt die CPU-Auslastung nahe 0%, bei RHEL 6 ist die CPU-Auslastung sowohl bei Benutzern als auch bei Systemen nicht trivial. Irgendwelche Ideen, wie man die wahre Quelle dieses Problems aufspürt und es hoffentlich behebt?

Ich habe diesen Test auch mit einem aktuellen Arch Linux-Build und Ubuntu 11.10 versucht und ein ähnliches Verhalten festgestellt. Daher scheint dies eine Art Kernel-Problem zu sein und nicht nur ein RHEL-Problem.

UPDATE2: Ich zögere ein wenig, dies anzusprechen, da ich weiß, dass es eine große Debatte ist, aber ich habe einen Kernel mit den BFS-Patches unter Ubuntu 11.10 ausprobiert und er zeigte nicht die gleiche hohe CPU-Auslastung des Systems (die CPU-Auslastung des Benutzers schien ungefähr zu sein das Gleiche).

Gibt es einen Test, den ich mit jedem von ihnen ausführen kann, um zu testen, ob diese hohe CPU-Auslastung nur ein Unterschied in der Berücksichtigung der CPU-Auslastung ist, der sie künstlich hoch aussehen lässt? Oder wenn tatsächliche CPU-Zyklen vom CFS gestohlen werden?

UPDATE3: Die mit dieser Frage durchgeführte Analyse scheint darauf hinzudeuten, dass sie mit dem Scheduler zusammenhängt. Daher habe ich eine neue Frage erstellt , um die Ergebnisse zu diskutieren.

UPDATE4: Ich habe der anderen Frage weitere Informationen hinzugefügt .

UPDATE5: Ich habe der anderen Frage einige Ergebnisse aus einem einfacheren Test hinzugefügt, der das Problem immer noch demonstriert.

Dave Johansen
quelle
Es scheint, als hätte RedHat dies dem GLibC mitgeteilt. Haben Sie dort nach Codeänderungen gesucht select?
Nils
Die Glibc-Kategorisierung wurde von mir vorgenommen, als ich die Bugzilla ursprünglich eingereicht habe.
Dave Johansen
Klingt für mich vernünftig (eher als ein Kernel-Problem). Erhalten Sie ähnliche Ergebnisse bei mehreren gleichzeitigen Schlafvorgängen? Was sind die glibc-Versionen von Ubuntu 11.10, Arch Linux und RHEL6?
Nils
Ja, das gleiche Ergebnis, wenn sowohl Poll als auch Usleep 1 ms lang schlafen. Was glibc betrifft, ist RHEL 5 2,5, RHEL 6 ist 2,12, Ubuntu 11.10 ist 2,13 und ich glaube, Arch ist 2,15, aber ich müsste es überprüfen.
Dave Johansen
Anscheinend haben Sie die Antwort auf diese ursprüngliche Frage selbst gefunden. Poste es als Antwort hier und verdiene deine Punkte dafür!
Nils

Antworten:

1

Du fragst:

Gibt es einen Test, den ich mit jedem von ihnen ausführen kann, um zu testen, ob diese hohe CPU-Auslastung nur ein Unterschied in der Berücksichtigung der CPU-Auslastung ist, der sie künstlich hoch aussehen lässt? Oder wenn tatsächliche CPU-Zyklen vom CFS gestohlen werden?

Was ist, wenn Sie während der Ausführung Ihres test_select_smallProgramms einen CPU-Benchmark ausgeführt haben und feststellen, ob sich die Leistung je nach Version des Host-Betriebssystems ändert?

Es gibt viele Möglichkeiten: Der klassische Rat lautet immer "Verwenden Sie etwas, das die Art der Last darstellt, die Sie haben". Aber die coolen Kids haben immer nur Povray benutzt

ckhan
quelle
1
Ich denke, das war die Idee, auf die ich mich bezog. Haben Sie eine Empfehlung für eine solche Benchmark-App, die konsistente Timing-Ergebnisse liefert, die ich verwenden könnte?
Dave Johansen
@ DaveJohansen - Hinweis auf Povray hinzugefügt
ckhan
Leider kann es mindestens ein bis zwei Wochen dauern, bis Software auf diesen Systemen installiert ist, es sei denn, es wird mit RHEL geliefert. Ich habe mein eigenes kleines Testprogramm erstellt und eine neue Frage erstellt , um die Ergebnisse zu diskutieren.
Dave Johansen