Реализация кэшированных данных для C CGI

#c #cgi

#c #cgi

Вопрос:

У нас есть CGI-приложение Apache, написанное на C (с использованием расширений cgicc), которое в настоящее время обращается к некоторым таблицам MySQL в памяти (с использованием HEAP engine). Сейчас мы подошли к тому моменту, когда огромное количество транзакций, которые мы обрабатываем в день, превысило способность сервера обслуживать запросы, необходимые для обслуживания этих запросов.

Наш следующий шаг, который мы обсуждали для повышения производительности, заключался в том, чтобы сделать эти таблицы в памяти более «локальными» для процесса CGI и использовать некоторую форму общей памяти для кэширования данных. Memcached или Membase кажутся возможными вариантами, хотя то, для чего мы бы их использовали, похоже, не совсем согласуется с этим подходом (или, может быть, так и есть, и я просто не вижу реализации / подключения).

В идеальном мире мы могли бы использовать некоторую форму сериализации для загрузки данных в объект общей памяти. При запуске CGI получил бы копию или ему был бы предоставлен адрес, с которого он мог бы сделать копию для себя совместно используемой структуры данных, десериализовать ее в «локальную» структуру данных в памяти, а затем выполнить любые сравнения, которые ему необходимо выполнить с этим объектом. Мы действительно надеемся, что для этого не потребуется полная перестройка нашей архитектуры Apache / CGI, а вместо этого может быть просто вопросом замены запросов к таблицам MySQL в памяти (база данных MySQL расположена на одном сервере с Apache) на использование новых структур данных в памяти, которые являются «более локальными» для процесса.

Спасибо за любую информацию, которая у кого-либо может быть по этому поводу, и за то, что они видели сделанным. Многие предыдущие темы предлагали использовать Memcached / Membase подход, и, возможно, это лучший маршрут, но просто хотелось посмотреть, является ли это консенсусом.

Ответ №1:

Я бы реализовал некоторый тестовый код для целей сравнительного анализа, используя boost::multi_index . Это довольно хорошая замена для большинства операций с базой данных в памяти.

Я не знаю, можете ли вы использовать это при перемещаемом распределении общей памяти, но если вы используете 64-разрядную ОС, должна быть возможность выбрать фиксированную точку в памяти для отображения вашего общего пространства, не конфликтуя с другой картой памяти. В этом случае вы можете сотворить некоторое волшебство с распределителями C , чтобы все ваши выделения объектов происходили из общего пространства, а указатели будут иметь одинаковые значения в каждом процессе.

Используя общую карту, вы можете защитить ее, поместив pthread_rwlock в пространство общей памяти. Мне нравится размещать структуру, содержащую информацию об общей памяти, в начале общего блока. Структура будет иметь блокировку доступа, указатели на свободное пространство для распределителя и, возможно, идентификатор версии (чтобы вы не пытались получить к ней доступ, используя новый или старый код одновременно).

Комментарии:

1. Я полагаю, вы могли бы также использовать скучную предварительно написанную библиотеку, такую как BerkeleyDB.