So behandeln Sie den vom Linux-System gemeldeten Fehler tcp_mark_head_lost

So behandeln Sie den vom Linux-System gemeldeten Fehler tcp_mark_head_lost

Problembeschreibung

Kürzlich meldete ein Host die folgenden Kernel-Informationen:

8. Juli 10:47:42 cztest kernel: ------------[ hier abschneiden ]------------
8. Juli 10:47:42 cztest-Kernel: WARNUNG: bei net/ipv4/tcp_input.c:2269 tcp_mark_head_lost+0x113/0x290()
8. Juli 10:47:42 cztest-Kernel: Eingebundene Module: iptable_filter ip_tables binfmt_misc cdc_ether usbnet mii xt_multiport dm_mirror dm_region_hash dm_log dm_mod intel_powerclamp coretemp intel_rapl iosf_mbi kvm_intel kvm irqbypass crc32_p
clmul ghash_clmulni_intel aesni_intel lrw gf128mul glue_helper ablk_helper cryptd ipmi_ssif ipmi_devintf ipmi_si mei_me pcspkr iTCO_wdt mxm_wmi iTCO_vendor_support dcdbas mei sg sb_edac edac_core ipmi_msghandler shpchp lpc_ich wmi acpi_p
Stromzähler xfs libcrc32c sd_mod crc_t10dif crct10dif_generic mgag200 drm_kms_helper crct10dif_pclmul crct10dif_common syscopyarea crc32c_intel sysfillrect sysimgblt fb_sys_fops igb ttm ptp drm ahci pps_core libahci dca i2c_algo_bit libat
ein megaraid_sas i2c_core fjes [zuletzt entladen: ip_tables]
8. Juli 10:47:42 cztest Kernel: CPU: 10 PID: 0 Comm: swapper/10 Tainted: GW ------------ 3.10.0-514.16.1.el7.x86_64 #1
8. Juli 10:47:42 cztest Kernel: Hardwarename: Dell Inc. PowerEdge R630/02C2CP, BIOS 2.3.4 08.11.2016
8. Juli 10:47:42 cztest-Kernel: 0000000000000000 dd79fe633eacd853 ffff88103e743880 ffffffff81686ac3
8. Juli 10:47:42 cztest-Kernel: ffff88103e7438b8 ffffffff81085cb0 ffff8806d5c57800 ffff88010a4e6c80
8. Juli 10:47:42 cztest-Kernel: 0000000000000001 00000000f90e778c 00000000000000001 ffff88103e7438c8
8. Juli 10:47:42 cztest kernel: Call Trace:
8. Juli 10:47:42 cztest kernel: <IRQ> [<ffffffff81686ac3>] dump_stack+0x19/0x1b
8. Juli 10:47:42 cztest kernel: [<ffffffff81085cb0>] warn_slowpath_common+0x70/0xb0
8. Juli 10:47:42 cztest kernel: [<ffffffff81085dfa>] warn_slowpath_null+0x1a/0x20
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815c3663>] tcp_mark_head_lost+0x113/0x290
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815c3f47>] tcp_update_scoreboard+0x67/0x80
8. Juli 10:47:42 cztest kernel: [<ffffffff815c964d>] tcp_fastretrans_alert+0x6dd/0xb50
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815ca49d>] tcp_ack+0x8dd/0x12e0
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815cb3a8>] tcp_rcv_established+0x118/0x760
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815d5f8a>] tcp_v4_do_rcv+0x10a/0x340
8. Juli 10:47:42 cztest kernel: [<ffffffff812a84c6>] ? security_sock_rcv_skb+0x16/0x20
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815d76d9>] tcp_v4_rcv+0x799/0x9a0
8. Juli 10:47:42 cztest-Kernel: [<ffffffffa0140036>] ? iptable_filter_hook+0x36/0x80 [iptable_filter]
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815b1094>] ip_local_deliver_finish+0xb4/0x1f0
8. Juli 10:47:42 cztest kernel: [<ffffffff815b1379>] ip_local_deliver+0x59/0xd0
8. Juli 10:47:42 cztest kernel: [<ffffffff815b0fe0>] ? ip_rcv_finish+0x350/0x350
8. Juli 10:47:42 cztest kernel: [<ffffffff815b0d1a>] ip_rcv_finish+0x8a/0x350
8. Juli 10:47:42 cztest kernel: [<ffffffff815b16a6>] ip_rcv+0x2b6/0x410
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815700d2>] __netif_receive_skb_core+0x582/0x800
8. Juli 10:47:42 cztest kernel: [<ffffffff815dc694>] ? tcp4_gro_receive+0x134/0x1b0
8. Juli 10:47:42 cztest kernel: [<ffffffff811dc861>] ? __slab_free+0x81/0x2f0
8. Juli 10:47:42 cztest-Kernel: [<ffffffff81570368>] __netif_receive_skb+0x18/0x60
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815703f0>] netif_receive_skb_internal+0x40/0xc0
8. Juli 10:47:42 cztest kernel: [<ffffffff81571578>] napi_gro_receive+0xd8/0x130
8. Juli 10:47:42 cztest-Kernel: [<ffffffffa018b237>] igb_clean_rx_irq+0x387/0x700 [igb]
8. Juli 10:47:42 cztest-Kernel: [<ffffffff8155e862>] ? skb_release_data+0xf2/0x140
8. Juli 10:47:42 cztest-Kernel: [<ffffffffa018b933>] igb_poll+0x383/0x770 [igb]
8. Juli 10:47:42 cztest-Kernel: [<ffffffff815d3120>] ? tcp_write_timer_handler+0x200/0x200
8. Juli 10:47:42 cztest-Kernel: [<ffffffff81570c00>] net_rx_action+0x170/0x380
8. Juli 10:47:42 cztest-Kernel: [<ffffffff8108f63f>] __do_softirq+0xef/0x280
8. Juli 10:47:42 cztest kernel: [<ffffffff81698c1c>] call_softirq+0x1c/0x30
8. Juli 10:47:42 cztest-Kernel: [<ffffffff8102d365>] do_softirq+0x65/0xa0
8. Juli 10:47:42 cztest-Kernel: [<ffffffff8108f9d5>] irq_exit+0x115/0x120
8. Juli 10:47:42 cztest-Kernel: [<ffffffff816997b8>] do_IRQ+0x58/0xf0
8. Juli 10:47:42 cztest-Kernel: [<ffffffff8168e86d>] common_interrupt+0x6d/0x6d
8. Juli 10:47:42 cztest kernel: <EOI> [<ffffffff81514a22>] ? cpuidle_enter_state+0x52/0xc0
8. Juli 10:47:42 cztest-Kernel: [<ffffffff81514b69>] cpuidle_idle_call+0xd9/0x210
8. Juli 10:47:42 cztest kernel: [<ffffffff810350ee>] arch_cpu_idle+0xe/0x30
8. Juli 10:47:42 cztest-Kernel: [<ffffffff810e82a5>] cpu_startup_entry+0x245/0x290
8. Juli 10:47:42 cztest kernel: [<ffffffff8104f07a>] start_secondary+0x1ba/0x230
8. Juli 10:47:42 cztest-Kernel: --- [Ende der Ablaufverfolgung 6bc65b0c591c1794] ---

