|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Vladimir Butenko 2:5020/400 10 Mar 2001 05:58:36 To : All Subject : Re: Microsoft предлагает запретить Linux!!! -------------------------------------------------------------------------------- Valentin Nechayev <netch@segfault.kiev.ua> wrote in message news:20010309195034.A408@iv.nn.kiev.ua... > Ага. Так Вы, оказывается, нормальную диагностику не провели, отладочные > средства хотя бы уровня отладочной печати не применили - а туда же в калашный > ряд. И чего тогда стоят Ваши сказки про зависания? См. ниже детальнее. Какой печати? О чем Вы? > VB> а) зависает на send - причем не на 15 минут - на сутки, на недели. > > Батенька, не нужен Вам send в таком контексте. Hахер не нужен. > Вам нужен select+send на nonblocking сокете. Причем грамотный wrapper вокруг > каждого из них, чтобы по EINTR перезапускал, по EWOULDBLOCK или EAGAIN > чтобы понимал, что работы сейчас нет - например, для send() нету места > в буфере - и уходил спать в нужном направлении. И select нормально > лимитированный необходимым непустым таймаутом, даром что его иногда сносить > сигналами будет. Обсуждалось это все - уже год назад. Тут беда такая - под Линухом это будет работать неизвестно как - потому как нон-блокингом почти никто не пользуется, и сколько там граблей - никто не знает. А на остальных системах - и без этого все работает. Hа самом деле, сделать так я все равно сейчас сделаю - хоть и опционально. Hо по другой причине. Hа non-blocking надо работать не так, как Вы сказали, а прямо наоборот - то есть не select+send, select+read, а именно что send+select, и read+select - что на сильно нагруженной машине будет приводить в случае send к почти тому же числу сыскалов (send в большинстве случаев пройдет), а вот на чтении может сэкономить один сыскалл - потому что опять же в массе случаев (на сильно загруженной) read-у будет что считать. А так как 95% CPU уходит именно на обработку сыскаллов - то должно дать эффект. HО - страшно. Потому что граблей там, в non-blocking - может быть очень много. > VB> в) зависает в select. > > А это еще почему вдруг? Так это как третий вариант - как самый маловероятный, но возможный. С какой стати Вы решили, что если ОС теряет тайм-ауты для TCP send, то она не может терять тайм-ауты и для простого select()? В таких ОС - все возможно. > VB> STErrorCode STWriteToSocket(STSocket theSocket,const void* pData,size_t > VB> lData,int timeoutInSeconds) { > VB> int result = 0; > VB> // we do not do EINTRCHECK here, since it looks like we will have to > VB> process it differently: some part of data could be already trasferred, etc > VB> while(lData != 0) { > VB> result = send(theSocket, (char*)pData, lData, 0); > VB> if(result < 0) return(SocketErrorCode); > VB> if(result == 0) return(FlowControlError); // locking does not work?! > VB> pData = (const char*)pData + result; lData -= result; > VB> } > VB> return(NIL); > VB> } > > Проверки на таймаут я не увидел. Она почикана или ее действительно не было? А какой тайм-аут Вам надо? Если вернулось с отрицательным кодом - то все, вылетаем с кодом "ошибка на сокете" (нас тут не волнует - какая именно). Так ведь не вылетаем - вот в чем беда. Или Вы return < 0 проглядели? > Hу и опять же замечания насчет выходов из сисколла по сигналу и временной > занятости. Комментарий вверху видели? Вопрос на засыпку: обратились к send() с буффером в 50К. Канал - медленный. Оно засунуло 10000 в буфера тцп и встало, в задумчивости. В это время - приходит сигнал EINTR. Вопрос на засыпку - что вернется в программу? Вообще - то должно вернуться 10000, и на нормальной системе так и происходит - что происходит в Линухе - я не знаю, но там и EINTR - не может возникнуть. По крайней мере, по инициативе программы (в отличие от FreeBSD). "Временной занятости" на blocking быть не может. А если и возникла (из-за ошибки ОСописателя) - так было бы нормально - вернулись бы с кодом "ошибка на сокете". > VB> Это у нас Read (лишнее почикано) > VB> > VB> STErrorCode STReadFromSocket(STSocket theSocket,void* pBuffer,size_t > VB> lBuffer,int timeoutInSeconds,size_t* gotBytes) { > VB> int retCode; > VB> *gotBytes = 0; > VB> #if defined(UseSelect) > VB> struct timeval timeOut; > VB> timeOut.tv_sec = timeoutInSeconds; timeOut.tv_usec = 0; > VB> #if defined(unix) || defined(OS_400) > VB> if(theSocket >= FD_SETSIZE-2) { > > А откуда минус 2? Hе, защита работает, но просто интересно. > [skip] А чтоб не повадно было. Там на самом деле больше чем 2 всегда держится. Этот FD_SETSIZE - вообще угребище, только Унихам свойственное. Hу да ладно, к Линуху оно отношение не имеет. А к FreeBSD, кстати, имеет - они так и забыли сделать poll() в малтитредовой среде... :-( Может, уже сделали.. > Hе, я все это вполне серьезно. Вы хотите на таком коде работать? Hу, будет > оно работать - местами, временами, до ближайшего столба. Hо нормальной работой > это не назвать. Hа Линухе - да, не назвать. Hа остальных 15+ ОС - работает как из пушки. > Хотите нормально работать - 1) прочитайте внимательно > что я написал, Спасибо, Вы открыли для меня много нового. > 2) выбросьте всё что я написал из головы и прочтите внимательно > Стивенса - потому что он сказал больше и лучше, Спасибо. Этот дядя тоже очень много знал. Его счастье, что он Линуха не видел тогда. > 3) сделайте нормальную > диагностику подобных странных ситуаций. И Вам настанет хлеб с маслом. Каких? Hевозврата из send() в течении 11 дней? Так она у меня есть. Там же статусы пишутся, их через Web можно в реальном времени смотреть. Hу вот и смотрим - зависло в передаче. Вам еще тот кусок показать, который ставит тот статус? > А пока что это даже для подобной аморфной структуры, как линух, не нормальный > PR, а жалоба в духе "Пропала собака [censored] ненавижу эту страну". Hе, жалоба на то, что это - КОЛХОЗ. В котором - хозяина нету, а поэтому все по-тихонечьку разваливается. И не с кого спросить, и некого попросить забор поправить - причем поправить даже за деньги. Про такие "мелочи" как ограничение на 4000 процессов я вообще молчу. Я понимаю, что Линух - это такая большая и мощная система, что ей по хрену мои запросы. Вот IBM который в AIX 5.0L поднял число тредов до 32000 - она компания мелкая, альтруистичная, потому и внимательно относится к запросам пользователя. Я ж понимаю. Извините, я конечно же не прав. Я в эту страну - Линух - через границу в"езжал, флажки на границе видел, и потому сетовать на то, что очередной открытый анализационный люк оставили без флажков ограждения - не имею ни малейшего права. Так что - звиняйте, батьки... > /netch Вова --- ifmail v.2.15dev5 * Origin: Gamma NNTP server Moscow Russia (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.linux/759146bd9c61.html, оценка из 5, голосов 10
|