충분히 빠르다는 생각을 하지만 그래도 더 최적화 해달라는 요청이 있어. 최적화를 해보았다.
불필요한 코드 제거
- 불필요한 코드는 메모리를 잡아 먹어 성능을 저하시킬 수 있다.
- import 중복 제거
- import 중복 제거는 크게 영향을 끼치지 않지만 그냥 제거한다.
- 의미없는 print 제거
- print()함수는 I/O exception으로 성능을 많이 저하시킬 수 있다.
- 필요한 경우 logging을 사용하자
- info, debug, error 별로 유연하게 출력가능
연결은 한번만 하자.
- 로직 내에 DB와 여러번 연결을 하는 경우 전역변수를 활용하여 한번 생성한 연결을 재사용하는 singleton 구조로 만든다.
- 주의사항은 멀티스레딩에서 안전하지 않기 때문에 잘 사용해야한다.
여러번 사용하는 데이터는 한번만 불러오자.
- 정적인 데이터는 json으로 저장하여 전역 변수로 한번만 불러와 사용하자.
코드는 알아서 최적화
- 코드를 비효율적으로 짜지 말자.
- ex) pandas의 마지막 행의 특정 컬럼을 여러번 가져오는 코드가 있을 때, 마지막 행만 따로 저장 후 컬럼을 가져오자.
아키텍처 변경
- x86_64을 arm으로 변경하자.
- 값도 싸고 성능도 빠르다.
cold start 방지
- event 뜸한 경우는 lambda가 죽지 않도록 event scheduler를 등록하여 1분에 event를 하나씩 쏘아준다.
- event가 많은 겨웅 cold start 방지를 위해 프로비저닝된 동시성 구성을 사용하자.
- 1초에 데이터가 몇개 들어오는지, lambda가 하나의 event를 몇초에 처리하는지 보고 계산하여 특정 개수를 대기 시켜놓자.
lambda의 메모리를 늘리자.
- 적당하다고 생각했는데 메모리가 늘어나니 속도가 빨라졌다.
- 이유를 찾아보니 CPU, 네트워크 대역폭, 디스크 I/O도 비례해서 증가한다고 한다.
- cpu 연산, 네트워크 요청 처리, redis, rds 접근 I/O, 머신러닝 모델 로딩, 대용량 데이터 처리 등의 성능이 증가한다.