Реализация кэшированных данных для C ++ CGI - PullRequest
2 голосов
/ 19 апреля 2011

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

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

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

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

1 Ответ

0 голосов
/ 20 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...