본문 바로가기
프로그래밍 언어/Python

[Python] 어쩌면 FPS가 부하를 일으켰을 수도 있다.

by 연습장이 2023. 6. 22.
728x90
반응형

  근본이 DBA다 보니 DBMS의 CPU, MEMORY, STORAGE 관련 지표들에 민감한 편이다. 민감한 만큼 그 지표들이 평온한 호수의 잔잔한 수면을 유지하길 바란다.

 

  하지만 현재 파이썬을 배우다가 fps 관련 코드를 접하게 되었고 "어쩌면 이 부분이 DBMS의 부하에 대한 트러블 슈팅을 하는데 인사이트를 줄 수도 있겠다" 싶은 생각이 문득 들었다.

 

  FPS에 대해 먼저 간략하게 소개하고 진행하겠다.

 

 초당 프레임 레이트로 윈도(혹은 화면)가 처리되는 주기

 

위 내용에서 처리란 무엇일까? 윈도(혹은 화면)에 일어나는 이벤트들이다. 이벤트라 함은? 아래와 같은 예시를 들 수 있다.

 

  • 마우스 오른쪽 버튼을 클릭하였다.
  • 우측 방향키를 누르고 있는다.
  • ESC키를 누른다.
  • 윈도 창의 나가기버튼(X 버튼)을 누른다.

  이러한 이벤트들을 1초에 몇 번의 주기로 처리할 것인지를 나타내는 간격이라 볼 수 있다. 이미 대한민국 남자들은 한번 쯤 접해봤을 단어이긴 하다. 어디서? 바로

 

서x어택, 카운x스트라이크

 

등이다. FPS가 60에서 수치가 약간씩 바뀌는 것을 기억해내길 바란다. 이 수치가 바로 그 수치다. 그렇다면 이제 본론으로 들어가자.

 

  FPS가 DBMS의 부하와 무슨 관련이 있는걸까? DBMS 외부에서(그것이 WAS든 WEB이든) 원하는 정보를 CRUD하기 위해 DBMS 내부에 call을 할 것이다. 이 때, 1초에 100번을 요청한다면 어떨까? DBMS가 별 반응하지 않을 수 있다. 만약 1초에 1,000번이라면? 만 번이라면? 혹은 한번의 call이 재귀적인 성향을 가지고 있다면? 혹은 하나의 화면을 통으로 담아내는 복잡한 로직을 포함하고 있다면? DBMS 입장에서는 "제발 그만둬.. 이러다 다 죽어..." 할 것이다.

 

  이제 실제 코드로 테스트를 해보자. 아래는 평온한 수면을 그리는 내 로컬 PC의 CPU 지표 그래프다.

 

다음으로 FPS를 별도로 설정하지 않은 체로 아래와 같은 코드를 실행했을 때 CPU 지표 그래프다.

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 22 22:15:08 2023

@author: june
"""

""" fps_test1.py """
import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))

def main():
    """ main routine """
    sysfont = pygame.font.SysFont(None, 36)
    counter = 0
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        
        counter += 1
        SURFACE.fill((0, 0, 0))
        count_image = sysfont.render("count is {}".format(counter), True, (225, 225, 225))
        SURFACE.blit(count_image, (50, 50))
        pygame.display.update()
        
if __name__ == '__main__':
    main()

 

갑자기 잔잔한 호수에 파문을 넘어 파도가 치기 시작했다. 다음으로 FPS를 10으로 주었다. 1초에 10번 갱신한다는 의미다.

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 22 22:19:27 2023

@author: june
"""

""" fps_test2.py """
import sys
import pygame
from pygame.locals import QUIT

pygame.init()
SURFACE = pygame.display.set_mode((400, 300))

# FPS 시간값을 가져와 변수에 넣는다.
FPSCLOCK = pygame.time.Clock()

def main():
    """ main routine """
    sysfont = pygame.font.SysFont(None, 36)
    counter = 0
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
                
        counter += 1
        SURFACE.fill((0, 0, 0))
        count_image = sysfont.render("count is {}".format(counter), True, (225, 225, 225))
        SURFACE.blit(count_image, (50, 50))
        pygame.display.update()
        
        # 1초에 10번 갱신되도록 한다.
        FPSCLOCK.tick(10)
        
if __name__ == '__main__':
    main()

CPU 수치가 많이 안정화되면서 낮은 그래프를 보여주고 있다. 코드 자체는 별거 아니지만, 원리는 꽤 심오하다고 생각한다. DBMS에 call을 몇번 하는가? 이 부분은 array processing이라던가 one sql 등과도 관련이 있다. 

 

DBMS가 평화로우면 DBA도 평화롭고, 개발팀도 평화롭고 모두가 평화롭다. 우리의 평화를 지키도록 하자.

 

* 참고문헌

- 다카나 겐이치로 저, "게임으로 배우는 파이썬"

728x90
반응형