ps aux hängt an hoher CPU / IO mit Java-Prozessen

13

Ich habe einige Probleme mit Java-Prozess und NRPE-Prüfungen. Wir haben einige Prozesse, die manchmal 1000% CPU auf einem 32-Kern-System verwenden. Das System reagiert ziemlich schnell, bis Sie a

ps aux 

oder versuche irgendetwas in der / proc / pid # zu machen

[[email protected] /proc/18679]# ls
hangs..

Eine Spur von ps aux

stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2819, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2819, ...}) = 0
stat("/dev/pts1", 0x7fffb8526f00)       = -1 ENOENT (No such file or directory)
stat("/dev/pts", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
readlink("/proc/15693/fd/2", "/dev/pts/1", 127) = 10
stat("/dev/pts/1", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
write(1, "root     15693 15692  0 06:25 pt"..., 55root     15693 15692  0 06:25 pts/1    00:00:00 ps -Af
) = 55
stat("/proc/18679", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/18679/stat", O_RDONLY)      = 5
read(5, "18679 (java) S 1 18662 3738 3481"..., 1023) = 264
close(5)                                = 0
open("/proc/18679/status", O_RDONLY)    = 5
read(5, "Name:\tjava\nState:\tS (sleeping)\nT"..., 1023) = 889
close(5)                                = 0
open("/proc/18679/cmdline", O_RDONLY)   = 5
read(5,

Der Java-Prozess funktioniert und wird problemlos abgeschlossen. Das Problem ist jedoch, dass unsere Überwachung nicht mehr funktioniert, da es zu Zeitüberschreitungen kommt, bis ein PS-Aux-Vorgang abgeschlossen ist.

Ich habe versucht, so etwas zu tun

 nice -19 ionice -c1 /usr/lib64/nagios/plugins/check_procs -w 1:1 -c 1:1 -a 'diamond' -u root -t 30

ohne glück

BEARBEITEN

Systemspezifikationen

  • 32-Kern Intel (R) Xeon (R) -CPU E5-2650 0 bei 2,00 GHz
  • 128 g Widder
  • 12 4 TB 7200-Laufwerke
  • CentOS 6.5
  • Ich bin nicht sicher, ob das Modell, aber der Anbieter ist SuperMicro

In diesem Fall beträgt die Belastung 1 Minute lang etwa 90-160 Fisch.

Der seltsame Teil ist, dass ich in jede andere / proc / pid # gehen kann und es funktioniert einwandfrei. Das System reagiert, wenn ich einspringe. Wie wenn wir über hohe Auslastung informiert werden, kann ich gut einspringen.

Noch eine Bearbeitung

Ich habe Deadline für Scheduler verwendet

[[email protected] ~]# for i in {a..m}; do cat /sys/block/sd${i}/queue/scheduler; done
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq
noop anticipatory [deadline] cfq

Mount sieht aus wie

[[email protected] ~]# mount
/dev/sda3 on / type ext4 (rw,noatime,barrier=0)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext2 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb1 on /disk1 type xfs (rw,nobarrier)
/dev/sdc1 on /disk2 type xfs (rw,nobarrier)
/dev/sdd1 on /disk3 type xfs (rw,nobarrier)
/dev/sde1 on /disk4 type xfs (rw,nobarrier)
/dev/sdf1 on /disk5 type xfs (rw,nobarrier)
/dev/sdg1 on /disk6 type xfs (rw,nobarrier)
/dev/sdh1 on /disk7 type xfs (rw,nobarrier)
/dev/sdi1 on /disk8 type xfs (rw,nobarrier)
/dev/sdj1 on /disk9 type xfs (rw,nobarrier)
/dev/sdk1 on /disk10 type xfs (rw,nobarrier)
/dev/sdl1 on /disk11 type xfs (rw,nobarrier)
/dev/sdm1 on /disk12 type xfs (rw,nobarrier)

Ok, ich habe versucht, tuned zu installieren und habe es auf Durchsatzleistung eingestellt.

[[email protected] ~]# tuned-adm profile throughput-performance
Switching to profile 'throughput-performance'
Applying deadline elevator: sda sdb sdc sdd sde sdf sdg sdh[  OK  ] sdk sdl sdm
Applying ktune sysctl settings:
/etc/ktune.d/tunedadm.conf:                                [  OK  ]
Calling '/etc/ktune.d/tunedadm.sh start':                  [  OK  ]
Applying sysctl settings from /etc/sysctl.d/99-chef-attributes.conf
Applying sysctl settings from /etc/sysctl.conf
Starting tuned:                                            [  OK  ]
Mike
quelle
Können Sie Informationen zur Serverumgebung bereitstellen? Die Betriebssystemverteilung und -version sowie die Hardwareplattform wären relevant.
Ewwhite
Ihre Systemlast zu dem Zeitpunkt, an dem dies geschieht, ist ebenfalls wichtig.
Ewwhite
Ich habe einige Änderungen an den technischen Daten vorgenommen und festgestellt, wie hoch die Belastung ist
Mike
Wie sieht die Ausgabe von mountaus?
Ewwhite
Sehr gut. tuned-adm profile enterprise-storageZiehen Sie in Betracht, den Befehl für den Nobarrier- und Deadline-Schalter zu verwenden. Was zeigt die dmesg|tailAusgabe? Sehen Sie E / A-Zeitüberschreitungen?
Ewwhite

Antworten:

8

Im Allgemeinen habe ich gesehen, dass dies aufgrund einer festgefahrenen Lesung passiert ist. Dies wird durch Ihre straceAusgabe bestätigt . Der Versuch, die Datei / proc / xxxx / cmdline zu lesen, hängt, während Sie den ps auxBefehl ausführen .

Die momentanen E / A-Spitzen belasten die Systemressourcen. Eine Last von 90-160 ist eine äußerst schlechte Nachricht, wenn es sich um ein Speichersubsystem handelt.

Können Sie uns für das Speicherarray mitteilen, ob ein Hardware-RAID-Controller vorhanden ist? Ist die primäre Anwendung auf dem Server schreibgeschützt? Die von Ihnen genannten Festplatten (12 x 4 TB) sind Nearline-SAS- oder SATA-Festplatten mit niedrigerer Geschwindigkeit. Wenn vor dem Laufwerksarray keine Form des Schreibcaches vorhanden ist , können Schreibvorgänge die Systemlast nach oben drücken. Wenn es sich um reine SATA-Laufwerke auf einer Supermicro-Rückwandplatine handelt, schließen Sie die Möglichkeit anderer Festplattenprobleme ( Zeitüberschreitungen, Ausfall von Laufwerken, Rückwandplatinen usw. ) nicht aus. Tritt dies auf allen Hadoop-Knoten auf?

Ein einfacher Test besteht darin, zu versuchen, iotopwährenddessen auszuführen . Haben Sie, da dies EL6.5 ist, eine der tuned-admEinstellungen aktiviert? Sind Schreibbarrieren aktiviert?

Wenn Sie den E / A-Aufzug des Servers nicht geändert ionicehaben , kann dies Auswirkungen haben. Wenn Sie es in etwas anderes als CFQ geändert haben ( dieser Server sollte wahrscheinlich zum Stichtag sein ), ionicewird dies keinen Unterschied machen.

Bearbeiten:

Eine andere seltsame Sache, die ich in Produktionsumgebungen gesehen habe. Dies sind Java-Prozesse, und ich gehe davon aus, dass sie stark multithreaded sind. Wie geht es dir mit PIDs? Was ist der sysctlWert für kernel.pid_max ? Ich hatte schon einmal Situationen, in denen ich PIDs erschöpft hatte und eine hohe Last hatte.

Außerdem erwähnen Sie die Kernel-Version 2.6.32-358.23.2.el6.x86_64 . Das ist über ein Jahr alt und Teil der CentOS 6.4-Version, aber der Rest Ihres Servers ist 6.5. Haben Sie Kernel-Updates in yum.conf gesperrt? Sie sollten wahrscheinlich auf Kernel 2.6.32-431.xx oder neuer für dieses System sein. Möglicherweise liegt ein großes Problem mit dem älteren Kernel vor . Wenn Sie den Kernel nicht ändern können, deaktivieren Sie ihn mit:

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled.

ewwhite
quelle
Es gibt eine RAID-Karte, die jedoch nur für die Verarbeitung von 12 Laufwerken auf dem Server verwendet wird. Da es Teil eines Hadoop-Clusters ist, schreibt es viel, aber auch diese Probleme treten auf, wenn das Garn viele Daten für einen Kartenverkleinerungsjob zieht.
Mike
Ich werde vom Rechenzentrum angerufen, um zu erfahren, auf was der RAID-Controller für den Schreibcache eingestellt ist. Was die Karte angeht, die 3a0613065fa Adaptec \ 71605 \ SATA/SAS RAID ich überprüft habe, dass es sich auch um SATA-Laufwerke handelt Western Digital WD RE WD4000FYYZ
Mike
1
@mike Wenn Sie den Kernel nicht ändern können, versuchen Sie: echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabledauf einem betroffenen Computer. Ich gehe davon aus, dass dies reproduzierbar genug ist, dass Sie mit dieser Einstellung ein Vorher / Nachher beobachten können.
Ewwhite
4
Es sieht so aus, als ob das Einstellen und Deaktivieren der Riesen-Seite das Problem behoben hat!
Mike
1
@ Mike Ausgezeichnet. Ein Kernel-Update kann ebenfalls Abhilfe schaffen. Aber wenn Sie mit dem laufenden Kernel nicht weiterkommen, bin ich froh, dass dieses Update funktioniert.
Ewwhite
3

Das Problem ist eindeutig kein festplattenbezogenes Problem. Und das geht aus der aufgehängten Straße hervor:

open("/proc/18679/cmdline", O_RDONLY)   = 5
read(5,

/ proc ist eine Schnittstelle zwischen Kernel und Userspace. Es berührt die Festplatte überhaupt nicht. Wenn etwas beim Lesen der Argumente eines Befehls aufgehängt wird, handelt es sich normalerweise um ein Kernel-Problem und wahrscheinlich nicht um ein Speicherproblem. Siehe @kasperd Kommentar.

Die Belastung ist nur ein Nebeneffekt des Problems und die hohe Anzahl sagt nicht die ganze Geschichte aus. Sie könnten einen Server mit sehr hoher Auslastung haben, auf dem sich die Anwendung fehlerfrei verhält.

Sie können weitere Informationen darüber erhalten, was passiert cat /proc/$PID/stack. Wo $PIDist die Prozess-ID, an der der Lesevorgang unterbrochen wird?

In Ihrem Fall würde ich mit einem Kernel-Upgrade beginnen.

Mircea Vutcovici
quelle
2
Du liegst falsch. Beim Lesen /proc/%d/cmdlinewird der Teil des Adressraums des Prozesses zurückgegeben, in dem der Kernel die Befehlszeile während des execveAufrufs gespeichert hat . Wie jeder andere Teil des Benutzerraums kann er ausgetauscht werden. Wenn Sie also darauf zugreifen, müssen Sie möglicherweise warten, bis die Seite wieder eingelagert wird.
Kasperd
Das ist ein sehr gutes Argument. Danke, dass du aufgestanden bist. Ich denke jedoch, dass die Chancen, dass die Situation beginnt, wenn Ihr Swap nicht antwortet, gering, aber nicht unmöglich sind. Ich werde meine Antwort aktualisieren.
Mircea Vutcovici
2

Trotz aller Optimierungen und eines Upgrades auf den neuesten 2.6-Kernel, den CentOS bereitstellt, blieben die Probleme weiterhin bestehen. Nicht so viel wie zuvor, aber immer noch zu sehen.

Das Update bestand darin, auf den Kernel der 3.10.x-Serie zu aktualisieren, den CentOS in seinem Centosplus-Repo hier bereitstellt

http://mirror.centos.org/centos/6/xen4/x86_64/Packages/

Dies hat alle Prozessbaum-Hänge beseitigt. Wie ich schon sagte, das System war nicht unter einer verrückten Last, bei der das Ausführen neuer Prozesse nicht bissig war. Die meisten sind also irgendwo ein 2.6er Kernel-Problem.

Mike
quelle
0

Dies ist ein weiterer Fix.

Sieht so aus, als würden wir den folgenden RAID-Controller ausführen

Adaptec 71605

Ich habe Firmware-Updates für alle betroffenen Computer auf die neueste Version durchgeführt und das Problem scheint behoben zu sein.

Wir mussten ein Downgrade vom 3.10-Kernel-Experiment durchführen, da andere zufällige Probleme bei der Installation von 3.10 unter CentOS 6 auftraten. Dieses Problem wurde jedoch durch das Firmware-Upgrade behoben.

Mike
quelle