Die Hostumgebung ist wie folgt:

System | Dell Inc.; PowerEdge R620;
Plattform | Linux
Kernel | Centos 3.10.0-514.16.1.el7.x86_64
Gesamtspeicher |

Verarbeitungshinweise

Der Stapeldruckvorgang ähnelt der Alarmverarbeitung von xfs. Der allgemeine Vorgang besteht darin, dass, nachdem der Kernel die Sack- und Fack-Funktionen aktiviert hat, die während der Netzwerkübertragung erforderlichen schnellen Neuübertragungen und selektiven Neuübertragungen von der Funktion tcp_mark_head_lost der Datei tcp_input.c verarbeitet werden. Sie markiert hauptsächlich die Anzahl der während der Übertragung verlorenen Pakete. Wie unten gezeigt, werden die vom System gemeldeten Kernel-Stapelinformationen durch den Funktionsaufruf tcp_verify_left_out in der Funktion tcp_mark_head_lost ausgelöst:

// Quelle/include/net/tcp.h 

#define tcp_verify_left_out(tp) WARN_ON(tcp_left_out(tp) > tp->Pakete_out)

statisches Inline-Int ohne Vorzeichen tcp_left_out (const struct tcp_sock *tp)
{
  gibt tp->sacked_out + tp->lost_out zurück;
}

// Quelle/include/asm-generic/bug.h 

#define __WARN() warn_slowpath_null(__FILE__, __LINE__)

#ifndef WARN_ON
#define WARN_ON(Bedingung) ({ \
    __WARN(); \
})
#endif



// Quelle/net/ipv4/tcp_input.c

/* Erkennen Sie einen Verlust im obigen Ereignis „A“, indem Sie den Anfang der Warteschlange als verloren markieren.
 * Für FACK- oder Nicht-SACK(Reno)-Sender die Anzahl der Segmente der ersten "Pakete"
 * gelten als verloren. Für RFC3517 SACK gilt ein Segment als verloren, wenn es
 * hat mindestens tp->reordering SACKed-Segmente darüber; "Pakete" bezieht sich auf
 * die maximale Anzahl an SACK-Segmenten, die passiert werden müssen, bevor dieses Limit erreicht wird.
 */
statisches void tcp_mark_head_lost(Struktur sock *sk, int Pakete, int mark_head)
{
  Struktur tcp_sock *tp = tcp_sk(sk);
  ....
  tcp_verify_left_out(tp); // Dump_Stack auslösen
}

