48 votes

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

J'ai lu à plusieurs endroits que la taille du tampon par défaut pour un tube est de 4ko (par exemple, ici), et ma 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 lorsque j'utilise un petit programme pour tester la taille du tampon (en écrivant dans le tube jusqu'à ce que le write() bloque), je constate une limite de 64ko !

Voici ce programme :

#include 
#include 
#include 

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

    fprintf(stdout, "Création du tube\n");
    fprintf(stdout, "Taille max théorique : %d\n", PIPE_BUF);
    if( pipe(tube) != 0)
    {
        perror("pipe");
        _exit(1);
    }
    fprintf(stdout, "Ecriture dans le tube\n");
    for(i=0;; i++)
    {
        fprintf(stdout, "%d octets écrits\n", i+1);
        if( write(tube[1], &c, 1) != 1)
        {
            perror("Write");
            _exit(1);
        }
    }
    return 0;
}

Et sa sortie :

$ ./test_buf_pipe 
Création du tube
Taille max théorique : 4096
Ecriture dans le tube
1 octets écrits
2 octets écrits
3 octets écrits
4 octets écrits
[...]
65535 octets écrits
[bloque ici]

Cela suggère fortement que la taille du tampon de tube est en fait de 64k ! Que se passe-t-il ici ??

48voto

janneb Points 17303

Les autres réponses vous disent que la taille du tuyau est de 64 Ko. La raison pour laquelle PIPE_BUF est de 4 Ko est que PIPE_BUF est la taille maximale pour laquelle les écritures sont garanties d'être atomiques. Voir http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html

14voto

DigitalRoss Points 80400

C'est programmable maintenant


À partir de Linux 2.6.35, vous pouvez utiliser fcntl(2) avec l'opération F_SETPIPE_SZ pour définir la taille du tampon de pipe jusqu'à /proc/sys/fs/pipe-max-size. Par défaut, il s'agit de 1 Mo; voir proc(5).

4voto

user1380175 Points 21

Dans mon expérience, le test d'écriture unique a produit une taille totale de 65536, mais lorsque j'ai écrit 2700 à la fois, je n'ai pu écrire que 16 fois, et ensuite la tentative suivante a échoué. Je suppose que l'écriture "atomique" doit être dans un bloc de 4K, et que pour chacune de mes écritures, elle va au bloc plein suivant pour satisfaire la demande. Ainsi, en réalité, la taille du tuyau utilisable dépend de la taille de vos écritures.

3voto

shodanex Points 7318

Il semble que le noyau utilise jusqu'à 16 tampons, ce qui équivaut à 64 ko. Consultez ce lien pour une explication de la sortie de ulimit par rapport à la taille effective du tampon

0voto

nos Points 102226

C'est exact. Depuis le noyau 2.6.11, la taille du pipe dans Linux est de 64 Ko. Pourquoi ulimit le rapporte comme 4 Ko, je ne suis pas sûr, mais c'est incorrect.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X