본문 바로가기

Project/Hello-World (Language Exchange)

(10)
배포 서버를 대상으로 한 성능테스트 및 성능개선 (4) - 문제의 진짜 원인을 찾아서 (feat. 슬로우 쿼리 & BCrypt) 안녕하세요. 저번시간에는 문제의 원인일지 모르는 DB 커넥션과 커넥션 풀에 대해 이해하고, 커넥션 풀 크기를 조정한 뒤 2차로 다시 테스트를 수행해 보았습니다. 10개 였던 커넥션 풀 크기가 20개로 늘자 맨 처음 문제였던 getConnection 메소드 수행 시 대기 시간은 사라졌습니다. 다만, 커넥션 풀이 문제를 일으키는 진짜 원인이 아니었기에 또 다른 곳에서 문제가 발생하는 것을 확인할 수 있었습니다. 오늘은 문제의 원인이 될 만한 다른 부분을 분석해보고, 문제점이 발견되면 이를 개선하고 다시 성능 측정을 해봄으로써 실질적인 개선이 이루어졌는지 확인해보도록 하겠습니다. 문제가 발생하고 있는 지점을 좀 더 자세히 살펴봅시다. 저번 포스팅에 활용했던 사진을 다시 가져와 보았습니다. 여기서 확인했던 문제..
배포 서버를 대상으로 한 성능테스트 및 성능개선 (3) - DB Connection 안녕하세요. 저번 시간에는 nGrinder를 활용해 직접 성능테스트를 실행하고, 이를 pinpoint 등의 도구를 사용해서 모니터링을 해보는 시간을 가졌습니다. 그리고 원인은 확실하지 않지만 문제가 있는 부분도 찾아낼 수 있었는데요. 오늘은 해당 문제 해결의 실마리가 될 수도 있는 DB Connection에 대해 좀 더 살펴보고, 해당 내용을 실제로 적용한 뒤 테스트를 다시 진행해봄으로써 실제로 커넥션이 문제를 유발하고 있었는지 살펴보도록 하겠습니다. 먼저, 본론에 들어가기에 앞서 커넥션이 무엇인지부터 시작하겠습니다. DB connection이란? 커넥션은 이름이 의미하는 바와 같이 연결과 관련이 있습니다. 한 개체가 다른 서버 상에 존재하는 개체와 통신하기 위해서는 이를 뒷받침 할 수단이 필요한데, 이..
배포서버 성능테스트 및 성능개선 (2) - 직접 성능테스트를 진행해보고 경과를 모니터링 해봅시다. 안녕하세요. 저번시간에는 성능 테스트의 필요성을 알아보고 성능을 측정하는데 있어 대표적인 기준이 될만한 지표들에 대해서 살펴본 뒤 성능 테스트 시 사용할 도구들을 직접 설치해봄으로써 배포한 서버를 대상으로 한 성능 테스트를 진행하기 전 사전 작업을 완료하였습니다. 이제 테스트를 구동할 준비를 모두 마쳤으니 이번 시간에는 nGrinder를 사용해 타겟 서버에 직접 부하를 가해보면서 테스트가 진행되는 동안 pinpoint와 Jvisualvm 등의 도구를 통해 해당 서버가 부하 속에서도 제대로 동작하고 있는지 모니터링 해보는 시간을 갖도록 하겠습니다. 시작하기에 앞서 성능 테스트를 진행한 서버의 사양과 구조는 다음과 같습니다. 서버 사양 애플리케이션 서버 - CPU: 2코어, RAM: 4GB DB 서버 - C..
배포서버 성능테스트 및 성능개선 (1) - 성능테스트의 필요성을 살펴보고, 필요한 환경을 구성해 봅시다. 안녕하세요. 프로젝트를 진행하면서 기존에 구상했던 기능들을 구현할 때 대용량 트래픽 환경을 가정하고 최대한 신중히 코드를 작성해 왔습니다. CI와 CD를 구현해서 배포를 하고 나니 그간 공들여 진행한 프로젝트를 직접 public한 환경에서도 사용해볼 수 있게 되었는데요. 그러면서 문득 실제로도 많은 트래픽을 수용할 수 있는지와, 그러한 환경 속에서도 얼마나 빠르고 안정적인 속도로 서비스를 제공할 수 있는지가 궁금해지게 되었습니다. 때문에 성능 테스트를 진행하게 되었으며, 이번 포스팅은 이러한 과정에서 제가 마주했던 문제점과 그러한 문제들을 해결해가는 과정을 공유해보고자 합니다. 성능테스트의 필요성 성능 테스트란 그 이름이 의미하는 것처럼 해당 서비스의 성능적인 측면을 직접 테스트해보는 것을 의미합니다. ..
대용량 트래픽 속에서도 무거운 DB 조회 연산을 효율적으로 처리하는 방법은 무엇이 있을까요? (2) INTRO 안녕하세요. 오늘도 다시 찾아온 Soo입니다. 지난시간에는 DB에서 무거운 연산을 좀 더 효율적으로 처리하기 위해서 프로젝트를 진행하면서 지금까지 MySQL에 대해 학습한 내용을 바탕으로 EXPLAIN을 활용해 작성한 쿼리의 실행계획을 조회하고, 비효율적인 결과가 나타나는 부분을 찾아서 쿼리를 튜닝하는 시간을 가졌습니다. 그렇지만 여전히 문제가 되는 부분이 존재하는데 바로 조인 연산이 여전히 많이 필요하다는 점입니다. 이번 글에서는 이러한 문제점을 어떻게 해결해보았는지에 대해 작성해보고자 합니다. 조인연산을 어떻게 줄일 수 있을까? 지난 시간에 튜닝을 끝낸 쿼리를 다시 살펴보겠습니다. 각 이름들을 매핑시키기 위해서 총 다섯 번의 조인이 사용되었습니다. 조인은 그 특성상 당연히 단일 테이블을 가..
대용량 트래픽 속에서도 무거운 DB 조회 연산을 효율적으로 처리하는 방법은 무엇이 있을까요? (1) INTRO 안녕하세요. Soo 입니다. 성능은 프로그램 개발에 있어서 항상 중요하게 회자되는 이슈 중 하나입니다. 어떤 프로그램이 '성능이 좋다'고 했을 때, 평가할 수 있는 요소는 여러 가지가 있겠습니다만, 웹 애플리케이션의 성능을 이야기 해보자면 가장 중요한 부분 중 하나가 바로 사용자로 부터 요청이 들어왔을 때 이를 얼마만큼 빠르게 처리한 뒤 응답을 보내줄 수 있는가를 의미하는 '응답시간'입니다. 한 조사에 따르면 어떠한 서비스를 이용할 때 사용자들이 기꺼이 감내할 수 있는 응답시간은 최대 3초라고 합니다. 때문에 아무리 좋은 서비스라고 하더라도 이를 처리할 수 있는 성능이 뒷받침 되어야만 이를 통해 더 많은 비즈니스 기회를 창출할 수 있을 것입니다. 사실 처리하는 요청, 즉 서버로 들어오는 트래픽..
대용량 트래픽을 견디는 서버를 만들기 위한 DB Replication 구축 - Microsoft Azure Cloud 서버의 MySQL 8.0.xx을 사용한다면 꼭 주의해야 하는 부분은? (a.k.a DB 구축 삽질기) INTRO 안녕하세요 Soo 입니다. 오늘은 프로젝트를 진행하면서 직면했던 문제점과 이에 대한 해결책을 공유해보고자 합니다. 이번 주제는 데이터베이스 솔루션인 MySQL과 관련이 있습니다. 항상 어떻게하면 더 성능이 좋은 프로그램을 만들까 신경쓰면서 프로젝트를 해나가던 도중에 DB를 마스터와 슬레이브의 구조로 분리하여 성능 향상을 도모할 수 있다는 사실을 알게되었는데요. 이번 글에서는 Replication 구축이 왜 필요한지와 이를 구축하면서 겪었던 작은 에피소드를 다뤄보고자 합니다. Master-Slave Replication 구축의 필요성 애플리케이션을 개발할 때 성능과 관련해서 가장 많은 문제가 생기는 부분 중 하나가 바로 데이터베이스 부분입니다. DB 커넥션 연결, 디스크 IO 발생, 인덱싱의 부..
다중 서버환경(Scale out)에서 Session 불일치 문제를 어떻게 해결해야 할까요? INTRO 안녕하세요. 지난 글에서는 서비스의 규모가 커짐에 따라 더 많은 트래픽을 수용하기 위해 서버를 확장하는 두 가지 방식에 대해서 알아보았습니다. 각각 방식에 장단점이 존재하기 때문에 개발 중인 서비스의 특징에 맞게 선택할 필요가 있었고, Hello-World는 서비스의 특징을 봤을 때 서비스의 지속성을 유지하는 것이 더 중요하므로 이에 대해 우위가 있는 Scale out을 선택하기로 결정하였습니다. 하지만 Scale out을 선택했을 때 고려해야할 부분은 역시나 데이터의 불일치 문제입니다. 여러 서버가 각각의 메모리 저장 공간을 가지고 있는데, 세션(Session)을 활용한 로그인을 사용할 경우 세션의 특성상 각 서버간에 공유가 되지 않기 때문입니다. 본 글에서는 이러한 문제점을 좀 더 자세히 ..