...
statisches void tcp_update_scoreboard(Struktur sock *sk, int fast_rexmit)
{
  Struktur tcp_sock *tp = tcp_sk(sk);

  wenn (tcp_is_reno(tp)) {
    tcp_mark_head_lost(sk, 1, 1);
  } sonst wenn (tcp_ist_fack(tp)) {
    int verloren = tp->fackets_out - tp->Neuordnung;
    wenn (verloren <= 0)
      verloren = 1;
    tcp_mark_head_lost(sk, verloren, 0);
  } anders {
    int sacked_upto = tp->sacked_out - tp->Neuordnung;
    wenn (bis zu entlassen >= 0)
      tcp_mark_head_lost(sk, bis zu entlassen, 0);
    sonst wenn (fast_rexmit)
      tcp_mark_head_lost(sk, 1, 1);
  }
}

Laut der Beschreibung in redhat-536483 wird diese Fehlermeldung in der Regel durch einen TCP-Fehler verursacht, der ausgelöst werden kann, wenn der Kernel eine freigegebene TCP-Socket-Pufferliste verwendet:

Grundursache
Ein Use-After-Free-Problem im Zusammenhang mit der verknüpften Liste des TCP-Kernelsocketpuffers. Es handelt sich also um einen Fehler im TCP-Kernelcode. Obwohl der Fehler im TCP-Kernelcode liegt, kann er auf verschiedene Weise ausgelöst werden. Er kann durch NFS oder sogar durch eine Anwendung (z. B. einen Java-Prozess) ausgelöst werden.

Verarbeitung

Aktualisieren des Kernels

Wie unten gezeigt, hat Redhat möglicherweise den Use-After-Free-Bug von tcp_*-bezogenen Funktionen in Version 3.10.0-520 behoben. Sie können versuchen, ein Upgrade durchzuführen, um dieses Problem zu lösen:
Centos 7.x Änderungsprotokoll

* Do., 3. November 2016 Rafael Aquini <[email protected]> [3.10.0-520.el7]
- [net] tcp: Fehlerbehebung bei Verwendung nach Freigabe in tcp_xmit_retransmit_queue() (Mateusz Guzik) [1379531] {CVE-2016-6828}

Fack/Sack-Funktion deaktivieren

Aus der Dokumentation der Red Hat Knowledge Base geht hervor, dass die Funktion tcp_mark_head_lost hauptsächlich verwendet wird, um die Anzahl der Pakete zu markieren, die während der schnellen erneuten Übertragung und der selektiven Bestätigung verloren gegangen sind. Daher ist es möglicherweise möglich, die Fack/Sack-Parameter vorübergehend zu deaktivieren, um dieses Problem zu vermeiden:

sysctl -w net.ipv4.tcp_fack=0
sysctl -w net.ipv4.tcp_sack=0

Sie können zunächst die zweite Methode ausprobieren und, wenn das Problem weiterhin besteht, ein Upgrade der Kernelversion in Betracht ziehen.

siehe

redhat-536483

Fehler-1367091

CVE-2016-6828

Kernel-Commit

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • So gehen Sie mit dem vom Linux-System gemeldeten Warnproblem xfs_vm_releasepage um

<<:  Installations- und Konfigurationsschritte für die grüne Dekomprimierungsversion von MySQL

>>:  Besprechen Sie die Anwendung von Mixin in Vue

Artikel empfehlen

Verstehen Sie die Verwendung des All-Attributs von CSS3

1. Kompatibilität Wie unten dargestellt: Die Komp...

So kommunizieren Sie mit anderen Benutzern über die Linux-Befehlszeile

Es ist ganz einfach, Nachrichten an andere Benutz...

Zehn nützliche und einfache MySQL-Funktionen

Funktion 0. Aktuelle Uhrzeit anzeigen Befehl: sel...

Womit kann ich dich, meinen Tisch, retten (Haiyu-Blog)

Tabellen spielten einst eine sehr wichtige Rolle ...

Detaillierte Erklärung der grundlegenden Verwendung des SSH-Befehls ssh-keygen

Die SSH-Public-Key-Authentifizierung ist eine der...

Zusammenfassung einiger Gedanken zur Binlog-Optimierung in MySQL

Frage Frage 1: Wie kann der Leistungsverlust beho...

Detaillierte Erklärung der JavaScript-Array-Deduplizierung

Inhaltsverzeichnis 1. Array-Deduplizierung 2. Ded...

Der Iframe-Frame setzt den weißen Hintergrund im IE-Browser auf transparent

In letzter Zeit muss ich im Projektverlauf häufig ...

Wie man die Idee von Vue nutzt, um einen Speicher zu kapseln

Inhaltsverzeichnis Hintergrund Funktion Zweck Ide...

Beispiel für die Konfiguration der domänenübergreifenden Fehlerbehebung in nginx

Die domänenübergreifende Nginx-Konfiguration wird...

MySQL 8.0.12 – Schnellinstallations-Tutorial

Die Installation von MySQL 8.0.12 dauerte zwei Ta...