Archive for February, 2013

2013-02-28 колко трафик прави един tcp connection?

Thursday, February 28th, 2013

И още един интересен работен проблем.

Имаме следната стандартна задача – да log-нем колко трафик е направил даден HTTP request. Тривиалният начин:

while ( (len=write(...))>0  ) total+=len;

т.е. колкото сме подали на kernel-а, толкова.

Това води до проблем, когато срещу нас стои някой от т.нар. download manager-и. Те дават възможност даден файл да бъде точен с няколко паралелни връзки. Това се реализира с Range header-а в HTTP, и ако например искаме да свалим даден файл от 1MB с две паралелни връзки, едната трябва да подаде range от 0 до 524287, втората – от 524288 до 1048576.
Разбира се, авторите на тоя тип софтуер са идиоти, и вместо това подават request-и от 0 до края и от 524288 до края на файла, като просто прекъсват първата връзка, след като са получили каквото им трябва. Това обаче остава връзката с пълен буфер от данни (в ядрото), който в моя случай се мотае м/у 1MB и 2MB, което от своя страна в повечето случаи брои по 2MB отгоре на всеки такъв request.

Решението на този проблем е едно ioctl:

while ( (len=write(fd, ...))>0  ) total+=len;
ioctl(fd, SIOCOUTQ, &bytesunsent);
total-=bytesunsent;

… което е прекрасно, докато човек не тества с нормална връзка при по-голяма латентност и не открие, че в разни web сървъри всъщност като напишете последните данни и стигнете до логването (т.е. викнете ioctl()-то), буферът е все още пълен и ще log-нете по-малко трафик, отколкото е направен.
На теория можем да хванем момента, в който буферът е празен със SO_LINGER опцията – тогава close() ще block-не, но това не ни решава проблема, понеже пък след това file descriptor-а няма да го има. Има друго решение – с shutdown(), read докато получим 0, и тогава да видим тия данни, което обаче е криво за писане и вероятно има някакъв проблем.
В крайна сметка моето решение е “проверявай буфера само на връзки, които не са завършили нормално”, и това дава горе-долу верни стойности. Някой да му идва по-добра идея?

2013-02-27 inet_ntop

Wednesday, February 27th, 2013

Пишех малко код (опасна работа), съответно стигнах до момента, в който трябваше да изкарам някакъв адрес (ipv4 или ipv6) в четим вид. Тръгнах да ровя и открих, че има inet_ntop(), което поддържа и двете. Без да чета внимателно, написах следното:

struct sockaddr *saddr;

inet_ntop(saddr->sa_family, saddr, msg.ip, 255);

Това за всеки, който е погледнал по-внимателно man-а е ясно, че не работи – трябва да подам не sockaddr, а структурата вътре, я in_addr, я in6_addr – което е криво, понеже трябва да напиша няколко if-а и т.н.. Питах google, не намерих нищо особено полезно, след което отворих Unix Network Programming на Stevens около тая функция и какво открих – човекът е описал тоя проблем, и даже е написал sock_ntop(), който работи директно със sockaddr структурата (и реализира ония няколко if-а).
Ето примерен код как се реализира.

Въпросът е, защо в libc я няма тая функция? Мрън, книгата е вече на 16 години, все някой можеше да се сети и да вкара нещо такова.
(ако някой все пак се сеща за нещо такова в libc, да каже)

2013-02-24 крокодиловден

Sunday, February 24th, 2013

Отпразнува се крокодиловден. Вероятно някъде има снимки. Аз пих до 3 и оставих още някакви хора да си допиват. Събрахме се … вероятно около 50-60 човека. Трябва да погледна колко сме изпили, но май не беше нещо особено (само няколко пъти ми свърши бутилката вино, съвсем неясно защо). Някакви хора се оплакват, че не са спали и ги боли главата, срамна работа :)

Учудващо, нямаше сериозни простотии. Имаше огромно количество разговори по разни теми м/у всякакви хора, което е едно от най-интересните неща по такива събития. Опитвам се да си спомня всичките и дали имам да свърша нещо по тях (вече пратих една книга), така че пишете, ако забравям нещо.

Станах на 0x20.

Ето стандартния списък с подаръци, in no particular order:

Бутилка Laphroaig, от Недко и Надя;
Бутилка Lagavulin, от Пейо;
Бутилка вино Мавруд Асеновград резерва, от Весо, препратено през Владо (и целувка, дето той ми предаде и ходих да се мия);
Бутилка вино Domaine Peshtera с чаша;
Странна китайска пенис помпа, от Каравелов (цялата е в надписи на китайски и няма документация), и някакво порно на видео касета;
Mojo zero gravity пенис помпа, тая от Данчо и Туньо;
Малка манерка за уиски, от Анатолий;
Билет за “The wall” на Roger Waters от банда лоши хора (Велин, Боян, Пенчев, Морви, и май още някой). Ще го подаря на майка ми…
3com (USrobotics) courier модем, от червото. Половината вечер се чудихме дали не можем да му намерим приложение :) ;
“Граматика на българския език”, от 1938ма (преиздадена наскоро) от Бобсън, да свикна с идеята за ‘ь’ накрая на думите;
“Кулинарна енциклопедия” и една дъска/поставка за четене (не помня от кого);
Едно slinky от Христо;
Един пъзел и “Детска енциклопедия на влечугите” от Ици;
Една бутилка Johnnie Walker Red Label, от Гунински;
Две бутилки домашно вино от Яна и Стефан (първа от три части на подаръка), да се ползват да убеждавам девойки с тях;
Комбиниран подарък – шнорхел (да мога да се справям по-лесно в блатото, докато търся крокодилки), прашки с измервателна част за определени части на тялото (“да меря колко е дълбоко”), енциклопедия за животни (с пълно описание на сексуалния им живот и т.н., ако реша да мина на други животни) и черни презервативи (ако намеря нещо). Цялото това от Явор, Таня, Iffi, Калоян и вероятно още някой;
Един rice cooker и 4 кг ориз от Мариела (май има шанс да направим все пак sushi workshop-а в лаба);
Snug Rug (одеяло с ръкави, да си работя на топло) от Мариян;
Една тениска “Be nice to fat people, one day they might save your life” от Леков и Ирина, може да потърсите в google как изглежда;
Тениска от C++ конференция от Наков, да взема да го науча тоя език;
Набор български подправки от Радо;
Буркан Nutella и една сметана, за ползване в леглото (пак от Владо);
Голям брой черни ластички, от Моника.

Вероятно пропускам нещо, ще update-на после. Ако съм объркал нещо, казвайте.

2013-02-11 Книги за раздаване

Monday, February 11th, 2013

Това е списък с книги, които съм оставил в initLab за раздаване (натрупани са в голямата стая по дивана и т.н.), някои вече са взети. Който иска, да идва и да взима, книгите се раздават съвсем безвъзмездно :)

2013-02-07 crash в intel-ски мрежови карти

Thursday, February 7th, 2013

Тоя проблем бие по малоумност голяма част от нещата, които съм виждал в последната година.

Kristofer Kielhofner е намерил гаден проблем в Intel 82574L мрежовите карти, който с пакет, в който на специфична позиция пише 0x32 просто crash-ва картата (бъгове в power management-а вероятно), в internet storm center-а има по-съкратена информация.

(това е мрежовата карта по доста от сървърните дъна от последните години)

Решението, което аз виждам (и което вече пуснах) изглежда така:

for i in `cat list-of-ips`; do  do ping -i .001 -c 128 -p 34 -s 1110  $i ; done

(броя пакети съм си го харесал да е толкова, може и да няма нужда от толкова много)
(съответно, смяната на 34 с 32 го прави tool за трепане на машини)

Проблемът не се задейства винаги, вероятно има и разлики при различни firmware-и на разните мрежови карти (ще ми е интересно някой дали е успял да го reproduce-не и в какви условия), но вероятно е добра идея човек да е подготвен.

Update: до тук аз поне не съм успял да го reproduce-на (както и при някои други хора), та може да е сравнително изолиран проблем.
Update 2: Press release от intel по въпроса.

2013-02-03 къневден

Sunday, February 3rd, 2013

Update: Пращайте снимки.

Стефан го мързи да блогне, за това го отбелязвам аз – отпразнувахме вчера 27мия му рожден ден (на стандартното място, мазето на Кривото). Празнуваше се двоен празник…
(малко ще е от моя гледна точка, по очевидни причини)

Изпихме … прилично количество спирт. Ето разни неща, които се сещам:

Кънев закъсня, преди да се появи вече бяха дошли 10-15 човека;
Мястото се напълни съвсем до дупка;
Най-пияният беше (as usual) Наков, който двама човека после носиха на конче на раменете си – Бацов и май и Пешев;
Обсъдихме с Митьо една много интересна идея, дето трябва да я продължим;
Стефан беше за кратко синеок;
Успяха да се проведат много и интересни разговори, от които поне някаква част ми се губят;
За малко да има един бой, ама после хората се разбраха;
Бях DJ и Стефан даже се чудеше дали му се намират 2-3 стотинки да ми даде за работата;
(ако някой се интересува, слушахме Rodrigo y Gabriela, Gotan Project, The Future Sound of London (“A monstrous psychedelic bubble 1), My Sleeping Karma, Tuber, deathmole, Tool).
Учудващо, не успяхме съвсем да изплашим на Кънев студентите;
Преименувахме Кънев на Петров;

Прибрах се в 4.

Някакъв списък подаръци:
Аз му подарих The Dead Zone на Кинг (като една хубава книга), “Плетене for dummies” (с посвещение “Най-големият враг на човека-паяк е жената-чехъл”), един лигавник (който много добре му стои, беше подарен, щото студентите му бяха казали, че се държи детски), една книга “Всичко за вашето бебе” в комплект с едни сини лещи за очи (които половин час се опитва да сложи и най-накрая iffi успя да му ги постави. изглеждаше интересно.). Специално трябва да се отбележи героизма му, че издържа да му бъркат в очите да слагат и после да вадят лещите;
Моника му подари мъфини с формата на женски полови органи (има фотосесия как Кънев яде един от тях, а Яна му го подава…);
Whirlwind на Клавел;
Grammar Rules;
Ender’s game;
странни полихедронни зарчета;
clapperboard;
билети за Depeche Mode;
билети за театър (не помня кой);
ваучъри за бънджи;
Code Grower тениска, C# книгата (двете от Наков);
един тон алкохол;
една торба със зарзават.