근본이 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도 평화롭고, 개발팀도 평화롭고 모두가 평화롭다. 우리의 평화를 지키도록 하자.
* 참고문헌
- 다카나 겐이치로 저, "게임으로 배우는 파이썬"
'프로그래밍 언어 > Python' 카테고리의 다른 글
[Python] cave 게임 소스 코드 분석 (0) | 2023.07.03 |
---|---|
[Python] 기본적인 데이터형과 데이터 구조 (0) | 2023.06.27 |