Pipe-Puffergröße ist 4k oder 64k?

Lesezeit: 4 Minuten

Benutzeravatar von Gui13
Gui13

Ich habe an mehreren Stellen gelesen, dass die Standardpuffergröße für eine Pipe 4 KB beträgt (z. hier), und meine ulimit -a neigt dazu, diese Aussage zu bestätigen:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 15923
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8 // 8 * 512B = 4kB
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Aber wenn ich ein kleines Programm verwende, um die Puffergröße zu testen (indem ich in die Pipe schreibe, bis das write() blockiert), sehe ich eine Grenze von 64 kB!

Siehe dieses Programm:

#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main(void)
{
    int tube[2];
    char c="c";
    int i;

    fprintf(stdout, "Tube Creation\n");
    fprintf(stdout, "Theoretical max size: %d\n", PIPE_BUF);
    if( pipe(tube) != 0)
    {
        perror("pipe");
        _exit(1);
    }
    fprintf(stdout, "Writing in pipe\n");
    for(i=0;; i++)
    {
        fprintf(stdout, "%d bytes written\n", i+1);
        if( write(tube[1], &c, 1) != 1)
        {
            perror("Write");
            _exit(1);
        }
    }
    return 0;
}

Und seine Ausgabe:

$ ./test_buf_pipe 
Tube Creation
Theoretical max size: 4096
Writing in pipe
1 bytes written
2 bytes written
3 bytes written
4 bytes written
[...]
65535 bytes written
[blocks here]

Es deutet stark darauf hin, dass die Pipe-Puffergröße tatsächlich 64 KB beträgt! Was passiert hier??

  • Diese Frage ist jetzt zwei Jahre alt und die betreffende Größe ist jetzt programmierbar: stackoverflow.com/a/13906354/140740

    – DigitalRoss

    16. Dezember 2012 um 23:17 Uhr

Die anderen Antworten sagen Ihnen, dass die Pipe-Größe 64 KB beträgt. Der Grund, warum PIPE_BUF 4 KB groß ist, liegt darin, dass PIPE_BUF die größte Größe ist, für die Schreibvorgänge garantiert atomar sind. Sehen http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html

  • Bedeutet dies, dass die Puffer beliebig hoch werden können? Aber das garantierte atomare Schreiben ist auf 4K begrenzt?

    – Subomi

    20. Juli 2018 um 6:33 Uhr

Benutzeravatar von DigitalRoss
DigitalRoss

Es ist jetzt programmierbar


Ab Linux 2.6.35 können Sie verwenden fcntl(2) mit dem F_SETPIPE_SZ Vorgang zum Einstellen des Pipe-Puffers /proc/sys/fs/pipe-max-size. Dies ist standardmäßig 1 MB; sehen proc(5).

  • Ja aber nein. Die Rohrgröße wird beworben von ulimit ist immer noch 4kB auf Kernel 3.2 (den ich hier habe). Meine Frage bezog sich auf PIPE_BUF, was Janneb beantwortete: PIPE_BUF ist eine Konstante und ist die maximale Größe eines Schreibvorgangs, der bei der Ausführung atomar ist (dh Thread-sicher ;)).

    – GUI13

    17. Dezember 2012 um 12:55 Uhr

  • Bedeutet dies, dass Sie durch das Festlegen von mehr als 4 KB immer noch garantieren können, dass der Schreibvorgang atomar ist?

    – Benutzer1767754

    9. November 2017 um 23:06 Uhr

Meiner Erfahrung nach ergab der Einzelschreibtest eine Gesamtgröße von 65536, aber als ich 2700 auf einmal schrieb, konnte ich nur 16 Mal schreiben, und dann stockte der nächste Versuch. Ich denke, dass der „atomare“ Schreibvorgang innerhalb eines 4K-Blocks liegen muss und dass er für jeden meiner Schreibvorgänge zum nächsten vollständigen Block geht, um die Anforderung zu erfüllen. Die nutzbare Pipe-Größe hängt also von der Größe Ihrer Schreibvorgänge ab.

Sieht so aus, als ob der Kernel bis zu 16 Puffer verwendet, was 64 KB ergibt. Sieh dir das an Verknüpfung für eine Erläuterung der ulimit-Ausgabe im Vergleich zur tatsächlichen Puffergröße

Benutzeravatar von nos
Nr

Das stimmt. Seit dem 2.6.11-Kernel ist die Rohr Größe unter Linux ist 64kB. Warum ulimit es als 4Kb meldet, bin ich mir nicht sicher, aber das ist falsch.

  • Rah, derselbe Link wie der, auf den ich in meiner Frage hingewiesen habe. Ich habe die Zeile mit der Angabe 64k nicht gesehen … Wie auch immer, warum ulimit 4K angibt, ist mir ein Rätsel …

    – GUI13

    7. Januar 2011 um 10:05 Uhr


  • Nur ksh und bash ulimit builtin melden das Rohrgrößeaber es ist kein Limit, wie es von setrlimit festgelegt wurde, und es ist nicht die Größe der Pipe-Puffer, sondern nur PIPE_BUF, die maximale Größe, für die ein Write() in eine Pipe garantiert atomar ist.

    – Stéphane Chazelas

    14. September 2015 um 11:25 Uhr

  • Rah, derselbe Link wie der, auf den ich in meiner Frage hingewiesen habe. Ich habe die Zeile mit der Angabe 64k nicht gesehen … Wie auch immer, warum ulimit 4K angibt, ist mir ein Rätsel …

    – GUI13

    7. Januar 2011 um 10:05 Uhr


  • Nur ksh und bash ulimit builtin melden das Rohrgrößeaber es ist kein Limit, wie es von setrlimit festgelegt wurde, und es ist nicht die Größe der Pipe-Puffer, sondern nur PIPE_BUF, die maximale Größe, für die ein Write() in eine Pipe garantiert atomar ist.

    – Stéphane Chazelas

    14. September 2015 um 11:25 Uhr

1411450cookie-checkPipe-Puffergröße ist 4k oder 64k?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy