2011-04-18 4 views
2

현재 일부 메모리 내장 MySQL (HEAP 엔진 사용) 테이블에 액세스하는 C++ (cgicc 확장 사용)로 작성된 Apache CGI 응용 프로그램이 있습니다. 이제는 하루에 처리하는 트랜잭션의 수가 서버의 이러한 요청을 처리하는 데 필요한 쿼리를 처리하는 능력을 초과 한 시점입니다.C++ CGI 용 캐시 된 데이터 구현

성능 향상을 위해 우리가 논의한 다음 단계는 이러한 메모리 내 테이블을 CGI 프로세스에서 "로컬"로 만들고 데이터를 캐싱하기 위해 공유 메모리의 일부 형태를 사용하는 것입니다. Memcached 또는 Membase는 가능한 옵션처럼 보일 수 있지만, 우리가 사용하는 방법은 그 접근 방식과 정확하게 일치하지 않는 것 같습니다 (아니면 구현/연결이 보이지 않을 수도 있습니다).

이상적인 세계에서 우리는 데이터를 공유 메모리 객체에로드하기 위해 일종의 직렬화를 사용할 수 있습니다. 시작시 CGI는 복사본을 얻거나 공유 된 데이터 구조의 복사본을 만들 수있는 주소를 제공하고 "로컬"메모리 내 데이터 구조로 deserialize 한 다음 필요한 모든 비교를 수행합니다 그 물체로부터. 우리는 이것이 우리의 아파치/CGI 아키텍처를 완전히 재 설계하지는 않을 것이지만 대신에 MySQL 메모리 - 인 테이블 (MySQL DB는 같은 서버에 동일 위치에 위치 함)을 질의하는 문제 일뿐입니다. 아파치)를 프로세스에 "보다 지역적인"새로운 메모리 내부 데이터 구조를 사용하는 것으로 바꾸었다.

어떤 통찰력을 가지고있어 주셔서 감사합니다. 많은 이전 스레드는 Memcached/Membase 접근법을 사용하는 것이 좋으며 아마도 이것이 최선의 경로라고 생각하지만, 그것이 합의인지를보고 싶었습니다.

답변

0

boost::multi_index을 사용하여 벤치마킹을위한 테스트 코드를 구현했습니다. 대부분의 메모리 내 데이터베이스 작업을 대체 할 수 있습니다.

이동식 공유 메모리 할당에 사용할 수 있는지 여부는 잘 모르겠지만 64 비트 OS를 사용하는 경우 메모리와 고정 된 지점을 선택하여 충돌없이 공유 공간을 매핑 할 수 있어야합니다. 또 다른 메모리 맵. 이 경우 C++ 할당자를 사용하여 모든 객체 할당을 공유 공간에서 가져오고 포인터는 각 프로세스에서 동일한 값을 갖도록 마법을 쓸 수 있습니다.

공유 맵을 사용하면 pthread_rwlock을 공유 메모리 공간에 두어 보호 할 수 있습니다. 공유 블록의 시작 부분에 공유 메모리에 대한 정보가 들어있는 구조체를 배치하고 싶습니다. 구조체는 액세스 잠금, 할당 자용 빈 공간 포인터 및 아마도 버전 식별자를 가지므로 (동시에 새로운 코드 나 오래된 코드를 사용하여 액세스하려고하지 마십시오).

+0

저는 BerkeleyDB와 같이 지루한 사전 작성 라이브러리를 사용할 수도 있다고 가정합니다. –