Камышев Александр

Пользователи
  • Публикации

    205
  • Зарегистрирован

  • Посещение

  • Days Won

    8

Камышев Александр last won the day on 14 ноября 2016

Камышев Александр had the most liked content!

О Камышев Александр

  • Звание
    Продвинутый пользователь
  • День рождения 02.12.1978

Информация

  • Пол
    Мужчина
  • Город
    Москва, Троицк

Посетители профиля

419 просмотров профиля
  1. Бывает Про директивы не знал, теперь буду в курсе, так изящнее, спасибо, но увы и ах: The memory allocation directives are meaningful only in a program. They should not be used in a library or a unit. т.е. в System.Classes.pas и в IdThread.pas вставлять нельзя, ибо should not be used in a library or a unit. Indy сама создает потоки в коде библиотеки IdCustomTCPServer.pas. и еще {$M 16384, 65535} - полагаю размеры указаны неверно, от 64К до 1М, возможно я ошибаюсь, вроде: гранулярность выделения адресного пространства равна 64 Кб, сдругой стороны из описания Default {$M 16384,1048576} В общем, все таки брутальный подход, только хардкор...
  2. результаты краш-теста - упал в "Недостаточно памяти" после 5770 запросов в секунду, как бы и ничего так С обращением к пулу - 3к и без задержек на доступ к критическим секциям 5к запросов с задержкой 200 мсек. - непринужденно, конечно после допила системного TThread, беда кстати была не в инди, а в теплом ламповом borland. тестировалось на ПК разработчика, сервер и эмулятор на localhost:
  3. Не думаю что сколько нибудь заметно, если брать http пакеты, ведь TIdHTTPServer наследник от TIdCustomTCPServer. Если пересылать бинарные массивы, без парсинга хедеров - возможно и будет небольшое увеличение. Был приятно удивлен, по всем ядрам ровная нагрузка.
  4. думаю эти два куска показывают основную обработку OnCommandGet, из хедера: typedef std::deque< strDBQueueMember* > db_queue_deque; db_queue_deque db_queue; TCriticalSection *cs_pool, *cs_queue, *cs_files; TInterlocked *Interlocked; 3600 это запрос без обращения к бд, только данные из пула с критическими секциями ну и вот это обязательно в System.Classes.pas в Embarcadero\Studio\17.0\source\rtl\common\ constructor TThread.Create(CreateSuspended: Boolean); -//- {$IF Defined(MSWINDOWS)} //#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 - это для информации //#define CREATE_SUSPENDED 0x00000004 - это для информации // заменить FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID); // на FHandle := BeginThread(nil, 65536, @ThreadProc, Pointer(Self), $00010004, FThreadID); System.Classes.pas добавить в проект. и будет вам счастье
  5. //--------------------------------------------------------------------------- void TdmSkyUpdate::PostCommand( strCommandData *cd ) { bool is_client = false; if ( !cd->req->AuthExists ) { cd->sx_auth = cd->req->RawHeaders->Values["X-SX-auth"]; if ( cd->sx_auth.IsEmpty() ) { cd->resp->ResponseNo = 401; return; } is_client = true; } if ( !is_client ) { strDeviceCmd dc; dc.cd = cd; cs_pool->Enter(); PostDevice( &dc ); cs_pool->Leave(); if ( !dc.db_queue.size() ) return; if ( !PushToDBQueue( &dc.db_queue ) ) { cd->resp->ResponseNo = 500; return; } } else { strClientCmd cc; cc.cd = cd; cs_pool->Enter(); PostClient( &cc ); cs_pool->Leave(); if ( !cc.db_queue.size() ) return; if ( !PushToDBQueue( &cc.db_queue ) ) { cd->resp->ResponseNo = 500; return; } if ( cc.file_data.data ) SaveTaskFile( &cc.file_data, cc.file_id ); } } //---------------------------------------------------------------------------
  6. //----------------------------------------------------------------------- void __fastcall TdmSkyUpdate::serverCommandGet(TIdContext *AContext, TIdHTTPRequestInfo *ARequestInfo, TIdHTTPResponseInfo *AResponseInfo) { strCommandData cd; #ifdef AUX_MODE #ifdef MY_DEBUG_MODE cd.log_queue.push_back( ARequestInfo->RawHTTPCommand ); // debug cd.log_queue.push_back( ARequestInfo->RawHeaders->Text ); // debug #endif MyTimer timer; timer.Start(); #endif if ( db_queue_size >= max_db_queue_size ) { AResponseInfo->ResponseNo = 503; #ifdef MY_DEBUG_MODE cd.log_queue.push_back( "Переполнение очереди в бд, ограничение " + (AnsiString)max_db_queue_size ); // debug PushToLogQueue( &cd.log_queue ); TIdNotify::NotifyMethod( OnLogQueue ); #endif return; } cd.req = ARequestInfo; cd.resp = AResponseInfo; cd.user = cd.req->AuthUsername; cd.pass = cd.req->AuthPassword; AResponseInfo->CloseConnection = ARequestInfo->Connection.LowerCase() != "keep-alive"; switch ( ARequestInfo->CommandType ) { case hcGET: GetCommand( &cd ); break; case hcPOST: PostCommand( &cd ); break; case hcHEAD: HeadCommand( &cd ); break; case hcPUT: break; } #ifdef MY_DEBUG_MODE PushToLogQueue( &cd.log_queue ); #endif #ifdef AUX_MODE int req_time = timer.GetTimeMSec(); if ( stat.dev_req_time < req_time ) Interlocked->Exchange( stat.dev_req_time, req_time ); #endif } //---------------------------------------------------------------------------
  7. заработало 3600 запросов в секунду, пока не падает, в клиенте время запроса 0,7 секунды поднялось с 0,1 и 70% процессорного времени попробую теперь без обращения к пулу, без критических секций, как время ответа измениться и до краша догнать
  8. Пытаюсь изменить код в исходниках System.Classes.pas: constructor TThread.Create(CreateSuspended: Boolean); -//- {$IF Defined(MSWINDOWS)} //#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 //#define CREATE_SUSPENDED 0x00000004 //FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID); FHandle := BeginThread(nil, 65536, @ThreadProc, Pointer(Self), $00010004, FThreadID); // изменения тут if FHandle = 0 then raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]); компилируется, создаю System.Classes.hpp, однако нет эффекта совсем, удалял совсем стоку создания потока BeginThread - никакого эффекта, видимо rtl не так просто изменить. как применить изменения?
  9. означает "Пиковый рабочий набор", Process Explorer показал Private Bytes 100м и Working Set 63м. Может я не туда смотрю... где гектары? Полагаю ограничение все-таки размер стэка, т.е. размер резервируемых адресов там превышен.
  10. инди создает срэд перед вызовом OnCommandGet, есть HeadersAvailable но оттуда редиректнуть нельзя, а смысл перенаправлять если ресурсы уже заняты... MaxConnections есть ограничение в IdHTTTPServer, и да, разумная цифра 1024 там не будет лишней.
  11. в процессах пиковая память 80м - ни о чём. http://www.transl-gunsmoker.ru/2010/09/windows-2000.html тут пишут что в принципе больше 2k средов один процесс не может сделать. проблема не в этом, винда при вызове API вернула ошибку - ок обработали, работаем дальше, так нет в ошибку доступа и крашиться процесс, это беда библиотеки
  12. последняя строка перед исключением ведет сюда constructor TThread.Create(CreateSuspended: Boolean); {$IFDEF POSIX} var ErrCode: Integer; {$ENDIF POSIX} begin inherited Create; FSuspended := not FExternalThread; FCreateSuspended := CreateSuspended and not FExternalThread; if not FExternalThread then begin {$IF Defined(MSWINDOWS)} FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID); if FHandle = 0 then raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]); далее иду по шагам до строки в IdStack procedure TIdStack.RaiseLastSocketError; -//- raise EIdSocketError.CreateError(AErr, WSTranslateSocketErrorMsg(AErr)); после чего вылет в AccessViolation и краш процесса. Разработчики хелп... я не знаю куда дальше копать.
  13. удалось получить исключение под дебаггером
  14. в мониторе ресурсов - Анализ цепочки ожидания, там пишет "оказался в ситуации взаимоблокировки"
  15. ок, как обработать чтобы не вис?