Apache isn't the fastest or maximally customizable web server, its popularity comes from the fact that it provides a very good balance of these things bundled with maximum portability and reliability.
Вы не зашли.
Некорректно я поставил вопрос.
Немного разобрался в проблеме, читайте следующий комментарий.
Интересную картину наблюдаю при работе с переменными, время жизни которых не ограничивается одним request или connection циклом.
Пробовал разные способы выделения динамической переменной через apr_palloc (c apr_pool_userdata_set и без) и в пул модуля, и в главный пул сервера, и с использованием мутекса, да даже просто через malloc в памяти, не связывая ни как с пулом соответственно. Как бы не пробовал - переменные живут только небольшое время. Если обращений к серверу нет ~минуту то ссылка обязательно обнуляется в любом случае. Хотя пул не пропадает вроде.
Подскажите пожалуйста какая логика работы сервера? Почему выделенная память пропадает даже из глобального пула после некоторого времени застоя?
static int test_handler(request_rec *r)
{
int *bb;
void *dd = NULL;
if (apr_pool_userdata_get (&dd, "my:data", r->server->process->pool) != APR_SUCCESS ) {
jdc_echo_debug("data get bad");
} else {
jdc_echo_debug("data get ok");
bb = (int*)dd;
}
if (dd == NULL) {
echo_debug("dd == NULL");
bb = (int*) apr_palloc (jdc_pglobal, sizeof (int));
*bb = 17;
dd = (void*)bb;
apr_pool_userdata_set (dd, "my:data", NULL, r->server->process->pool);
} else {
*bb += 1;
dd = (void*)bb;
}
echo_debug("bb = ");
echo_debug_simple_i(*bb);
r->content_type = "plain/text";
ap_rputs("OK", r);
echo_debug("All OK");
return OK;
}Вот вывод:
DEBUG [16:49:55] : data get ok
DEBUG [16:49:55] : dd == NULL
DEBUG [16:49:55] : bb = 17
DEBUG [16:49:55] : All OK
DEBUG [16:50:00] : data get ok
DEBUG [16:50:00] : bb = 18
DEBUG [16:50:00] : All OK
DEBUG [16:50:04] : data get ok
DEBUG [16:50:04] : bb = 19
DEBUG [16:50:04] : All OK
DEBUG [16:51:30] : data get ok
DEBUG [16:51:30] : dd == NULL
DEBUG [16:51:30] : bb = 17
DEBUG [16:51:30] : All OK
Отредактированно PM85 (2008-04-14 08:23:05)
Неактивен
Интересное наблюдение сделал. Выделял большие объёмы памяти и смотрел процессы по используемым ресурсам.
Выделенная память действительно НЕ пропадает на протяжении всего времени жизни сервера, но через минуту apr_pool_userdata_get уже данных получить не может, потому что запрос обрабатывает уже другой поток сервера.
Значит нужно только как-то определять область памяти доступную всем потокам.
http://httpd.apache.org/docs/2.0/develo … afety.html - здесь написано что необходимо использовать функции apr_atomic_* и apr_thread_mutex_*. Так же нашёл группу функций apr_shm_*, но не могу понять чем и как пользоваться, чтобы выделить раздяемую потоками память.
Отредактированно PM85 (2008-04-14 08:20:58)
Неактивен
тебе Нужна общая память для всех модулей или только для одного!?
Если общая память для одного модуля то выделяй ее в
функциях создания и слияния;
module my_module = {
STANDARD20_MODULE_STUFF,
my_create_dir_conf, /* Создание конфигурации каталога */
my_merge_dir_conf, /* Слияние конфигураций каталогов */
my_create_svr_conf, /* Создание конфигурации сервера */
my_merge_svr_conf, /* Слияние конфигураций серверов */
my_cmds, /* Директивы конфигурации */
my_hooks
};
а вот если глобально видели все модули
то в структуре /2006/06/10/strukturyi-dannyih-apache-request_rec/ есть переменная apr_table_t *notes; через нее можно передавать
Неактивен
Память нужна для динамической работы. Не уверен, что после выделения её под конфиг она не копируется в область памяти каждого процесса сервера. В любом случае это не совсем кошерный метод.
Решил выделять ресурсы в каждом процессе отдельно. Небольшие потери ресурсов, зато конкретная стабильность.
Неактивен