- Select 모델 서버 프로젝트 08 - 모니터링 스레드2024년 10월 30일
- 묭묭.cpp
- 작성자
- 2024.10.30.:36
Select 모델 서버 프로젝트 08 - 모니터링 스레드
모니터링 필요한 것
CPU 사용률
- Processor 사용률
- 토탈
- 유저
- 커널
- Process 사용률
- 토탈
- 유저
- 커널
메모리 사용량
서버 정보
- 현재 서버 접속자 수
- 세션 객체 생성 수
- 플레이어 객체 생성 수
- 서버 Frame
- 게임 로직 FPS
- 네트워크 루프 수
- TPS
- Accept
- Recv
- Send
CMonitor 클래스
class CMonitor { public: CMonitor(HANDLE hProcess = INVALID_HANDLE_VALUE); void Update(INT sessionCount, INT playerCount); void UpdateCpuTime(); void UpdateServer(); void MonitoringConsole(INT sessionCount, INT playerCount); void MonitoringFile(INT sessionCount, INT playerCount); public: // CPU 모니터링 정보 HANDLE m_hProcess; INT m_iNumberOfProcessors; FLOAT m_fProcessorTotal = 0; FLOAT m_fProcessorUser = 0; FLOAT m_fProcessorKernel = 0; FLOAT m_fProcessTotal = 0; FLOAT m_fProcessUser = 0; FLOAT m_fProcessKernel = 0; ULARGE_INTEGER m_ftProcessor_LastKernel; ULARGE_INTEGER m_ftProcessor_LastUser; ULARGE_INTEGER m_ftProcessor_LastIdle; ULARGE_INTEGER m_ftProcess_LastKernel; ULARGE_INTEGER m_ftProcess_LastUser; ULARGE_INTEGER m_ftProcess_LastTime; // 메모리 사용량 모니터링 정보 PROCESS_MEMORY_COUNTERS_EX m_stPmc; // Server 모니터링 정보 DWORD m_dwTime = 0; LONG m_lLoopCount = 0; LONG m_lFPS = 0; LONG m_lAcceptTPS = 0; LONG m_lRecvTPS = 0; LONG m_lSendTPS = 0; };
CMonitor::UpdateCpuTime
- CPU 정보를 갱신하는 함수
프로세서 사용률 계산
- ULARGE_INTEGER를 사용
- 본래 FILETIME 구조체를 사용하지만 구조가 같기 때문에 그냥 이걸 사용
- windows via c++에서 구조체 정렬과 관련하여 문제가 있을 수 있다 언급되어 있으나
- 지금 내가 사용하는 환경에서는 절대 발생하지 않음
- 본래 FILETIME 구조체를 사용하지만 구조가 같기 때문에 그냥 이걸 사용
- GetSystemTimes 함수를 통해 idle, kernel, user의 시스템 사용 시간을 구함
- 그리고 기존 사용 시간을 빼서 현재까지의 사용 시간을 구함
- 토탈은 kernel과 user를 더한 값을 사용
- 그리고 이것을 백분율로 바꿔줌
- total = (total - idleDiff) / total * 100
- user = userDiff / total * 100
- kernel = (kernelDiff - idleDiff) / total * 100
- 커널 시간에는 idle 시간이 포함되어 있음
- 이전 수행 시간을 갱신함
프로세스 사용률 계산
- 일단 FILETIME을 구함 - GeySystemTimeAsFileTime
- 여기서도 ULARGE_INTEGER 구조체를 사용
- GetProcessTimes를 통해 프로세스가 사용한 시간을 구함
- 두, 세번째 매개변수는 실행, 종료 시간이므로 구하지 않음
- 프로세서 시간을 구할 때와 동일한 방법으로 구함
CMonitor::UpdateMemory
- 메모리 사용량을 1초에 한번씩 갱신
- GetProcessMemoryInfo를 사용
CMonitor::UpdateServer
- interlocked 계열 함수로
- TPS를 초기화
- 필요한 부분에 interlockedIncrement를 통해 적절한 멤버를 증가시킴
- Accept의 끝부분
- Recv의 끝부분
- Send의 끝부분
- 등등
모니터링 루프
처음 설계는 1초에 한번씩 Update를 호출
- 정말 바쁘게 돔
- 굉장히 비효율적이지 않는가?
그래서 1초에 1번 깨어나게 스레드를 설계함
- 그런데 약간 Sleep의 오차가 있을 수 있으므로
- 1000에서 현재시간과 이전시간을 뺀만큼 Sleep을 걸고
- 이전시간은 정수로 그냥 1000을 더해줌
DWORD dTime = timeGetTime() - mTime; if (dTime < 1000) Sleep(1000 - dTime); mTime += 1000; // 모니터링 정보 업데이트 + 출력
완성된 모습
반응형'포트폴리오' 카테고리의 다른 글
Select 모델 서버 프로젝트 10 - 동적할당 오브젝트 풀로 교체 (0) 2024.11.01 Select 모델 서버 프로젝트 09 - 서버 루프가 갑자기 0으로 꺼지는 현상 해결 (0) 2024.10.30 Select 모델 서버 프로젝트 07 - 게임 콘텐츠 구현(공격) (0) 2024.10.29 Select 모델 서버 프로젝트 06 - 게임 콘텐츠 구현(이동) (0) 2024.10.29 Select 모델 서버 프로젝트 05 - 메시지(패킷) 자동화 (0) 2024.10.28 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)