native서버(C++) 와 Web서버(Apache) http통신에서 recv 속도 질문

dlaejrqp21의 이미지

안녕하세요.
프로그래밍 공부 중인 학생입니다.
현재 서버를 만들고 테스트 중에 있는데요.

C++로 만든 서버 = A서버 / Web서버 = B서버

클라이언트가 A서버로 로그인을 하면 동기로 B서버로 http post 형식을 만들고 보내면
웹서버로 부터 받은 데이터를 파싱해서 인증을 처리하고 있습니다.
http post 통신 할 때는 동기소켓으로 send,recv를 하고 있습니다.

그런데 A서버의 속도가 너무 느려서 프로파일링 해보니 recv()함수에서 상당한 딜레이(거의 1초)가 걸리더라구요.

B서버에서도 프로파일링했는데 처리속도가 평균 0.05초 정도밖에 안걸려서요.

네이티브서버와 비교했을때 웹서버가 많이 느린 건 알아도 이건 너무 느린거 같네요.

어떤 부분을 개선해야 할지 잘 모르겠습니다.

답변부탁드립니다.

읽어주셔서 감사합니다.

yhsuk의 이미지

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 :) - "여유를 갖고 행동하되 게을러지지 말자"

dlaejrqp21의 이미지

A서버와 B서버 같이 연동해서 테스트했습니다.(일정 확률마다 계속 프로파일링한 수치를 로그로 남기고 있습니다.)

B서버를 fiddler를 이용해서 테스트 해봤는데 응답시간엔 문제가 없더라고요.

A서버에 지연이 걸리는 부분을 프로파일링해서 확인해보니 recv()함수 자체가 원인이더군요.

그런데 생각해보니 아무래도 B서버는 A서버랑은 속도차이 많으니 원래 이런건가? 라는 생각도 드네요.

프로파일링 했을때 recv()함수의 딜레이 시간이 평균 1.632e+04㎲(0.01632 맞나?) 정도라고요.
A서버 입장에서는 느린거지만 B서버랑 연동해서 이정도 시간이면 납득이 될 수도 있겠다라는.....

yhsuk의 이미지

본문과 답글의 내용이 좀 다르네요?

본문에서는 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 :) - "여유를 갖고 행동하되 게을러지지 말자"

dlaejrqp21의 이미지

죄송합니다.
recv에서 상당한 딜레이(거의 1초)의 언급은 저의 실수입니다.
제가 recv처리를 담당하는 스레드에서 TPS가 1이 나와서 1초라 했던거 같습니다.
말씀드린 recv의 0.01632는 recv 처리를 하는 행위의 전체시간이 아니고 recv()(SocketAPI)함수 자체의 시간입니다. 이 함수가 지연의 원인이였구요.

말씀하신 curl로 사용해보겠습니다.
감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.