Salut.

M-am apucat sa studiez problema si asta e ce am gasit:

(gdb) disassemble epoll_wait
Dump of assembler code for function epoll_wait:
    0x00007ffff78ff160 <+0>:    cmpl   $0x0,0x2bc659(%rip)        # 
0x7ffff7bbb7c0 <__libc_multiple_threads>
    0x00007ffff78ff167 <+7>:    jne    0x7ffff78ff17c <epoll_wait+28>
    0x00007ffff78ff169 <+0>:    mov    %rcx,%r10
    0x00007ffff78ff16c <+3>:    mov    $0xe8,%eax
    0x00007ffff78ff171 <+8>:    syscall
    0x00007ffff78ff173 <+10>:   cmp    $0xfffffffffffff001,%rax
    0x00007ffff78ff179 <+16>:   jae    0x7ffff78ff1af <epoll_wait+79>
    0x00007ffff78ff17b <+18>:   retq
    0x00007ffff78ff17c <+28>:   sub    $0x8,%rsp
    0x00007ffff78ff180 <+32>:   callq  0x7ffff790c630 
<__libc_enable_asynccancel>
    0x00007ffff78ff185 <+37>:   mov    %rax,(%rsp)
    0x00007ffff78ff189 <+41>:   mov    %rcx,%r10
    0x00007ffff78ff18c <+44>:   mov    $0xe8,%eax
    0x00007ffff78ff191 <+49>:   syscall
Aici e epoll_wait
    0x00007ffff78ff193 <+51>:   mov    (%rsp),%rdi
    0x00007ffff78ff197 <+55>:   mov    %rax,%rdx
    0x00007ffff78ff19a <+58>:   callq  0x7ffff790c690 
<__libc_disable_asynccancel>
    0x00007ffff78ff19f <+63>:   mov    %rdx,%rax
    0x00007ffff78ff1a2 <+66>:   add    $0x8,%rsp
    0x00007ffff78ff1a6 <+70>:   cmp    $0xfffffffffffff001,%rax
    0x00007ffff78ff1ac <+76>:   jae    0x7ffff78ff1af <epoll_wait+79>


Dupa cum se observa, epoll_wait este inconjurat de un *_asynccancel.
Care sint implementate cu futex-i. Care sint 'light', dar, mult mai scumpi 
decit 'nimic'. Si asta se vede in profiling perfect:

--------------------------------------------------------------------------------
      Ir  I1mr ILmr      Dr D1mr DLmr      Dw D1mw DLmw      Bc   Bcm 
Bi    Bim  file:function
--------------------------------------------------------------------------------
958,390 1,147  138 273,249   60    1 196,462  979  914 113,819 3,104 57,236 
19,158  ???:???
501,410     7    7 160,414    0    0 160,404   58    0  60,165    73      0     
 0  ???:Log
107,328     1    1  26,832    3    0       0    0    0  26,832     0      0     
 0  ???:__libc_disable_asynccancel
  98,417     2    2  26,841    2    0       0    0    0  26,841     0      0    
  0  ???:__libc_enable_asynccancel
  86,000     5    5  30,000    0    0  16,000    2    1   6,000     4      0    
  0  ???:Conn_enqueue_wait
  76,000     7    7  14,000    2    1  18,000    9    6  12,000     3      0    
  0  ???:Conn_printf

(Scuze pentru liniile lungi.)

Deci, in thread-uri, daca ai multe syscall-uri, vei plati acest cost.
Pe cind la procese obisnuite nu.

Daca faci doar calcule matematice (putine syscall-uri), acest cost chiar 
nu conteaza.

Am ajuns la concluzia ca pentru un webserver performant, thread-urile nu 
ajuta, dimpotriva.

Cind o sa am timp sa reiau lucrul la web server, o sa compar performantele 
si o sa le postez aici, daca o sa-mi mai aduc aminte... ;)

On Thu, 3 Sep 2015, tiberiu socaciu wrote:

