Memory Leak Detection Tools
from RakNet forum
from RakNet forum
오블리비언을 하면서 감동받았거나 놀라웠던 장면들, 재미있는 퀘스트들을 모아봤다. (단, 이 옆 장면과 요 장면은 본인이 연출한게 아니다. XBOX360은 캡처 불가라는 점을 이해 바람.)
Atronach
연휴동안 Breton 여자 마법사를 키우고 있다. 마나 재생이 없는 대신 +150 마나 보너스, 마법 흡수 50%의 별자리인 Atronach 를 선택했기 때문에, 어떻게든 물약빨로 마나를 대신해야 하는 상황이다. 결국 모든 마법사 길드를 돌면서 책과 연금술 도구, 심지어는 은수저와 은그릇까지 주워다가 팔아서 물약값을 벌어야 했다. 또한 연금술을 빨리 올려야만 물약 자체 조달이 가능하기 때문에, 상점에 있는 모든 시약들도다 사거나 훔쳐서 물약으로 만들어서 돈을 긁어모으고 있다. 하루 빨리 이 헝그리한 삶에서 벗어나야 할텐데..
Gang of Anvil
대륙 남서쪽의 Anvil 에 가면 술집에서 남자를 꼬셔서 자기 집에 데리고 간 다음 귀중품을 강탈하는 여자 갱단이 있다. 매번 남자 (오크-_-)로 플레이 할때에는 술집에서 작업 들어오면 집까지 가서 본색을 드러낼 때 처치해야 했는데, 과연 여자 캐릭터로 하면 어떤 스토리가 나올지 궁금했다.
아니나 다를까, 술집에 가자마자 그뇬들이 다가와서 하는 말이 일품이었다. "우리 갱단에 들어와서 용돈이나 벌어라.. 괜히 가드들한테 일러바치면 죽는줄 알아라.. 대신 남자들이 털끝 하나라도 못건드리게 해주겠다"
사슴과 사냥꾼
들판을 헤매다 보면 사슴들이 플레이어를 보고 놀라서 도망가는 장면을 쉽게 볼 수 있는데, 가끔은 그 사슴을 활을 쏘며 추격하는 사냥꾼도 볼 수 있다. 사슴 고기는 생명력을 올려주는 연금재료이므로 필히 잡아야 하지만, 활이 아니면 꽤 잡기가 힘들다.
움브라(Umbra)
임페리얼 시티의 7시 방향에 엘프 유적에는 에보니 풀셋 갑옷과 움브라 소드를 지닌 움브라(Umbra)라는 유명한 여자가 살고 있다. 이것은 Nine Divines의 신들이 주는 퀘스트 중 하나인데 낮은 레벨로 시도했다가는 한 두 방에 죽어 버릴 정도로 어려운 퀘스트이다. 그런데 AI의 맹점을 이용한 공략법이 이것 저것 나와 있는데, 다들 너무 재미있어서 소개해본다.
Unfriendly Competition
수도인 임페리얼 시티의 상인들은 덤핑 판매로 골치를 썩이는 Thoronir 가 도대체 어디서 그런 값싼(?) 아이템들을 구해 오는지 알아와 달라고 한다. 폐점 시간인 8-9시까지 기다리면, Thoronir가 가게를 떠나 여관에 가서 한 시간 정도 쉴새없이 술을 마신 다음, 수도의 여기 저기를 서성이다가 동네 뒷골목에서 Agarmir라는 남자와 밀담을 나누는 것을 발견할 수 있다. 그 다음엔 이 남자의 집을 조사하게 되는데 집 안에는 온갖 뼈와 해골, 시체 부스러기와 삽, 그리고 언제 누가 죽었는지를 기록한 책을 발견할 수 있다. 이걸 갖고 Thoronir에게 가서 따지면 잘못을 빌면서 제발 더이상의 도굴을 막아달라고 부탁하게 되는 그런 퀘스트이다.
끝 무렵에는 Agarmir가 타락한 경비병과 함께 무덤에서 매복해 기다리는데, 보통은 플레이어에게 다가와서 "기다렸다. 죽어라!"라고 한 후 전투가 시작된다. 그런데, 새로 키우는(-_-) 우드엘프 도적으로 들어가자마자 sneak 해서 가드와 도굴꾼을 죽인 적이 있었는데, 정당 방어가 아닌 살인으로 카운트가 되어 버렸다. 문제는 아이템을 뒤지고 있는데 갑자기 또다른 경비병이 무덤 안으로 뛰어 들어와서 시체를 검시하고는 벌금 80골을 뜯어가 버렸다는 사실. 1000골드 날리는 줄 알고 쫄아 있었는데, 과연 죄목이 무엇이었는지 궁금하다. (아마도 아침을 기다리기 싫어서 NPC 상점의 문을 따고 들어가다가 걸린 것일지도...)
The Elven Maiden
도둑 길드에 가입해서 받는 두 번째 퀘스트는 성당 지하에서 작은 반신상을 훔쳐오는 것이다. 경비병이 왔다 갔다 하는 와중에 몰래 훔쳐오면 되는 간단한 퀘스트인데 성사금을 받으려고 다시 수도로 돌아와보니 난리가 나버렸다. 사실 바로 직전의 퀘스트가 Hieronymus Lex라는 경비대장의 방에 숨어 들어가 수도의 재개발지구(?)에 사는 거지들과 가난한 자들에게 뺏어간 세금과 인명부를 훔쳐오는 것이었는데, Lex가 열받아서 비상을 선포한 것이었다. 평소에는 점잖게 걸어다니던 경비병들이 계속 여기 저기 뛰어다니질 않나, 나를 보면 그넘 어디갔냐고 묻질 않나... 그러다가 또다른 길드원이 찾아와서 길드에 Lex가 심어둔 스파이가 있으니 훔쳐온 반신상을 스파이 집에다가 숨긴 다음 Lex에게 알려주라고 하는데, 결국은 Lex 가 스파이를 연행해 가는 것으로 끝나게 된다.
과연 AI가 어디까지 구현되어 있나 싶어서 Lex를 끝까지 따라가봤는데, 예상대로 Warterfront 에서 감옥까지 맵을 4개나 넘어서까지 연행해가는 것이 아닌가? 그러나, 감옥 안에 도착하니 감옥 문과 감방문이 모두 잠겨 있어서 최종 수감 장면은 볼 수가 없었다. 간수에게 이야기해서 감옥 문은 친절하게 열었지만 감방 문을 여는 프로시저는 없는 듯했다. :P
갓 만들어진 서버 프레임워크의 성능을 제대로 테스트하기란 쉽지 않다. 대체로 (서비스 예정인) 표준 하드웨어 사양 하에서 가상 클라이언트를 1000-2000 개 정도 붙이고 적절한 트래픽을 주었을 때 반응 속도라든지 CPU 점유율, 메모리 사용량 등을 측정하는 것이 일반적인데, 문제는 서버 프레임워크에서 채택한 내부 구조에 따라서, 특히 동기화, 쓰레드 같은 민감한 요소들에 따라 결과가 천차만별이 된다는 것이다.
예를 들면 이런 구조에서는 트래픽이 늘어날수록 CPU 사용량이 폭주할 수도 있고, 저런 구조에서는 접속자가 늘어날수록 반응속도가 느려질 수도 있다는 것인데, 이번 마이그레이션에서도 비슷한 현상을 경험했다. 사실 어제 아침까지만 해도 테스트 결과가 좋아서 안심하고 있었는데, 혹시나 해서 트래픽을 2배로 늘린 후 성능 모니터링을 해보니 CPU 점유율이 130%까지 급증하는게 아닌가... 반면 예전에 만들어둔 코드는 동일 조건에서도 CPU 점유율은 40%를 넘지 않았다. 흑흑.
오늘 Visual Studio .NET 2005 에 내장된 프로파일러로 을사오적(?)들을 찾아내서 모두 제거하고, 최종적으로 6배 트래픽으로 테스트한 결과 debug에서는 120%, release에서는 150% 정도 빨라진 놈을 완성할 수 있었다. 아직 idle 체크를 위한 타이머 처리라든지, 메시지 핸들러 같은 구태의연한 작업이 남아있긴 하지만, 웬지 성공적으로 끝이 날 것 같다는 희망에 차 있는 상태다. :)
아무튼 이번 삽질을 통해, 가상 클라이언트를 이용한 서버 프레임워크의 테스트 방법론에 대해서 좀 더 체계화를 해야 할 필요성을 느꼈다. 이번 주에 한 일이라고는 고작, 2개의 머신에서 파라미터를 적절히 바꿔가면서 서버와 클라이언트를 수동으로 실행하고, 성능 모니터링 도구를 이용해서 CPU 및 메모리 사용량을 눈으로 살펴보고, 최종적으로 클라이언트측에 남겨진 통계 로그 파일을 위키 페이지로 복사한 후, 성능의 변동을 살펴보는 단순 작업들을 반복해왔기 때문이다. 물론 밀린 일정 덕에 자동화에 투자할 시간은 더이상 없겠지만 대략 다음과 같은 테스트 프레임워크를 구성해 볼 기회가 있었으면 좋겠다.
준비물
테스트 도구 디자인
유닛 테스트의 개념과 형식을 빌어오면 좋을 듯하다.
테스트 리포트
(내부 구조, 클라이언트 개수, 트래픽)에 따른 (반응 속도, CPU 점유율, 메모리 사용량)의 변화를 한눈에 알아볼 수 있어야 한다.
테스트 개요
테스트 아이디
클라이언트 환경
서버/클라이언트 성능 카운터 및 통계 데이터
CPU 통계
웬지 마이크로소프트나 ant 같은 것들이 이런 기능을 제공할 법도 한데 말이다. 혹시나 비슷한 기능을 가진 도구를 아시는 분은 꼭 코멘트 부탁드린다.
First Class Object | Second Class Object | Third Class Object | |
---|---|---|---|
함수처럼 호출될 수 있는가? | Yes | Yes | Yes |
파라미터로 넘겨질 수 있는가? | Yes | Yes | No |
함수의 리턴값으로 사용될 수 있는가? | Yes | No | No |
변수에 대입될 수 있는가? | Yes | No | No |
Local Packets
로컬 어플리케이션 간의 TCP/IP 패킷 전송은 캡처되지 않는다. 뭔가 내가 모르는게 있는걸까?
Conversation
특정 어플리케이션에 대해서 패킷 캡처를 하고 나면, 캡처 하는 동안 발생했던 다른 쓸모없는 패킷들까지도 뒤섞여 있기 때문에, 이를 잘 필터링해야 한다. 물론 Display Filter 를 써서 수동으로 하나씩 필터링하는 방법도 있지만, Statistics - Conversation 메뉴를 통해서 그동안 전송된 패킷들을 프로토콜별로 분류해 놓은 표를 통해서 필터링하는 방법도 있다.
이 표를 보면 프로토콜별/주소별 패킷 분류가 되어 있으며, 각 분류마다 전송 횟수가 표시되어 있으므로 원하는 프로토콜과 주소지를 잘 선택하면 끝.