[personal profile] dmitry_vk

Выложил для тестирования бинарную сборку SBCL с нитями в https://sites.google.com/site/dmitryvksite/sbcl-distr/sbcl-1.0.40-threads-2.msi. Если есть возможность прогнать тесты (два основных теста, которые я использовал при отладке я выложил в http://gist.github.com/582848) и отписаться о результатах, было бы здорово.

Date: 2010-09-16 08:31 pm (UTC)
From: [identity profile] ex-vdom.livejournal.com
Гонял первый минут 40. Два раза падал флеш-плеер, одновременно с этим проигрывающий видео, а тут все работает.

Второй тоже запускал, но не долго.

Date: 2010-09-17 02:23 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Спасибо. Не совсем понял, когда и в каких условиях падал флеш-плейер?

Date: 2010-09-16 08:50 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
От test-thread-3 вам нужен вывод, или факт [напр. упало/не упало]?

P.S. По итогам разбирательств с STD* - достаточно укокошить STD_INPUT_HANDLE; а вот сдублировать его и заменить на дубль недостаточно (как и ожидалось: на моей памяти ни одна из хэндло-висельных проблем дупликацией не лечилась).

Date: 2010-09-17 02:19 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Только факт: упало или нет, а также то, что выводятся плюсы и буквы от A до C.

Date: 2010-09-17 03:33 am (UTC)
From: [identity profile] akovalenko.livejournal.com
Всё как задумано (не упало, +ABC перемешаны; в другом тесте точки) на winxp/32bit и win7/64bit, обе в виртуальных машинах на amd64 хосте (VM одноядерные), время около 20 минут.

