native서버(C++) 와 Web서버(Apache) http통신에서 recv 속도 질문
글쓴이: dlaejrqp21 / 작성시간: 금, 2018/01/12 - 9:43오후
안녕하세요.
프로그래밍 공부 중인 학생입니다.
현재 서버를 만들고 테스트 중에 있는데요.
C++로 만든 서버 = A서버 / Web서버 = B서버
클라이언트가 A서버로 로그인을 하면 동기로 B서버로 http post 형식을 만들고 보내면
웹서버로 부터 받은 데이터를 파싱해서 인증을 처리하고 있습니다.
http post 통신 할 때는 동기소켓으로 send,recv를 하고 있습니다.
그런데 A서버의 속도가 너무 느려서 프로파일링 해보니 recv()함수에서 상당한 딜레이(거의 1초)가 걸리더라구요.
B서버에서도 프로파일링했는데 처리속도가 평균 0.05초 정도밖에 안걸려서요.
네이티브서버와 비교했을때 웹서버가 많이 느린 건 알아도 이건 너무 느린거 같네요.
어떤 부분을 개선해야 할지 잘 모르겠습니다.
답변부탁드립니다.
읽어주셔서 감사합니다.
Forums:
B서버를 따로 테스트하신건가요? 제가 동일 상황이라면
B서버를 따로 테스트하신건가요? 제가 동일 상황이라면 B가 진짜 문제인지부터 확인해볼 것 같네요.
1. A서버(C++)서버 없이 http post를 수행할 수 있는 postman, curl, jmeter 들 중 아무거나 이용하여, 실제 웹서버의 응답시간이 느린지 확인합니다.
2. 1의 응답시간이 느리지 않다면, B서버(아파치)의 문제는 아님.
3. 1의 응답시간이 느리다면, B서버(아파치)의 문제
2의 경우면 A서버의 코드를 확인.
3의 경우면, 아파치의 응답시간이 느린 원인을 더 찾아야지요.
아파치 로그파일(centos의 경우엔 /var/log/httpd)도 확인하구요.
(아파치가 보통 응답시간이 많이 걸리는 문제가 DNS Query관련 문제가 좀 많은 것 같습니다_
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
예. 말씀하신 사항 확인해봤는데요.
A서버와 B서버 같이 연동해서 테스트했습니다.(일정 확률마다 계속 프로파일링한 수치를 로그로 남기고 있습니다.)
B서버를 fiddler를 이용해서 테스트 해봤는데 응답시간엔 문제가 없더라고요.
A서버에 지연이 걸리는 부분을 프로파일링해서 확인해보니 recv()함수 자체가 원인이더군요.
그런데 생각해보니 아무래도 B서버는 A서버랑은 속도차이 많으니 원래 이런건가? 라는 생각도 드네요.
프로파일링 했을때 recv()함수의 딜레이 시간이 평균 1.632e+04㎲(0.01632 맞나?) 정도라고요.
A서버 입장에서는 느린거지만 B서버랑 연동해서 이정도 시간이면 납득이 될 수도 있겠다라는.....
본문과 답글의 내용이 좀 다르네요?
본문과 답글의 내용이 좀 다르네요?
본문에서는 recv에서 상당한 딜레이(거의 1초), 댓글에서는 recv에서 1.632e+04 ㎲ = 0.01632 초 걸림.
B서버의 응답시간이 평균 0.05초라면, A서버 recv에서도 0.05초는 더 걸려야 정상인데 뭐가 먼지 모르겠네요.
여튼 http client 테스트시 나타나는 응답시간에 문제가 없다는 것은 recv까지 해도 문제가 없다는 얘깁니다.
fiddler든 curl이든 이미 recv까지 완료하고 걸리는 시간을 출력하는 것이니까요.
A서버 코드의 수신코드에 문제가 없는지 확인하시는 게 좋을 것 같습니다.
http request/response는 tcp 소켓을 그대로 쓰기 보다는 curl등의 http client 라이브러리를 사용하시는 게 좋아보이구요. (http 프로토콜 공부목적이 아니시라면)
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
어이쿠.. 죄송합니다. 잘못 전달해드렸습니다.
죄송합니다.
recv에서 상당한 딜레이(거의 1초)의 언급은 저의 실수입니다.
제가 recv처리를 담당하는 스레드에서 TPS가 1이 나와서 1초라 했던거 같습니다.
말씀드린 recv의 0.01632는 recv 처리를 하는 행위의 전체시간이 아니고 recv()(SocketAPI)함수 자체의 시간입니다. 이 함수가 지연의 원인이였구요.
말씀하신 curl로 사용해보겠습니다.
감사합니다.
댓글 달기