2010-12-08 3 views
1

현재 프로세스간에 데이터를 공유하기 위해 큰 mmap 파일을 사용하는 Apache 모듈에서 작업 중입니다. 이것은 시작시 생성되고 서버가 종료 될 때 제거됩니다 (나중에 유지하도록 선택할 수도 있음). 아파치 APR 라이브러리를 사용하여 이것을 구현했으며, 적어도 작은 파일에는 잘 작동한다.아파치 모듈에서 메모리 맵핑 된 파일의 과도한 동기화

그러나 메모리 매핑 된 파일의 크기가 커지면 (서버가 실행 중일 때 메모리를 캐시하기에 충분한 RAM이 여전히 있음) 운영 체제처럼 보이는 시스템이 가상으로 중단됩니다 (필자의 경우 Linux) 파일을 디스크와 동기화하는 데 많은 자원을 소비합니다. 이 동기화를 제어/축소 할 수있는 방법이 있습니까?

지금은 디스크에 동기화 된 내용이 필요하지 않기 때문에 아마도 대신 공유 메모리 세그먼트를 사용해야하고이를 대신 시도해야합니다. 그러나 나는 여전히 메모리 매핑 된 파일의 동기화를 제어하는 ​​방법에 관심이있다.

답변

2

매핑 된 파일에 쓰기가 더러운 페이지 - 어느 시점에서 백업 저장소 (이 경우 디스크상의 파일)에 기록되어야하는 메모리 페이지가 생성됩니다.

더티 페이지의 쓰기는 /proc/sys/vm/의 일부 노브로 조정할 수 있습니다. 특히 맵핑 된 파일의 더티 데이터 양이 일반적으로 전체 시스템 메모리와 비교하여 큰 경우 dirty_ratio을 크게 (예 : 60)로, dirty_background_ratio을 조금 (예 : 30)으로 늘릴 수 있습니다.

dirty_expire_centisecs을 늘릴 수도 있지만 기본값은 이미 상당히 길어 (5 분) (더티 데이터가 도달해야만 쓰기 작업을 할 수있는 나이입니다).

공유 메모리로 전환하는 것은 에 맵핑 된 파일을 작성하는 것일뿐입니다. 배포본에 tmpfs이라는 마운트가 있다고 가정합니다.

0

메모리 매핑 된 파일은 명시 적으로 msync()과 동기화되지만, 운영 체제는 페이지 오류 발생시 메모리 내용을 플러시 할 수 있습니다. 따라서 찾을 것이 몇 가지가 있습니다 :

  1. 아파치 APR 라이브러리의 소스 코드는 msync()입니까?
  2. 응용 프로그램이 메모리에서 점프하고 있습니까? 예, 비 sequintial 메모리에 액세스하고 있습니까? 이는 부적절한 데이터 구조 나 중첩 루프 인덱스가 다차원 배열 인덱스와 일치하지 않는 경우에 자주 발생합니다.

코드를 프로파일 링하여 예기치 않은 페이지 폴트를 초래하는 비효율적 인 부분이 있는지 확인할 수 있습니다.

+0

APR 라이브러리는 메모리 매핑 파일 생성을 처리하고 msync() 호출을 포함하지 않습니다. 내 코드에서 msync()를 호출하지 않습니다. 그러나 파일에 캐시 된 데이터가 포함되어 있기 때문에 내 코드는 메모리에서 상당히 뛰어 넘습니다. – Chris

+0

Varnish 웹 캐시에 대한 아키텍처 노트를 읽어야합니다. 이 논문은 메모리 매핑을 효율적으로 처리하는 방법을 보여줍니다. – chrisaycock

관련 문제