develop/linux

api server 성능 상향 시키기

아르르르를를르 2020. 1. 14. 23:29

기존에 서비스 중인 api 서버에 paging 없이 한번에 큰 데이터를 제공하는 리소스 추가작업이 생겼다.

한달에 한번정도 실행될 것으로 응답시간은 상관없다고 한다. 그러나 응답이 4분이나 걸리는 테스트결과를 보니  끔찍쓰

서버 부하가 문제가 있고, 최대한(? 빠른 속도로 제공하고 싶다.

또한, 기존의 다른 리소스들은 요청이 들어오면 관계없이 잘 실행되어야한다.

현재 uwgi, python, flask 가 연동된 구조이다.

 

"""

db쿼리속도를 빠르게하던지 -> es?? 튜닝

성능테스트를 어떻게 해야하지?

아니면 부가적으로 밖에서 뭔가를 처리하던지

"""

 

고민 1. 기존 uwsgi에 Nginx연동 필요성

 

적은 traffic의 서버라면 굳이 필요없다. reverse proxy server도 uwsgi --http 옵션으로 해결!

uwsgi --http 와 --http-socket의 차이점: 

 

그러나, 많은 traffic이 발생하는 서버라면 nginx를 사용하는 것이 좋다.

정적파일 처리, 캐싱(dynamic content), load handling 기능 추가가 가능하다.

nginx에서도 uwsgi protocol을 지원한다.

 

그리고 결정적으로 uwsgi는 http router에서 http connection을 1 thread 1 connection으로 처리하는데,

이것은 각 thread마다 stack이 하나씩 필요하기 때문에 수많은 context-switching overhead 발생한다.

 

nginx는 Reactor partten을 사용한다.

<Reactor Partten>

Single thread를 기본(필요에 따라 fork로 몇개의 프로세스를 사용)

main event loop가 OS에서 socket data(buffer)를 주기를 기다림.

single thread는 동시에 수만개의 동시 connection을 처리할 수 있음

 

 

고민 2. process 늘리기

 

python은 GIL(one thread got everything of Interpreter) 때문에 thread를 늘리는 것은 성능향상에 큰 도움이 되지 못한다.

process를 늘려야한다.

network, database IO, disk IO 같이 I/O bound 작업의 경우 성능 개선이 있을 수도 있는데, 그 이유는 thread가 Interpreter를 점유하다가 I/O bound 작업이 발생하면 Interpreter 점유를 release하기 때문이다.

추가로, uwsgi cache 각 프로세스마다 따로 caching 가지고 있어 다른 프로세스에서 사용 불가능하다. -> 성능 향상 X

 

 

고민 3. sqlalchemy 쿼리 튜닝하기 - 사용한 해결책

 

결국엔 database 쿼리속도를 높이는 것이였다. 대부분의 시간이 table 4개를 join해서 가져오는 db 쿼리에 사용되고 있었다.

쿼리 튜닝에 사용한 방법은

1) .subquery() 사용해서 2개 table 먼저 join하여 데이터 줄인 후 나머지 join 수행하기

2) row 전체를 가져오는 것이 아닌 필요한 column만 가져오기

3) where 조건문(.filter())에서 최대한 많이 필터링 되는 순으로 정렬

이것으로 1분 20분짜리를 20초로 줄일 수 있었다.

 

 

추가작업

1. stuck request 처리 -> harakiri 옵션으로 설정시간 이후로 넘어가는 request는 502 bad request 처리

harakiri 설정

2. max-request 처리

max-requests

3. Nginx stream data buffer

curl -N 옵션 주기, buffering

참고

https://serverfault.com/questions/590819/why-do-i-need-nginx-when-i-have-uwsgi

https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html#can-i-use-uwsgi-s-http-capabilities-in-production

https://stackoverflow.com/questions/3436808/how-does-nginx-handle-http-requests

https://velog.io/@doondoony/Python-GIL

 

 

 

 

'develop > linux' 카테고리의 다른 글

curl 응답시간 확인하기  (0) 2020.01.30
uwsgi error log 없애기  (0) 2020.01.28
Dos상 ^M 문자 없애기  (0) 2020.01.02
리눅스 명령어 모음  (0) 2019.12.19
Screen  (0) 2019.11.03