> acum ce spun e poveste, din cele traite de mine: threaduri 1/core --
> corect!, incearca sa nu faci nimic pompos in thread-uri (IO sau comun icare
> sau etc). eu am folosit 2 threaduri la implementarea unui ADI pentru un PDE
> cu 2 dimensiuni spatiale, la care am reusit sa rup operatorul ecuatiei in
> doua. cu un doctorand de la ubb (cu care colaborez de aproape un an si pe
> care il "co-indrum") incerc sa rupem operatorul n+1 dimensional (spatial)
> si sa vedem daca putem pune de o ADI. altfel, cu procese era putintel
> (parca) mai incetut (asta fuse acum 1000 de ani cand mai scriam cod; acum
> numai latru si urmaresc minciunele).
>
> t.
>
> 2015-09-03 7:46 GMT+03:00 Catalin(ux) M. BOIE <[email protected]>:
>
>> Salut.
>>
>> On Wed, 2 Sep 2015, tiberiu socaciu wrote:
>>
>>> cate thread-uri? ia incearca cu 2 thread-uri pe un procesor cu minim 2
>>> core-uri.
>>
>> 1 thread per core.
>>
>> Dar nu vad ce ar schimba asta. Problema este ca apare overhead de la
>> inserarea, inainte si dupa anumite zone de cod, a codului de setare a
>> cancel-abilitatii thread-ului. Folosind thread-uri nu vad cum pot sa scap
>> de acel overhead. Si apar foarte sus in profiling.
>>
>> Ai idee cum pot sa scap de overhead?
>> Evident, la procese nu apare.
>>
>>> t.
>>>
>>> 2015-09-02 6:47 GMT+03:00 Catalin(ux) M. BOIE <[email protected]>:
>>>
>>>> Salut.
>>>>
>>>> Lucrind la un web server folosind libraria Conn (LGPL, la mine pe site)
>>>> am trecut de la procese la thread-uri. Si am avut o surpriza mare.
>>>> La profiling imi aparea o functie foarte des:
>> __libc_disable_asynccancel,
>>>> __libc_enable_asynccancel, __pthread_disable_asynccancel,
>>>> __pthread_enable_asynccancel. Toate 4 in primele 15 intrari, ordonate
>> dupa
>>>> cit timp dureaza. Cea ce doare.
>>>> Asa ca am cautat ce fac aceste functii. Se pare ca au treaba cu functia
>>>> pthread_cancel; pare ca o tona de locuri din cod sint invelite in
>>>> disable/enable cancel. Si asta costa. Cel putin se observa in valgrind,
>>>> dar daca imi aduc aminte, am observat si la timpul de executie.
>>>>
>>>> Deci, daca poti sa mergi cu procese, uita de thread-uri.
>>>> Si procesele le poti mapa pe CPU-uri diferite cu
>>>> pthread_attr_setaffinity_np.
>>>> La thread-uri, poti partaza usor datele, dar trebuie sa ai grija cum.
>>>> Foarte probabil o sa ai nevoie de functiile specifice de locking alre
>>>> pthread sau de RCU (userspace-rcu, recomandat).
>>>>
>>>> --
>>>> Catalin(ux) M. BOIE
>>>> http://kernel.embedromix.ro/
>>>>
>>>> On Tue, 1 Sep 2015, Alex 'CAVE' Cernat wrote:
>>>>
>>>>> Salut
>>>>>
>>>>> Am mai lucrat cu multiprocess prin facultate, si de atunci pe ici pe
>>>>> colo, treaba e simpla: fork() * n, n copii ale datelor, wait() &
>>>>> friends, toata lumea fericita.
>>>>>
>>>>> Insa (mai nou ... sau mai vechi, ca e de multi ani), thread-urile au un
>>>>> overhead mult mai mic decat procesele, dar din cate am inteles lucreaza
>>>>> cu acelasi set de date, ceea ce nu e bine, pentru ca pe mine ma
>>>>> intereseaza sa execut in paralel aceeasi bucata de cod dar pentru mai
>>>>> multe seturi de date.
>>>>>
>>>>> Practic ma intereseaza sa paralelizez ceva de genul:
>>>>>
>>>>> operatii_de_inceput();
>>>>> for(i = 0; i <= N;  i++)
>>>>>     operatii_in_paralel(i);     <<<< paralelizare
>>>>> operatii_de_final();
>>>>>
>>>>> in cazul meu operatiile de final (daca exista)  nu se bazeaza pe cele
>> in
>>>>> paralel (decat cel mult niste coduri de ok / eroare), astfel incat cu
>>>>> procese le-as putea scoate usor, dar daca se poate cu thread-uri si e
>>>>> mai performant ... de ce nu ?
>>>>>
>>>>> problema la care nu-i dau de cap (cel mai probabil pentru ca nu am
>>>>> inteles inca prea bine cum functioneaza threadurile) este cum fac o
>>>>> copie locala a unei variabile, astfel incat variabila respectiva sa
>> aiba
>>>>> valorea doar pentru threadul respectiv, in alt thread putand avea o
>> alta
>>>>> valoare, iar o asignare a acelei variabile intr-un thread sa nu
>>>>> influenteze valoarea aceleiasi variabile dintr-un altul
>>>>>
>>>>> rezumand, in principiu ma intereseaza daca se poate face exact acelasi
>>>>> lucru ce as putea sa fac cu multiproces ('copie' a datelor), dar
>>>>> folosind threaduri (cel putin unele variabile sa fie 'locale'
>> threadului)
>>>>>
>>>>> Mersi
>>>>> Alex
>>>>> _______________________________________________
>>>>> RLUG mailing list
>>>>> [email protected]
>>>>> http://lists.lug.ro/mailman/listinfo/rlug
>>>>>
>>>> _______________________________________________
>>>> RLUG mailing list
>>>> [email protected]
>>>> http://lists.lug.ro/mailman/listinfo/rlug
>>>>
>>> _______________________________________________
>>> RLUG mailing list
>>> [email protected]
>>> http://lists.lug.ro/mailman/listinfo/rlug
>>>
>> _______________________________________________
>> RLUG mailing list
>> [email protected]
>> http://lists.lug.ro/mailman/listinfo/rlug
>>
> _______________________________________________
> RLUG mailing list
> [email protected]
> http://lists.lug.ro/mailman/listinfo/rlug
>

--
Catalin(ux) M. BOIE
http://kernel.embedromix.ro/
_______________________________________________
RLUG mailing list
[email protected]
http://lists.lug.ro/mailman/listinfo/rlug

Raspunde prin e-mail lui