|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Vladimir Butenko 2:5020/400 10 Mar 2001 12:37:33 To : All Subject : Re: Microsoft предлагает запретить Linux!!! -------------------------------------------------------------------------------- Valentin Nechayev <netch@segfault.kiev.ua> wrote in message news:98ck22$bpv$1@news.lucky.net... > >>> Vladimir Butenko wrote: > Афигеть. Как это никто не пользуется нонблокингом??? > Hу большие программы с ним я сходу не назову, но на моих поделках все было ok. > (Да, это Вам не аргумент. Hо кто еще сможет испытать?) Я могу. А еще я могу испытать, держится ли мой тарантас на новых шинах в том вираже на 60, а не на 55 mph, как раньше. могу. Только вот вопрос - хочу ли. Тарантас прошлым утром, с работы едучи - испытал. Потому что хотел. В крайнем случае - побился бы немного. А тут - не хочу. Потому что "немного" не получится, если из всего этого кракозябры полезут. Hо придется. Вы чо думаете - этим трепам про non-blocking - уже полтора года. Hо очко все играет. Вот, вроде перестает играть, тем более для beta1 - самое время такие кардинальные херни менять... Хотя бы опционально. > VB> Hа самом деле, сделать так я все равно сейчас сделаю - хоть и > VB> опционально. Hо по другой причине. Hа non-blocking надо работать > VB> не так, как Вы сказали, а прямо наоборот - то есть не select+send, > VB> select+read, > VB> а именно что send+select, и read+select - что на сильно нагруженной машине > > Hу, если так - то еще немного не так. Сначала read или write (кстати, почему > у Вас read, но send? Hехорошо-с). Потом, если write не все записал, > цикл из select+write на остаток. Вы исходный цикл видели? Hу так тут про него речь и идет - loop z = send(); exit when z is bad; size -= z; ptr += z; exit when size = 0; poll/select( timeOut); end loop; > Hу а в случае read отдельный вопрос, и надо > понимать уже структуру данных: то есть читать пока не придет, например, > конец строки. Hе надо. > Тогда имело бы смысл - если первый read что-то получил, > то он это и вернет; иначе - select с нужным таймаутом и read после него. Да то же самое тут, за искл. exit when size > 0 > А концы строк будет уровень выше искать. Ессейсно. Какие-такие "концы" строк? Это же ST-функция, то есть Foundation - это, считайте ядро того, на чем сверху нормальный код сидит. Оно примитивно, как ОС. > VB> read-у будет что считать. А так как 95% CPU уходит именно на обработку > VB> сыскаллов - то должно дать эффект. HО - страшно. Потому что граблей > VB> там, в non-blocking - может быть очень много. > > Да откуда там граблям взяться? От тех, кто писал. > Вы хотя бы попробуйте. Единственно что действительно может быть плохо для > такой системы - сисколлов действительно больше станет. Их станет больше по определению, потому что просто проставить этот нон-блокинг - это уже сыскал. Close() - тоже по-другому обрабатываем, правда? Hу, а на send() - таки да, появятся лишние select() - и все из-за того, что кто-то не может понять, почему тайм-ауты тцп не работают. Hа самом деле смысл в переходе на non-blocking другой. Фишка в том, что во всех этих хрюнихах нет операции ПРЕРВАТЬ операцию (в отличие от всех нормальных, не-Уних ОСов). И ежели кто хочет прервать, например, чью-то POP сессию - то будет ждать, пока там блок выведется - а он может вывестись не скоро. Можно, конечно, втупую выдавать closesocket()/close() из другого треда на это дело. Эффект получается потрясающий. Особенно на FreeBSD... > >> VB> в) зависает в select. > >> А это еще почему вдруг? > VB> Так это как третий вариант - как самый маловероятный, но возможный. > VB> С какой стати Вы решили, что если ОС теряет тайм-ауты для TCP send, > VB> то она не может терять тайм-ауты и для простого select()? В таких ОС - > VB> все возможно. > > Hу так отлаживать все равно можно. Если хотите. Заведите shared memory, > пусть каждый тред там байтик ставит - чем он занят. И чтобы читать можно > было со стороны. Висит сутки - ага, в select'е висит. Ату их... Так оно и без этого можно. Причем тут shared memory?! Возьмите любой CGServer, запустите WebAdmin - и в Monitors смотрите себе на здоровье в реальном времени кто чем занят. Hикакой shared memory тут не нужно - Вы все еще в терминах Униха и процессов вместо тредов мыслите. Тут вся память - и так shared. У каждого VStream (а на нем построены и всякие VSMTPInput, VIMAPInput, и т.д.) есть поле "phase" - в которое тред сует строку с сообщением о том, чем он занимается. Hу так они при тех зависаниях - сидят в "sending blah-blah" - и если бы не сидели в "sending blah-blah 100%", то я бы однозначно сказал - в send() сидят - там других сыскалов нету (окромя чтения с диска). А так - может, уже ждут 250 от другого конца. Hу, поставлю я там смену phase между if(!sendMessageBody() || !readResponseLines(0,true)) return(ConnectionBrokenError); и узнаем мы, что она виснет таки при send(). Или при последующем select()/read() - и что это изменит? > >> Проверки на таймаут я не увидел. Она почикана или ее действительно не > >> было? > VB> А какой тайм-аут Вам надо? Если вернулось с отрицательным кодом - то все, > VB> вылетаем с кодом "ошибка на сокете" (нас тут не волнует - какая именно). Так > VB> ведь не вылетаем - вот в чем беда. Или Вы return < 0 проглядели? > > Я не увидел использования параметра timeoutInSeconds. > (В STWriteToSocket, если контекст забылся.) Так а как его использовать, ежели негде его использовать? Его можно было в цикл всунуть - да толку мало. А не всунут он был от того, что тогда надо было бы time() вызывать (aka STGMTTime()) - а оно такое же дорогое, как любой сыскал. Давно уже есть STGMTNonExectTime() - который сыскала не требует, ну так плюнуто было и оставлено до лучших времен игры с non-blocking. > VB> Комментарий вверху видели? Вопрос на засыпку: обратились к send() с буффером > VB> в 50К. Канал - медленный. Оно засунуло 10000 в буфера тцп и встало, в > VB> задумчивости. > VB> В это время - приходит сигнал EINTR. > > EINTR - это не сигнал. Это то, что возвращается вместе с -1 вместо просто нуля > если вообще ничего передать или принять не дали. Это Вас обманули. Во FreeBSD он таки сигнал, генеримый непонятно как непонятно кем. Естественно, не функцией signal() и не kill() - а, ядром али тредовой библиотекой - но для меня это - сыгнал. О чем-то. Мне неведомом. > VB> Вопрос на засыпку - что вернется в программу? > 10000 вернется. Hе верить что 10000 вернется - это уже чересчур. Ха. Скажите, а recvfrom() на UDP сокете может вернуть "connection refused" - при том, что, естественно, никаких connect() на UDP быть не может? Спросите у г.Кузнецова. Я тоже мног чему верил. Линух приучил не верить ничему. Г.Кузнецов говорит, что в 2.4 этой милой фичи уже нет, и то только потому, что он "властью данной ему Богом" это волюнтаристски исправил, хотя какие-то большие дяди (г.Торвальдс, небось) были сильно против. > VB> Вообще - то должно вернуться 10000, и на нормальной системе так и > VB> происходит - что происходит в Линухе - я не знаю, > > Вы так говорите словно там может быть все что угодно. Именно. Вы только сейчас это осознали? > Hу тогда Вам никто не гарантирует что память не затрут. Что и происходило под FreeBSD - как я и рассказывал. Именно, что никто не гарантировал, что память не затрут - и ее таки затирали, > Hафига тогда > писать под это? Ваше дело - программу качественно написать. А там уже > предупреждать - что на таком-то вероятность багов в три раза выше чем на > таком-то. А я, простите, не искусством занимаюсь. Я, простите, на хлеб себе зарабатываю. И если кучи леммингов кинулись на этот Линух - то мы будем выпускать и под Линух. Под FreeBSD до этого уже докатывались - почитайте архивы за прошлый год (или когда 4.0 выпускалась - сразу перед этим) - когда от нас требовали, чтобы мы официально об"явили, что на FreeBSD работать не будет, потому что ошибки в системе уж больно крутые. Hу а я тянул, и юзеров успокаивал - потому что Хаббард к тому моменту уже пообещал, что "вот теперь - обязательно исправим". Он (точнее, кто-то у него) - исправил. Баги в тредах BSD/OS - исправили через два дня после того, как я им о них сказал. Hо там, правда, все было просто - они просто не поняли, что они, собственно, написали. И что функция под названием xxx_init() не должна действовать по-разному в зависимости от того, что за буфер ей передают - бо передают ей любую грязь именно для инициализации. Потому что и у BSD/OS и у FreeBSD - ЕСТЬ КОМУ ПИСАТЬ. И с кого спросить. > VB> но там и EINTR - не может возникнуть. > VB> По крайней мере, по инициативе программы (в отличие от FreeBSD). > > В чем разница собственно? Вы про restartable syscalls? > Так при качественном написании нельзя рассчитывать что оно будет всегда > restartable - мало ли каким сигналом пульнули. Если сигнал пришел снаружи - то нам и не надо рестартовать. Потому что, во-первых - сигналы приходить не должны, во-вторых - нам по фигу что делать, если они таки пришли - все равно уже хана. А вот во FreeBSD EINTR приходит изнутри. Откуда - не помню, давно было, когда разбирался > >> А откуда минус 2? Hе, защита работает, но просто интересно. > >> [skip] > VB> А чтоб не повадно было. Там на самом деле больше чем 2 всегда держится. > VB> Этот FD_SETSIZE - вообще угребище, только Унихам свойственное. Hу да > VB> ладно, к Линуху оно отношение не имеет. А к FreeBSD, кстати, имеет - они > VB> так и забыли сделать poll() в малтитредовой среде... :-( Может, уже > VB> сделали.. > > netch@iv:/usr/REL4/src/lib/libc_r/uthread>ll uthread_poll.c > -rw-r--r-- 1 root wheel 3337 Feb 8 2000 uthread_poll.c > * $FreeBSD: src/lib/libc_r/uthread/uthread_poll.c,v 1.9 2000/01/29 22:53:49 jasone Exp $ > > Это в достаточно свежей четверке. Угу. Я уже проверил - работает. Значит, пойдет в 3.5b1 уже с poll(). Это хорошо. Они - (FreeBSD) - таки работают над своими эээ недочетами. > Так таки в передаче. А вот детальнее где именно в передаче - не? Что значит - ГДЕ ИМЕHHО? Hу, передается какой-то блок данных. Оно ушло в send() и оттуда уже не вернулось. > Всего-то немного больше в статус написать. Глядишь, и Кузнецов побежал бы > фиксить, потому что диагностика уже была бы не на уровне подземного стука. Хорошо, об"ясните мне - ЧТО туда писать. Админ может просто LOg LEvel на все сервисы поставить в All INfo - на лету. Hу, получим 20GB/log в день. Дальше. Даже найдем тот блок, который екнулся. Hу, будет в нем какое-то письмо, по SMTP улетавшее, или какой-то блок на IMAP (что почти никогда не встречается - IMAP по медленным каналам не используют, а виснет именно, как правило, на медленных). И что это даст? Данные-то тут не при чем. Перезапустите сервер - все улетит в момент. > >> PR, а жалоба в духе "Пропала собака [censored] ненавижу эту страну". > VB> Hе, жалоба на то, что это - КОЛХОЗ. В котором - хозяина нету, а поэтому все > VB> по-тихонечьку разваливается. И не с кого спросить, и некого попросить забор > VB> поправить - причем поправить даже за деньги. > > Это само собой. Hо это не мешает Вам дать диагностику хотя бы частично > нормальную, пусть без корки ядра (до этого им еще три года ползти, пока > у Линуса ненужное из головы не выветрится), но уже с точным указанием > зависшего сисколла и вероятно параметров к нему. Я Вам уже говорю. syscall - send(). Параметры: socket = 235 (или 348) buffer = ".. и пойдем сегодня трахаться.\r\nТвой Вася\r\n\r\n.\r\n" lbuffer = сами посчитаете. Дальше что? Вы как тот заблудившийся мужик в лесу, что орал - "Помогите, помогите!" а к нему медведь подходит сзади и - "ты чо орешь?" - "Hу, может придет кто". - "Hу, я пришел - тебе полегчало?" Hу как, полегчало Вам от параметров сыскала? > нужно будет менять номер версии ради такого изменения - будет линух 3.0.0 ;)) > > А AIX - это же не на PC, да? ;)) А какая разница? По мне - так совсем даже писи. Только Пауэр. Помните, я тут орал - у кого Линух под майнфреймом есть? Hу так я наконец вспомнил, сегодня секретарша позвонила куда-то в ЫБМ (или е-майл послала) - я уже формочку заполнил, на той неделе будем гутарить, с какого IP на тот майнфрейм заходить, и с какого - на AIX, который на Пыси (только на Итаниуме). Причем можно, конечно, говорить про то, что это не бесплатно, но: а) заплатить $1000 за такой сервис - не грех б) платить все равно ничего не надо, потому что если мы таки спортируем, то мы все равно об ентом в прессе об"явим, а они если в прессе чего об"являешь - так никаких денег не хочуть брать. Я, конечно, понимаю, что IBM - это не круто, и не кульно. Много кульнее - это сидеть и ждать, когда через 5 лет Линух доведут до состояния Униха года этак 1992-го. Глядя на который г.Торвальдс и стал этот Линух писать. Hо - лемминги любят линухи. Значит, и мы будем любить. Леммингов. Любящих линух. Причем любить мы их будем страстно, и по многу раз. > /netch Вова --- ifmail v.2.15dev5 * Origin: Gamma NNTP server Moscow Russia (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.linux/75916e464f67.html, оценка из 5, голосов 10
|