🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72603

Jak szukać problemów wydajnościowych w aplikacji wielowątkowej C/C++?

#72603
From: Radosław Korzeniewski
Date: Tue, 12 Mar 2013 12:59
25 lines
4104 bytes
Witam szanowną grupę,

Mam ciekawy problem wydajnościowy i poszukuję wskazówek co ugryźć aby dowiedzieć się o co chodzi.
W ogólności mam aplikację sieciową klient/server. Klient jednowątkowy. Serwer wielowątkowy. Klient otwiera do serwera dwa połączenia: połączenie kontrolne i połączenie danych. Klient głównie wysyła dane do serwera, czasami coś odczytuje. Klient czyta dane z dysku. Serwer otrzymane dane zazwyczaj zapisuje na dysk. Po stronie serwera mam dwa wątki. Jak do tej pory maksymalną przepustowość jaką osiągnąłem to 1,5MB/s-2MB/s na sieci Gbit/s. Dotychczasowe śledztwo wykazało, że spowolnienie w transmisji spowodowane jest opóźnieniem w przesłaniu ACK z serwera do klienta na przesłane dane ale tylko co kilkadziesiąt pakietów. Zazwyczaj RTT dla ACK wynosi poniżej 1mS lecz co jakiś czas skacze do 20mS-40mS. Z powstałego opóźnienia wynika ograniczenie przepustowości. Dla mnie ewidentnie problem po stronie odbiorcy danych. Serwer jednak nie wykazuje żadnych oznak problemu. Procesor obciążony w 1%, dysk zapisuje te 1,5-2MB/s. Sprawdzam więc interakcję aplikacji serwera z systemem operacyjnym i znalazłem zagwozdkę. Jedno z przełączeń kontekstu trwało mniej więcej tyle co opóźnienie w ACK, w przykładzie poniżej: przełączenie z pid:4689 na pid:7931 trwa ok. 30mS. Takie opóźnienie powtarza się dla każdej kolejnej iteracji praktycznie w tym samym miejscu.

W tym momencie nie bardzo wiem jak to dalej drążyć. Może ktoś ma jakiś pomysł?

7931  11:27:41.364036 read(1819, "G\f.\266\30\231\252]F\270\226\205\236\324\4\v8j\340\334\20e\217\16o\200\322AV\221\341K"..., 380) = 380 <0.000022>
----8<-------
7931  11:27:41.364152 pwrite64(156, "DS1\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"..., 512, 373568000 <unfinished ...>
4689  11:27:41.364268 <... read resumed> "\0\0\0004", 4) = 4 <0.057966>
----8<-------
4689  11:27:41.364312 read(1818, "\0\0\0\1\0\1\0\0\0\1\0\0\0\0\0\0\1\314\0\0\353\251\313o\273z8\230G\20\307c"..., 52) = 52 <0.000013>
4689  11:27:41.364400 write(10, "dsevol0283\0", 11) = 11 <0.000019>
4689  11:27:41.364469 write(10, "\0\0\1\0", 4) = 4 <0.000012>
4689  11:27:41.364530 write(10, "\353\251\313o\273z8\230G\20\307c6IA\307&\226wY\333\207\365\207\236\r\205\261\366\0\"\322", 32) = 32 <0.000013>
----8<------- from
4689  11:27:41.364608 read(1818,  <unfinished ...>
7931  11:27:41.394933 <... pwrite64 resumed> ) = 512 <0.030725>
----8<------- to
7931  11:27:41.394969 pwrite64(156, "o\340EP\364r;5\270\350\r\211\262o\327)\350p3\247\372\22/R\0109z\207\3~ \370"..., 65536, 373568512) = 65536 <0.000288>

pozdrawiam
-- 
Radosław Korzeniewski
Technical Details
Message-ID: <2cfcd79b-1d0b-4a5a-8f9d-13080d46ebb8@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!cyclone01.ams2.highwinds-media.com!voer-me.highwinds-media.com!npeer01.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!dd2no1842196qab.0!news-out.google.com!o5ni743qas.0!nntp.google.com!dd2no1842173qab.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail

Show Full Headers
Complete Article Headers
X-Received: by 10.224.72.199 with SMTP id n7mr11148785qaj.5.1363093153270;        Tue, 12 Mar 2013 05:59:13 -0700 (PDT)
X-Received: by 10.49.85.35 with SMTP id e3mr1123857qez.7.1363093153228; Tue, 12 Mar 2013 05:59:13 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!cyclone01.ams2.highwinds-media.com!voer-me.highwinds-media.com!npeer01.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!dd2no1842196qab.0!news-out.google.com!o5ni743qas.0!nntp.google.com!dd2no1842173qab.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.os.linux.programowanie
Date: Tue, 12 Mar 2013 05:59:13 -0700 (PDT)
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=109.233.91.168; posting-account=XENjyAkAAACMiwFCilkQ6IR7gD6eX5mJ
NNTP-Posting-Host: 109.233.91.168
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <2cfcd79b-1d0b-4a5a-8f9d-13080d46ebb8@googlegroups.com>
Subject: Jak szukać problemów wydajnościowych w
 aplikacji wielowątkowej C/C++?
From: Radosław Korzeniewski <radoslaw@korzeniewski.net>
Injection-Date: Tue, 12 Mar 2013 12:59:13 +0000
X-Received-Bytes: 4135
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit