LFH (Low Fragmentation Heap)
쓸만한 메모리풀 라이브러리를 찾다가 LFH(Low Fragmentation Heap)라는 것을 발견했다.
일단 GPG에서 거의 최초로 글을 올린 신 ascalon님의 블로그와 위키에 보면 기본적인 설명이 되어있다.
그런데 재미있는 것이 메모리풀이 아닌 메모리관리자를 변경하므로써 멀티-쓰레드 환경에서 성능이 휠씬 올라간다고 한다.
거기다가 적용방법도 매~~우 쉽다.
처음에는 아니 메모리풀링도 아니고, 계속 할당하고 해제할 것인데 어떻게 성능이 더 좋아지냐는 의문이 생겼다.
그 의문을 ascalon님은 lock-free알고리즘이 들어가서 많은 Thread가 사용되면 될수록 성능이 더 좋아진다고 하셨다. 물론 이것에 대해 GPG에서도 많은 논쟁이 오갔다. lock-free라는 것은 환상이라고 하는 주장부터 이제 1코어의 성능은 올라가지 않고, 멀티 코어시대가 열리므로 마소에서 거기에 대한 준비했다는 주장까지...솔직히 아직 정확하게 이해가 되지는 않는다.
그래서 일단 ascalon님 위키의 예제를 컴파일 후 실행했을 때는 확실히 LFH가 성능이 더 좋게 나왔다.
그래서 현재 사용 중인 서버에서는 성능이 어떻게 나오는지 테스트를 해보았다. 아무런 풀링을 사용 안 하였을 때와 메모리풀링 라이브러리 중 가장 유명한 Hoard, 그리고 LFH를 각각 적용하여 현재 사용 중인 서버를 2대 켠 뒤에 한 쪽에서 패킷을 쏘면, 다른 쪽에서 수신 후 다시 그대로 쏘는 테스트를 했다. 테스트는 크기가 128K인 패킷을 100000번 전송하는 테스트와 크기가 2048K인 패킷을 10000번 전송하는 테스트를 했다.
전송과정은 main thread -> send thread -> iocp thread ->>> network ->>> iocp thread -> recv thread -> main thread -> 에서 다시 send 후 recv하면 끝
정확한 테스트 결과는 바탕화면에 저장해두었다가 실수로 지워버려서;;; 올릴수가 없고..ㅡ.ㅜ
대략적인 결과로는 'LFH(0.3) > Hoard(0.2) > Nothing(0.0)'정도 순으로 성능 테스트결과가 나왔다.
일단 결과는 LFH가 제일 빠르게 나왔다. 그래서 현재 개발 중인 서버에 적용해 보았다.
앞으로 스트레스 테스트를 해보면서 좀 더 지켜보고, 최종결정을 해야겠다.
그런데 몇 가지 의문점은 남아있다. 일단 MSDN에 있는 예제대로 하면 적용되지 않는다.ㅡㅡ;
아래와 같이 코딩해야 제대로 적용이 된다.;;;
그리고 하나의 프로세스가 하나의 힙이 아닌 다수의 힙을 사용한다?
(참고 URL : tech-archive.net, pavlov.net - 정확하게 이해가 안된다. 영어공부 좀 해야겠다...ㅡㅡ;)
거기다가 항상 1개는 HeapSetInformation이 실패한다. 이유는 해당 힙은 HEAP_NO_SERIALIZE flag가 세팅되어서 란다. 그렇다면 왜 1개는 HEAP_NO_SERIALIZE가 세팅되어 있을까?
HANDLE heaps[1025];
DWORD nheaps = GetProcessHeaps(1024, heaps);
for (DWORD i = 0; i < nheaps; i++)
{
ULONG HeapFragValue = 2;
HeapSetInformation(heaps[i],
HeapCompatibilityInformation,
&HeapFragValue,
sizeof(HeapFragValue));
}
이런 의문을 다 해결된 뒤에야 좀 더 안심하고 적용할 수 있을 것 같다.
어쨌든 의문만 풀린다면, 앞으로 계속 CPU 갯수는 늘어날 것이고, 프로그램도 거기에 맞추어서 개발해야 되니깐,
유용하게 사용할 수 있을 것 같다.
관련 URL :
ascalon님 : http://www.devnote.net/24, http://devnote.net/wiki/index.php/Windows_Heap_Memory
hoard : http://www.hoard.org/
MSDN : http://msdn.microsoft.com/en-us/library/aa366705(VS.85).aspx
tech-archive.net : http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2008-02/msg00529.html
pavlov.net : http://blog.pavlov.net/2007/11/11/windows-low-fragmentation-heap/