110호. HTTP 세션을 비활성화해서 API 속도를 높이는 방법 free

2020-01-08

글을 보내드리고 나서 내용이 조금 이상하다는 연락을 받았습니다. web 미들웨어 그룹에서 일부 미들웨어를 제거하는 게 아니라 그냥 api 미들웨어 그룹을 쓰면 되지 않느냐는 지적이었는데요. 듣고보니 맞는 말이더라고요. 혹시 제가 놓친게 있나 싶어 원문을 몇 번 다시 읽어봤는데 그런건 없었습니다. 이 글은 부정확한 정보를 담고있으니 읽지 말아주세요.


혹시 라라벨을 API로만 사용하시나요? HTTP 세션을 비활성화해서 API 속도를 높이는 방법(원문)이 소개되어 공유할까 합니다.


세션 사용으로 인한 성능 저하


API는 세션을 사용하지 않지만 라라벨은 기본적으로 세션이 활성화되어 있습니다. 세션이 성능에 악영향을 끼친다면 이를 비활성화 함으로써 성능 향상을 꽤할 수 있습니다. 세션이 성능을 저하시키는지 먼저 보겠습니다.


라라벨을 기본값으로 두고 쓰면 file 세션 핸들러를 사용하고, 이 경우 storage/framework/sessions 디렉터리에 사용자 수 만큼 파일이 생성됩니다.


세션 파일을 제거하지 않고 계속 쌓기만 하면 저장공간이 부족해지기 때문에 오래된 세션은 정리를 해줘야 합니다. 라라벨의 기본 설정은 아래와 같이 2% 확률로 오래된 세션을 제거합니다.


// config/sessions.php

/*
|------------------------------------------------
| Session Sweeping Lottery
|------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/

'lottery' => [2, 100],

세션을 제거할 때 파일을 하나씩 확인하면서 지우는데, 이때 CPU를 꽤 사용한다고 합니다. 아래 이미지는 원문에서 가져왔습니다.



HTTP 세션을 비활성화 하기 전후의 CPU 사용량 차이를 볼 수 있습니다. HTTP 세션을 비활성화 하기 전에는 100번 중 2번은 오래된 파일을 찾아 지우는 작업을 하기 때문에 CPU 사용량이 급격히 올랐다 떨어지기를 반복합니다. 반면 HTTP 세션을 비활성화 한 후에는 진동폭이 작아진 걸 볼 수 있습니다.


HTTP 세션을 비활성화 하는 방법


app/Http/Kernel.php$middlewareGroups에서 아래의 세 미들웨어를 제거해주면 된다고 합니다.


\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,

파일 세션을 사용해야하는 경우


라라벨을 API로만 사용하지 않는 경우에는 세션을 완전히 비활성화 할 수는 없습니다. 레디스나 멤캐시 등을 쓰면 성능저하가 덜하지만 파일 세션을 사용하는 경우에는 라라벨이 기본으로 사용하는 오래된 세션을 제거하는 방법(설정의 lottery 항목 값에 따라 확률적으로 실행)을 비활성화 하고(방법은 안알려주네요) 개인적으로 워커를 만들어서 오래된 세션을 제거하는게 성능에 좋을거라고 합니다. 사실 100번 요청 마다 2번씩 검사하는건 좀 과하긴하죠.


마치며


저는 라라벨을 API로만 사용하는 토이 프로젝트를 하나 하고 있는데 여기에 한 번 적용해봐야겠어요. 사실 API로만 쓸 거면 루멘 같은 다른 프레임워크를 쓰는게 맞는데 왠지 손이 잘 안가네요 ㅎㅎ


Happy Hump Day!


1일 1식 라라벨 110호

2020년 1월 8일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.