Erhöhen Sie die FIFO-Größenbeschränkung

7

Dank der Antworten auf meine andere Frage verstehe ich jetzt, dass FIFO unter Linux, dh /dev/xconsoleein Pufferlimit von 64 KB hat.

Wie kann ich dieses Limit auf 128 KB erhöhen?

Anscheinend muss ich meinen Kernel neu kompilieren. Das ist in Ordnung, aber wo muss ich die Größenbeschränkung in der Kernelquelle ändern?

Ist es sicher, es zu ändern, oder könnte es einige Nebenwirkungen auf andere Komponenten haben?

Ich benutze Kernel 3.18.

Martin Vegter
quelle

Antworten:

14

Seit dem Linux-Kernel 2.6.35 können Sie mit F_SETPIPE_SZfnctl () die Größe einer Pipe erhöhen. Nicht privilegierte Benutzer sind auf Werte zwischen 0 und dem aktuellen Wert von fs.pipe-max-size sysctl(standardmäßig 1 MiB) beschränkt.

Der von Ihnen verwendete Wert sollte größer als 64 KiB sein und eine Potenz von 2 haben.

So könnten Sie tun:

perl -MFcntl -e 'fcntl(STDIN, 1031, 1048576) or die $!' <> /dev/xconsole

(hier mit F_SETPIPE_SZ fest auf seinen Wert auf meinem System codiert, da das Linux-spezifische fcntl()für meine Version von nicht anderweitig verfügbar ist perl).

Beachten Sie, dass fcntl()dies /dev/xconsolenur den Pipe-Puffer betrifft , der beim /dev/xconsoleÖffnen instanziiert wurde (von syslogund unabhängig von der Anwendung, die die Nachrichten am anderen Ende liest, sodass Sie dies bei jedem Start nach dem Start von syslog tun müssen).

Nun, ob Sie das tun sollten, ist eine andere Sache. Pipes sind prozessübergreifende Kommunikationsmechanismen. Sie sollen keine Daten speichern . Für Syslog-Einträge sollten 64 KiB mehr als ausreichend sein, da sie um Größenordnungen größer sind als Ihr typischer Protokolleintrag.

In Ihrem Fall ist es wahrscheinlicher, dass Sie das Problem haben, dass das Lesen der Anwendung /dev/xconsolenicht früh genug gestartet wird oder nicht schnell genug liest.

In jedem Fall würde ich davon abraten, die globale Standardrohrgröße zu ändern.

Das würde durch Ändern geschehen:

#define PIPE_DEF_BUFFERS        16

(ausgedrückt in 4 KiB-Seiten) zu etwas anderem in include/linux/pipe_fs_i.h. Es ist nicht unmöglich, dass andere Dinge geändert werden müssen, um die Änderung widerzuspiegeln, oder dass diese Änderung andere Dinge auf unerwartete Weise beeinflusst.

Wenn Sie eine Potenz von 2 festlegen, die> = 16 ist, ist es weniger wahrscheinlich, dass Dinge kaputt gehen. Beachten Sie jedoch, dass dies die globale Systemleistung und insbesondere das Planungsverhalten erheblich beeinträchtigen kann.

Stéphane Chazelas
quelle
Gibt es eine Möglichkeit, die aktuelle Datenmenge abzurufen /dev/xconsole? Ich meine nicht die Pufferbegrenzungsgröße (dh 64 KB). Ich meine, wie viel von diesem Puffer gefüllt ist. Auf diese Weise könnte ich mich gleich zu Beginn ddleeren /dev/xconsole, um die frühen Boot-Protokolle zu entfernen, an denen ich nicht interessiert bin.
Martin Vegter
3
@MartinVegter, mit GNU ddkönnen Sie dd iflag=nonblock if=/dev/xconsole of=/dev/nulldie Pipe leeren.
Stéphane Chazelas
2
@ MartinVegter, um Ihre Frage zu beantworten, wie man die aktuelle Datenmenge erhält :perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &FIONREAD, $n) or die$!; print unpack "L", $n' <> /dev/xconsole
Stéphane Chazelas
funktioniert super ! Vielen Dank für alle Antworten auf meine Fragen
Martin Vegter
Schlechter Dateideskriptor in -e Zeile 1
Zibri