У меня есть веб-приложение, которое должно быть спокойным интерфейсом. Поэтому у меня есть обработчик соединения, который пытается изменить входящий запрос на то, что может использовать gwan.GWAN завершение под нагрузкой
Каждое подключение к этой услуге то же самое, так что я делаю замену на каждом соединении:
#include "gwan.h" // G-WAN exported functions
#include <stdio.h>
int init(int argc, char *argv[]){
u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
*states = 1 << HDL_AFTER_READ; // we assume "GET /hello" sent in one shot
return 0;
}
void clean(int argc, char *argv[]){}
int main(int argc, char *argv[])
{
const long state = (long)argv[0];
if(state == HDL_AFTER_READ) {
xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
xbuf_replfrto(read_xbuf, read_xbuf->ptr, read_xbuf->ptr + 16, "/classify.htm?", "/?boost.cpp&");
}
return 255;
}
Проблема в том, под нагрузкой, через некоторое время, G-WAN падает и дать мне ошибка:
G-WAN 4.3.14 (pid:20477)
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Signal : 6:Abort
Signal src : -6:tkill
errno : 0
Thread : 2
Code Pointer: 7fc5dcd748a5 (module:libc.so.6, function:raise, line:0)
Access Address: 000000004ffd
Registers : EAX=000000000000 CS=00000033 EIP=7fc5dcd748a5 EFLGS=000000000202
EBX=0000006693e8 SS=0000000a ESP=7fc5d5c7bf38 EBP=7fc5880008d8
ECX=ffffffffffffffff DS=0000000a ESI=00000000504e FS=00000033
EDX=000000000006 ES=0000000a EDI=000000004ffd CS=00000033
Module :Function :Line # PgrmCntr(EIP) RetAddress FramePtr(EBP)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Aborted (core dumped)
Проблема только в том, что я поставил сервер под нагрузкой. С одной машиной я набираю около 8000 запросов/сек, и она длится около 5 секунд перед сбоем.
Если я НЕ делать рерайт (двигаться main.c к main.c_) и вызывать сценарий CPP непосредственно, без аварии ...
Помощь! Есть идеи?
Благодаря
Я предлагаю вам переписать * «на месте» *, используя ту же длину для источника и адресата. Это сделает вещи намного быстрее и надежнее, чем игра с перераспределением памяти («Abort» выполняется GLIBC и не обрабатывается обработчиками сигналов). – Gil