일단 nginx-lua를 쓴다는 것이 가볍고 빠르다는 건데.. 트래픽을 받으면서 머신을 방치해두니 CPU 사용률이 점점 올라간다? 이게 뭐여?
낑낑대다가 찾은 것 같다.
lua 부에서 lua나 so를 require 할 때 path를 정의한다.
package.path = "내 패쓰" .. package.path
cpath도 마찬가지다.
이걸 init나 location에서 처리하면 어떻게 될까? 디벅을 찍어보니 계속 더해진다. 즉. package.path
에 "내 패쓰"가 계속 추가되는 것.
init은 포킹시에만 실행될 것으로 생각했는데 init에서도 증식한다.? 이건 왜 그런지 잘 모르겠다.
이렇게 path가 길어지면 어찌될까? lua-jit는 같은 모듈을 여러 곳에서 require하면 static 처럼 처리한다고 어서 본 것 같다. 성능 상 문제 없으니 걍 쓰라고 본 듯. 그렇다면 path 변수를 탐색한다고 cpu를 잠식하지는 않을 것 같다.
path가 길어지는 것 자체가 cpu를 사용하는 것. path 문자열이 작으면 malloc 등의 내부 로직에 의해서 간촐하게 realloc 될 것이다. 길어지면? 덩치가 커지면 realloc이 상당한 부담이 되기 시작할 것이다. strace를 떠 보지는 않았지만 아마도 그 문제일 듯 싶다.
여튼 이 문제는 nginx.conf의 http 부에 다음과 같이 nginx 값으로서 추가하면 된다.
lua_package_path "/app/puser/deploy/id_sync/lua/?.lua;";
lua_package_cpath "/app/lua-cjson/lib/?.so;";
이러고도 같은 문제가 발생되면 또 다른 부분을 찾아야겠..