Fehlerbehebung - Wert für 'TaskMax' ist zu niedrig

Die Db2® -Datenbank, die in einem systemd -Ausschnitt ausgeführt wird (normalerweise beim Start durch Db2 Fault Monitor), kann eine Verbindung möglicherweise aufgrund von pthread_create OSERR: EAGAIN (11) nicht starten oder zurückweisen, wenn der Grenzwert für TasksMax zu niedrig eingestellt ist.

Umgebung

Linux -System mit systemd , wobei Db2 in einem systemd -Ausschnitt ausgeführt wird.

Problemdiagnose

Überprüfen Sie die Standardthreadbegrenzung für alle Services auf dem System:

$ systemctl show --property DefaultTasksMax

Symptom

Der Befehl db2start kann mit dem Fehlercode SQL1225N fehlschlagen und es wird eine entsprechende Nachricht in der Datei db2diag.log protokolliert.

Beispielprotokoll:
2018-12-05-11.00.34.332127+060 I52280E490            LEVEL: Severe
PID     : 11859                TID : 139906236016384 PROC : db2sysc 0
INSTANCE: db2v111              NODE : 000
HOSTNAME: db2host1
EDUID   : 1                    EDUNAME: db2sysc 0
FUNCTION: DB2 UDB, base sys utilities, sqeAgentServices::CreateIdleAgent, probe:110
RETCODE : ZRC=0xFFFFFB37=-1225
          SQL1225N  The request failed because an operating system process,
          thread, or swap space limit was reached.

CALLED  : OS, -, pthread_create                   OSERR: EAGAIN (11)
DATA #1 : Codepath, 8 bytes
5:10:25:35

Abhängig von den erzwungenen Grenzwerten werden Verbindungen übe einem bestimmten Schwellenwert mit dem Fehler SQL1225N zurückgewiesen, der an die Anwendung zurückgegeben wird, und ein weiterer Fehler wird von der Engine-Dispatchable-Unit (EDU) db2ipccm oder db2tcpcm in der Datei db2diag.log protokolliert.

Beispielprotokoll:
2018-12-05-11.00.34.326462+060 E50682E470            LEVEL: Error (OS)
PID     : 11859                TID : 139906236016384 PROC : db2sysc 0
INSTANCE: db2v111              NODE : 000
HOSTNAME: db2host1
EDUID   : 1                    EDUNAME: db2ipccm 0
FUNCTION: DB2 UDB, oper system services, sqloSpawnEDU, probe:80
MESSAGE : ZRC=0x8300000B=-2097151989
         
CALLED  : OS, -, pthread_create                   OSERR: EAGAIN (11)
DATA #1 : Codepath, 8 bytes
5:10:25:35

Ursache

Die Db2 -Datenbank hat einen vom Betriebssystem erzwungenen Grenzwert, den ein bestimmter Prozess oder Benutzer erstellen kann. Die RLIMIT_NPROC wird für Rootinstanzen seit Db2 10.5.0.5automatisch überschrieben, sodass sie normalerweise nicht die eigentliche Ursache für EAGAIN-Fehler ist.

Unter Linux-Distributionen unter Verwendung von systemd (RedHat 7, SUSE 12) wurde eine zusätzliche Ebene der Ressourcenverwaltung mit der Bezeichnung "Slices" eingeführt, bei der eine Threadbegrenzung durch eine Variable TasksMax erzwungen werden kann. Der Standardwert von 512 ist für SUSE 12 SP2 und höher festgelegt und hat Auswirkungen auf alle Services, die auf dem System ausgeführt werden. Weitere Informationen finden Sie in SUSE Linux Enterprise Server 12 SP2 -Releaseinformationen.

Wenn db2start in Db2manuell gestartet wird, wird es nicht im systemd -Sektor ausgeführt, sodass es von dem Grenzwert nicht betroffen ist. Der Grenzwert wird jedoch für Db2 erzwungen, wenn er von db2fmcdgestartet wird, weil alle Prozesse, die vom Db2 -Fehlermonitor generiert werden, im Sektor des Service ausgeführt werden. Beispiel:
systemctl status db2fmcd
* db2fmcd.service - DB2 v11.1.3.3
   Loaded: loaded (/etc/systemd/system/db2fmcd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2018-11-08 02:07:56 PST; 3 weeks 6 days ago
 Main PID: 939 (db2fmcd)
   CGroup: /system.slice/db2fmcd.service
           *   939 /opt/ibm/db2/V11.1/bin/db2fmcd
           * 14508 db2wdog 0 [db2v111]
           * 14512 db2sysc 0
           * 14520 db2ckpwd 0
           * 14521 db2ckpwd 0
           * 14522 db2ckpwd 0
           * 14524 db2vend (PD Vendor Process - 1) 0
           * 14536 db2acd 0 ,0,0,0,1,0,0,00000000,0,0,0,0000000000000000,0000000000000000,00000000,00000000,00000000,00000000,00000000,00000000,0000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,000000033408b0...

Problemlösung

Versuchen Sie, den Wert von DefaultTasksMax in /etc/systemd/system.conf oder von TasksMax in der Servicedatei (z. B. db2fmcd.service) zu erhöhen.