web-dev-qa-db-fra.com

La taille du tampon de tuyau est de 4k ou 64k?

J'ai lu à plusieurs endroits que la taille de la mémoire tampon par défaut pour un tuyau est de 4 Ko (par exemple, ici ), et mon ulimit -a tend à confirmer cette affirmation:

$ 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

Mais quand j'utilise un petit programme pour tester la taille du buffer (en écrivant dans le tube jusqu'à ce que les blocs write ()), je vois une limite de 64kB!

Voir ce programme:

#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;
}

Et sa sortie:

$ ./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]

Cela suggère fortement que la taille de la mémoire tampon du tuyau est en fait de 64 Ko! Que se passe-t-il ici??

47
Gui13

Les autres réponses vous indiquent que la taille du tuyau est de 64 Ko. La raison pour laquelle PIPE_BUF est 4KB est que PIPE_BUF est la plus grande taille pour laquelle les écritures sont garanties atomiques. Voir http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html

48
janneb

C'est programmable maintenant


Depuis Linux 2.6.35, vous pouvez utiliser fcntl (2) avec le F_SETPIPE_SZ opération pour définir le tampon de tuyau sur /proc/sys/fs/pipe-max-size. C'est par défaut 1 Mo; voir proc (5).

13
DigitalRoss

D'après mon expérience, le test d'écriture unique a produit une taille totale de 65536, mais quand j'ai écrit 2700 à la fois, je ne pouvais écrire que 16 fois, puis la prochaine tentative se bloque. Je suppose que l'écriture "atomique" doit se trouver dans un bloc 4K et que pour chacune de mes écritures, elle va au bloc complet suivant pour satisfaire la demande. Donc, en fait, la taille de tuyau utilisable dépend de la taille de vos écritures.

4
user1380175

Il semble que le noyau utilise jusqu'à 16 tampons, ce qui représente jusqu'à 64 Ko. Voir ceci lien pour une explication de la sortie ulimit vs la taille réelle du tampon

3
shodanex

C'est vrai. Depuis le noyau 2.6.11, la taille pipe sous Linux est de 64 Ko. Pourquoi ulimit le rapporte en 4Ko, je ne suis pas sûr, mais c'est faux.

0
nos