반응형
  • 티스토리 홈
  • 프로필사진
    묭묭.cpp
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
묭묭.cpp
  • 프로필사진
    묭묭.cpp
    • 분류 전체보기 (103)
      • 데이터베이스 (2)
      • 포트폴리오 (25)
      • 윈도우 인터널즈 (20)
      • 네트워크 (4)
      • IOCP 게임서버 (11)
      • C (2)
      • 디스어셈블리 디버깅 (1)
      • WindowsAPI (11)
      • 학원 강의 정리 모음 (20)
      • 운영체제 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 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++에서 구조체 정렬과 관련하여 문제가 있을 수 있다 언급되어 있으나
            • 지금 내가 사용하는 환경에서는 절대 발생하지 않음
        • 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;
        
        // 모니터링 정보 업데이트 + 출력

        완성된 모습

        test17

        반응형

        '포트폴리오' 카테고리의 다른 글

        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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바