Dragos Chiriac scria la data de 23 Decembrie 2005:
> Liviu Daia wrote:
> 
> >Dragos Chiriac scria la data de 23 Decembrie 2005:
> >[...]
> >
> >>Cerere de iluminare.
> >>
> >>Ok, atunci pun si eu o intrebare. Inteleg ca faptul ca outputu se
> >>scoate in chunks de 4096 de bytes
> >
> >    Cum spuneam, 8192.
> >
> ~# tcpdump -ttttnnq -i eth0 port not 22 | tee > ./dat
> tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
> listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
> 60 packets captured
> 121 packets received by filter
> 0 packets dropped by kernel
> 
> ~# ls -la ./dat
> -rw-r--r--  1 root root 4096 Dec 23 20:55 ./dat
> 
> saraca masina are un trafic de cam 3-12 pk pe secunda (fara ssh-ul 
> meu).  sa fie de la tee ? parca totusi tineam minte ca tee scoate 
> unbuffered.

    Ok, m-ai facut curios, asa ca am cercetat putin ambele chestiuni:

(1) Output-ul lui tee este intr-adevar unbuffered, atat in specificatii
    (Single UNIX Specification v3), cat si in practica (GNU coreutils
    5.2.1 sub Linux, Base sub *BSD).

(2) Ceea ce am spus mai inainte despre buffering in stdio(3) e adevarat,
    dar comiterea datelor pe disc se face si ea buffer-at.  De acolo
    vine numarul magic 4096, vezi mai jos.

[...]
> >    La aceasta intrebare nu vei putea primi un raspuns rational decat
> >in momentul in care vei putea da un exemplu, reproductibil si pe alte
> >sisteme decat al tau, de caz in care se intampla asta.
> >
> Stiu ca calculatoarele nu sunt voodoo, de asta nu am inteles-o
> prea bine niciodata. Iata cum/de ce pana acu am avut impresia ca
> "_face rezultatul fully buffered_, apoi exec(3)" decat daca scrii
> 1>. Aproape m-ai convisns sa reinstalez janghina. poate am eu ceva
> wrong. o sa incerc si pe alte sisteme. Pacat ca restu trebii si-l face
> extraordinar.

    M-am uitat (in diagonala, dar nu cred ca mi-a scapat ceva) prin
sursele Bash 3.1.  Nu e, cum spuneam, nici o diferenta intre ">file" si
"1>file".

[...]
> folosesc tcpdump -ttttnnq de obicei. nu-mi plac porturile scrise "cu
> litere" si nici timestampuri ca sa ai la ce munci cand vrei sa vazi la
> ce ora se intampla nu stiu ce. cand dau less imi apare sacadat, cand
> dau grep curge linistit.

    La mine nu se intampla asta.  In ambele cazuri output-ul e in
chunk-uri de exact 4096 (sub Linux).

> Sa fie si asta de la less nu de la tcpdump ? ma refer aici la -n activ
> si ac trafic ca mai sus. culmea e ca de nervi am luat cu mousu din
> less dupa primu chunk. surpriza, 4096 :). Dap, m-am uitat si eu acum
> prin alea, si te cred pe cuvant cu 8k, dar de unde ma urmareste atunci
> 4096le asta, mama lui.

    Cum spuneam mai sus, asta vine de la faptul ca write(2) este de
fapt si el buffer-at (daca fisierul in care scrii nu a fost deschis cu
flag-ul O_SYNC).  Dimensiunea acestui buffer poate fi aflata din campul
st_blksize din stat:


        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <unistd.h>

        main ()
        {
          struct stat st;

          if (fstat (fileno (stdout), &st))
          {
            perror ("stat");
            exit (1);
          }
          fprintf (stderr, "%d\n", st.st_blksize);
          exit (0);
        }


    Evident, sub Linux valoarea asta este 4096.

    Interesant e ca sub Linux valoarea nu depinde de faptul ca STDOUT
este un fisier pe disc sau altceva, in timp ce sub *BSD valoarea este de
16 KB pentru fisiere pe disc (sub filesystem UFS si UFS2) si de 64 KB
pentru pipe-uri si device-uri de tip caracter (de exemplu tty-uri).

    Mai ramane totusi o problema: datele sunt comise pe disc inainte sa
se umple buffer-ul de 8 KB al lui stdio(3).  Fenomenul este specific
Linux-ului, si pare a fi un bug / o optimizare in glibc.  Optimizare,
pentru ca st_blksize este dimensiunea optima pe care o poate avea
buffer-ul stdio(3) (in cazul asta se evita efectele neplacute care apar
prin double buffering).

> offtopic - vezi ca reply-ul tau contine adresele de mail in clar :(.
> "Dragos Chiriac <dragosxxxxxsecured.ro> scria la data de 23 Decembrie
> 2005:". Pleaseee, lasa doar numele, din motive obiective. Mersic inca
> o data (mai ales pt rabdare).

    Ok, nu voi mai scrie adrese in clar pe lista.

> Sarbatori fericite,

    Multumesc, la fel tie si restului de colistasi.

    Salutari,

    Liviu Daia

-- 
Dr. Liviu Daia                                  http://www.imar.ro/~daia

_______________________________________________
RLUG mailing list
RLUG@lists.lug.ro
http://lists.lug.ro/mailman/listinfo/rlug

Raspunde prin e-mail lui