-
[SW 정글 118일차] 나만의 무기 26일차 (Node는 race condition이 발생할까?)카테고리 없음 2021. 11. 29. 02:57
오늘은 어제 Artillery를 사용하여 간단 테스트 시도를 이어 진행했다.
일단은 yaml 파일에 option을 작성하여 artillery를 run하는 것이 안되는 이유는 찾지 못했다.
하지만 대책으로 yaml이 아닌 json으로 options을 작성하니까 run이 되었다.
{ "config": { "target": "http://localhost:5000", "phases": [ {"duration": 60, "arrivalRate": 20} ], "defaults": { "headers": { "User-Agent": "Artillery" } } }, "scenarios": [ { "name": "유저테스트", "flow": [ {"post": { "url": "/api/user/login", "json": {"email": "[이메일]", "pwd": "[pwd]" } } } ] } ] }
/* 테스트 후 json으로 결과를 받아올 수 있는 코드 */ artillery run --output report.json test.json /* json형식 결과를 html파일로 만들어 주는 코드 */ artillery report ./report.json
처음으로 해보는 서버 성능 테스트여서 줄줄이 나오는 report가 신기하고 즐거웠다.
원래는 로컬호스트에 테스트를 먼저 해봤어야했지만 바로 배포된 서버에 테스트를 걸어봤는데 20초동안 초당 200명이 접속하도록 해봤더니 서버가 터졌다.
현재 배포된 서버의 한계점은 초당 200명 미만...
하지만 계속 AWS에 배포된 서버에 테스트를 걸어버리면 과금을 먹으니까 로컬호스트에서 완전한 시나리오가 작성되기 전에 테스트를 하려고 한다.
로컬호스트에서 테스트를 진행하면서 바꿔본 것은 mysql pool connection max number이다.
처음에는 10개로 설정해서 아래와 같은 결과가 나왔다.
내가 생각한 이유는 클라이언트가 로그인을 하기 위해 API 서버와 connection을 맺었지만 API 서버와 mysql과의 요청, 응답을 기다리다가 ETIMEDOUT이 발생했다는 것이다.
(error에 대해 잘 정리된 블로그는 소장)
그래서 과감하게 pool connection max number를 5000으로 올려보았다.
물론, 이 값을 올린다고 ETIMEDOUT이 안난다는 확신은 없었지만 일단은 건드릴 수 있는 것이 이것 밖에 없어서 한 번 바꿔서 테스트를 돌려봤다.
결과는 달랐다.
오히려 서버가 터져버렸다...
터진 이유는 mysql connection 에러로 인해 터진 것인데 pool에 담긴 connection은 많은데 mysql이 견디지 못해서 그런가...
이런 에러를 만나면 빨리 성장해서 왜 이런 에러가 난지를 한 눈에 알고 싶다...
TypeError: Cannot read properties of undefined는 yaml파일로 artillery테스트를 돌릴 때도 만난 에러문이였고 그 때에도 명확한 해답을 찾지 못했었다.
선언되지 않은 것을 읽을려고 나는 에러인 거같은데 그러면 mysql과 connection이 이루어지지 않은 상태에서 query를 날려서 그런건가...
pool.Getconnection에 비동기로 error가 발생하면 error처리하는 코드를 빠짐없이 넣어줘야겠다.
(그러면 query를 날리기 전에 error를 잡고 서버가 터지는 일은 없지 않을까?)
그리고 제목에 쓴 node는 race condition이 발생할까?라는 의문은 node가 싱글스레드라는 것을 알았고 하지만 동시성을 고려해보는 작업이 중요하다는 멘토님의 얘기를 듣고 생긴 것이다.
싱글스레드이면 차례대로 동작하니까 동시성이 안나지 않을까?
그래도 비동기적으로 동작하니까 동시성이 발생하고 race condition이 발생할 가능성이 생길까?
이러한 생각들이 머릿 속에만 남았는데 오늘 테스트를 하기 위한 시나리오를 어떠한 것을 작성할까하다가 동시성으로 문제가 발생할만한 상황을 써서 제대로 동작하는지를 보자고 얘기를 했고 그러면서 다시 머릿 속에 있던 의문부터 해결해야겠다는 생각을 가졌다.
구글링을 해보니 좋은 글이 있었다.
https://www.nodejsdesignpatterns.com/blog/node-js-race-conditions/
결론은 node를 사용해도 race condition이 발생한다는 것이였고 글을 잘 정리해서 여기에 남기고 싶지만 시간 상 일단은 좋은 글을 기록해두는 것으로...