Date: 2010-09-17 03:37 am (UTC)
From: [identity profile] akovalenko.livejournal.com
Кстати, по соседнему баг-репорту -- не пропустите тот факт, что *standard-output* на старте sbcl является synonym-stream, соответсвенно, весь вывод постоянно лазает в (symbol-value sb-sys:*stdout*). Если это невоспроизводимая проблема с TLS - сочувствую заранее :(

Date: 2010-09-18 10:26 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
У меня к вам вопрос — я сейчас пытаюсь запустить hunchentoot, а он не принимает соединения (то есть, соединения принимаются, но до обработки запроса дело не доходит — внутри hunchentoot::accept-connections не возвращается вызов wait-for-input). Не могли бы вы посмотреть, а то я не очень хорошо разбираюсь в виндовом IO?

Date: 2010-09-18 01:22 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
Я пока не воспроизвёл -- всё работает [увы! в кои-то веки..], hunchentoot принимает соединения и отвечает.

Давайте попробуем изолировать проблему в USOCKET.
(usocket:with-socket-listener (sv "0.0.0.0" 8024)
           (usocket:wait-for-input sv :ready-only t :timeout 3600)
           (usocket:socket-accept sv))

Этот код должен висеть в ожидании, а при подключении [напр. telnet localhost 8024] сразу вернуть работающий stream. Пожалуйста, расскажите, как у вас.

(Кстати, следите за тем, чтобы использовать незанятый порт -- а то с обработкой ошибок winsock в sbcl бывает невесело).

Date: 2010-09-18 01:52 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
Забыл про одну подробность: в вашей последней бинарной сборке CONTRIBS не вошли в инсталляционный пакет (наверное, они просто не построились). Так вот, если вы тестируете её же, поставили собранный инсталлятор стандартным способом (или просто имеете непустой SBCL_HOME) -- у вас могут грузиться FASLs от предыдущего sbcl-1-0-40 (который у вас стоял, или который собирали...). Я, правда, ещё не видел, чтобы это не приводило очень быстро к сваливанию в LDB -- но если у вас предыдущий код близок к актуальному, псевдослучайные глюки были бы в такой ситуации вполне естественны.

В общем, я hunchentoot запускаю на своей сборке где-то недельной давности (+OVERLAPPED, но влиять в данном случае не должно). Как я вижу, после этого вы уже коммитили; если в случае с hunchentoot речь идёт специфически о регрессии последних нескольких дней, предупредите (буду тогда сначала пересобирать, а потом уже думать :)

Date: 2010-09-19 03:58 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Они не вошли, потому что были ошибки при их сборке. Я их недавно исправил в коммите Handle EOF on reading from pipes (http://github.com/dmitryvk/sbcl-win32-threads/commit/9e5361bb7dadf5f20be8bb433c98a59748256905). Проблема была в том, что скрипты сборки контрибов передают команды SBCL'ю через пайп, а при чтении из закончившегося пайпа возвращался не "конец файла", а поднималось исключение, которое интерпретировался как ошибка сборки; сами собранные contribs при этом работали нормально.
Я не думаю, что речь идет о регрессии, но думаю, что это как-то связано с OVERLAPPED IO. Проверяю на своей последней версии (Add workaround for LoadLibrary hang in REPL (http://github.com/dmitryvk/sbcl-win32-threads/commit/64eeabc90fee571c9cb8dafaebdf0238b925b269)) из консоли и из REPL'а.

Date: 2010-09-19 06:44 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Я попробовал последнюю вашу версию (исправив ошибку компиляции в pthreads_win32.c). Там такая же картина - зависает на unix-fast-select до завершения таймаута (я его уменьшил до 10 секунд). В файле wrap.c есть реализация select для винды, но как скрестить select с используемым OVERLAPPED IO я пока не разобрался.

Date: 2010-09-19 11:20 am (UTC)
From: [identity profile] akovalenko.livejournal.com
В том usocket, что стоит у меня (довольно свежий), wait-for-input не использует sbcl-ные потроха с unix-fast-select, делает всё сам (WSAEventSelect там у него свой и прочее). Если у вас не так, надо обновить usocket, наверное. Ну а если hunchentoot пользуется sbcl-ным wait-for-input -- значит, отличия в hunchentoot (тут я не знаю, обновить его надо или состарить :). Возможно, вы как-то по-другому конфигурировали hunchentoot -- у меня в threaded sbcl win32 он запускает отдельный тред, никаких настроек я не делал.

OVERLAPPED влиять не должен (или, если должен, то только в хорошую сторону). SBCL-ный виндовый unix-fast-select в принципе не может работать, когда ждать приходится на несокетах и сокетах разом. Я не очень понимаю устройство SBCL около sub-serve-event, with-fd-handlers и их друзей, но если ханчентут использует эту часть SBCL для мультиплексирования REPL и обработки сокетов -- проблемы гарантированы.

Реализация wait-for-input, которую я сейчас вижу в USOCKET, сделана правильно (WSAEventSelect -- внимание, для акцептов там отдельный флаг -- и ожидание на event'е). В перспективе в SBCL надо бы сделать аналогично, чтобы event loop с fd-handlers можно было бы пользоваться под виндой.

Date: 2010-09-19 05:11 pm (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Спасибо, обновление usocket из svn помогло, хотя и не полностью.

Date: 2010-09-19 11:32 am (UTC)
From: [identity profile] akovalenko.livejournal.com
P.S. Думаю, что попытка выполнить винсочный select() на консоли, на которой есть outstanding read, может виснуть на том же GetFileType (или каком-либо его низкоуровневом аналоге). В общем, текущий sbcl-ный вызов unix-fast-select из serve-event.lisp при установленном fd-handler'е на консоли -- ничего хорошего не принесёт; если можно отучить его виснуть, он будет возвращать ошибку.

Date: 2010-09-16 09:44 pm (UTC)
From: [identity profile] ander-skirnir.livejournal.com
Что-то странное происходит, если стартовать первый тест через Able. Рано или поздно вылетают ошибки "type-error in thread", а когда их насобирается 3 штуки, печатается только #\C. А в консоли вроде всё нормально. Вот как это выглядит: http://i064.radikal.ru/1009/7c/827880b357ba.png

Второй тест и через able, и через консоль печатает точки.

Date: 2010-09-17 02:22 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Спасибо. Буду думать и смотреть. На каком процессоре запускался тест?

Date: 2010-09-17 03:06 am (UTC)
From: [identity profile] ander-skirnir.livejournal.com
Да это Вам спасибо,
проц - Intel Core i3 (Arrandale-3M (http://en.wikipedia.org/wiki/Arrandale_%28microprocessor%29))

Date: 2010-09-17 04:42 pm (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Под линуксом этот тест точно так же падает. Мне кажется, что эта проблема специфична для ltk, что где-то у него внутри пропадает поток вывода (возможно, что сам ltk не является нитебезопасным).

Date: 2010-09-17 05:14 pm (UTC)
From: [identity profile] ander-skirnir.livejournal.com
Отлично! :)

Date: 2010-09-17 09:43 am (UTC)
From: [identity profile] andy128k.livejournal.com
Запустил оба теста на ночь. Никаких ошибок. test-thread-3 выводит вперемешку +ABC.

Date: 2010-09-17 09:48 am (UTC)
From: (Anonymous)
Запускал оба теста, работали около 4х часов, первый выводил +ABC вперемешку, второй точки, ничего не упало, запускал в win xp sp2, в виртулабоксе, проц - AMD Phenom(tm) 9850 Quad-Core Processor, под виртуалку выделено 2, но не уверен что винда в курсе.

Date: 2010-09-18 01:15 pm (UTC)
From: (Anonymous)
Core Quad Q9600, Windows 7.
test-thread-3.lisp: после часа работы выводит плюсы, A, B, C, как и должно быть. Общая загрузка лиспом процессора 20-24% равномерно по ядрам.
threads3.lisp: десять минут выводит точки, как и должно быть. Общая загрузка лиспом процессора 50-60%. После этого точки выводить перестаёт, и у одного ядра загрузка 100%, остальные не загружены.

Федотов Валерий (laser123 в jabber).

Date: 2010-09-19 12:11 pm (UTC)
From: [identity profile] linkfly.livejournal.com
WindowsXP in vmware (1 проц, 256Мб опер.пам.)
Real Processor: Core 2 Quad 6600 2.4Гц
Real Memory: 4Гб

C:\sbcl-tests\> sbcl
* (load "test-thread-3.lisp")
Вывело строчек 15 +ABC в перемешку. Задумалось.
Я уж думалось - висит, хотел скопировать и скопипастить сюда.
Потом тест возобновился и успешно работал ~4часа.



Date: 2010-09-19 01:27 pm (UTC)
From: [identity profile] linkfly.livejournal.com
Второй тест выводит успешно точки, где-то уже 1ч.20м.

Date: 2010-09-21 09:40 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
Для информации:
Обнаружилось прискорбное: overlapped anonymous pipes в этой стране не дают (смотрел в эту сторону не только для прерывабельности, но и для того, чтобы изобразить unix_select() в перспективе). Таким образом, ввод/вывод по пайпам сейчас не прерывается (в остальном работает; откат на непрерывабельный non-overlapped я допускаю для всего). Старинный способ с WaitForSingleObject непосредственно на файловом дескрипторе ожидать ввода на anonymous pipe тоже не умеет :(

Вопрос: вы на какую платформу целитесь в качестве минимальной? [есть впечатление, что «недовинды» 9x/ME уже выпали, но проверить негде]. Не помню про CreateWaitableTimer, когда он появился -- вроде в 2k или раньше -- а делать на нём прерываемый Sleep было бы удобно. И ещё я буду исследовать возможности для имитации anonymous pipe через named, чтобы на них overlapped включать ("родные" anonymous pipe тоже, говорят, сделаны через named, так что это меньший изврат, чем кажется) -- там тоже системно-зависящие вещи могут всплыть; впрочем, если всё ниже win2k неинтересно, я могу смело использовать любой API, который помню :)

Date: 2010-09-22 05:16 am (UTC)
From: [identity profile] dmitry-vk.livejournal.com
Судя по msdn, CreateWaitableTimer есть в win2k. Я не думаю, что системы ниже w2k можно вообще рассматривать, и так, по-моему, использовано уже много вызовов, появившихся только в win2k.

А как waitable timer может помочь в данном случае?

Date: 2010-09-22 12:29 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
На waitable timers удобнее рестартовать ожидание -- т.е. поймали прерывание, обработали, ждём дальше на том же таймере. Можно и без них, но это "поймал что-то, кроме WAIT_TIMEOUT, и считаешь, сколько времени прошло и сколько осталось ждать". Аналога clock_monotonic я что-то пока не вижу, так что и тот и другой способ завязаны на сомнительные assumptions по поводу текущего времени..

Date: 2010-09-22 12:33 pm (UTC)
From: [identity profile] dmitry-vk.livejournal.com
А как на них можно ждать одновременно с чтением? WaitForMultipleObjects нельзя сделать, т.к. не на чем.

Date: 2010-09-22 12:53 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
Не, про прерывание Sleep с помощью таймеров я отдельно думаю -- т.е. с non-overlapped pipe ничего [хорошего] так не сделать. Про "одновременно с чтением" речь не идёт. А неодновременно можно ждать на самом timer (да, уже нашёл, как ему задать относительное время).

Date: 2010-09-22 12:59 pm (UTC)
From: [identity profile] akovalenko.livejournal.com
По пайпам -- заглянул сейчас в Tcl. Оказывается, ReadFile *на нуль байт* в NT-like дожидается, чтобы пришли данные. В tcl его сгружают в отдельный тред и таким образом получают сигнал. Пока буду считать, что такое уже слишком.

Profile

dmitry_vk

April 2023

S M T W T F S
      1
234567 8
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 5th, 2026 01:41 am
Powered by Dreamwidth Studios