wake-up-neo.com

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

Ich habe an mehreren Stellen gelesen, dass die Standardpuffergröße für eine Pipe 4 KB beträgt (zum Beispiel hier ) und mein 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 ein Limit von 64kB!

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 wird dringend empfohlen, dass die Pipe-Puffergröße tatsächlich 64 KB beträgt! Was passiert hier??

47
Gui13

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

48
janneb

Es ist jetzt programmierbar


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

13
DigitalRoss

Meiner Erfahrung nach ergab der Einzelschreibtest eine Gesamtgröße von 65536, aber wenn ich 2700 auf einmal schrieb, konnte ich nur 16 Mal schreiben, und der nächste Versuch wird abgebrochen. Ich gehe davon aus, dass das 'atomare' Schreiben innerhalb eines 4K-Blocks erfolgen muss und dass es für jeden meiner Schreibvorgänge zum nächsten vollständigen Block geht, um die Anforderung zu erfüllen. Tatsächlich hängt die verwendbare Pipe-Größe also von der Größe Ihrer Schreibvorgänge ab.

4
user1380175

Der Kernel verwendet anscheinend bis zu 16 Puffer, was 64 KB entspricht. Siehe this link für eine Erklärung der Ausgabe von ulimit im Verhältnis zur tatsächlichen Puffergröße

3
shodanex

Das ist richtig. Seit dem 2.6.11-Kernel beträgt die Größe von pipe unter Linux 64kB. Warum ulimit es als 4 KB meldet, weiß ich nicht genau, aber das ist falsch.

0
nos