C언어
로컬 프로그램 멀티 쓰레드
고요한하늘...
2013. 8. 8. 14:06
한대의 서버에서 아주 잘 동작하는 프로그램이 있다.
지금도 잘 동작하고 있지만
파일을 크기가 커지면 아무리 좋은 프로그램이라도 선형적으로 처리시간이 늘어난다.
서버사양도 좋아지고 멀티 코어가 일반화 되었기 때문에
최대한 코어를 사용해서 선형적으로 늘어나는 시간각을 줄이기 위해서
기존의 프로그램을 multi thread로 변경하는 테스트를 했다.
첫번째 난관
멀티 thread에서 출력결과를 stdout으로 하고 하나의 파일에 썼더니
파일이 깨졌다. write operation이 atomic 하지 않는것 같다.
mutex를 사용할수도 있고 flockfile을 사용할수도 있는데 이런 기능들을 성능에 도움이 되지 않는다.
thread safe한 queue를 사용해서
하나의 single thread에서
각 thread에서 처리해야할 문자열을 넣어주고
각 thread를 자신의 queue에 들어온 문자열을 처리하는 방식으로 변경했다.
싱글 프로세스로 했을때 58초
그런데 쓰레드의 개수에 상관없이 2분정도의 시간이 걸린다.
쓰레드를 사용함으로해서 단순히 line oriented로 읽기만 하면 되는 로직이
복잡해지면서 overhead가 생긴것 같다.
쓰레드를 생성하고, 처리할 내용을 쓰레드에 분리하여 넣고 하는 overhead를 실제 처리시간 단축으로 만회해야 하는데
이걸 만회하기에 800 M 파일은 너무 작은것일수도 있다. 그래서 10G 정도의 파일로 다시 테스트를 해보았다.