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 select
eines 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.
select
?