서버에서 동시 접속자 수를 확인할 수 있는 방법이 궁금합니다.

jamesiha의 이미지

현재 우분투 서버에서 공개 포럼을 운영하고 있는 초보입니다.

대략적인 서버 pc 사양은 다음과 같습니다.

CPU : 브리즈번 4200 (2.2G)
RAM : 4G
HDD : 300G SATA2 7200rpm
LINE : 엔토피아 100M

top - 22:19:22 up 8:19, 2 users, load average: 2.94, 2.31, 1.73
Tasks: 194 total, 2 running, 190 sleeping, 0 stopped, 2 zombie
Cpu(s): 20.5%us, 4.5%sy, 0.0%ni, 74.2%id, 0.0%wa, 0.3%hi, 0.5%si, 0.0%st
Mem: 3925012k total, 2893036k used, 1031976k free, 657908k buffers
Swap: 2000052k total, 0k used, 2000052k free, 1142604k cached

사이트 규모는 일일 평균 방문자 수는 7천~1만에 페이지뷰는 6~8만 정도되는 그리 크지 않은 규모입니다. (일일 트래픽은 5~10기가 정도)

보통 아시는 phpbb와 비슷한 vbulletin에서 포럼을 운영하고 있고요. 간간히 사진들이 오가지만 대부분이 일반 글들로 채워지고 있습니다.

회원수는 약 2만 가까이 되며(허수도 많긴 하지만..) 점점 늘어나고 있고 서버를 집에서 돌리다 보니 어느선까지 감당이 될지 궁금합니다.

그래서 피크 타임에 동시 접속이 몇명정도 되는지 체크하려고 다음과 같은 명령어를 사용했습니다.

가) netstat -ant | awk '{print $5}' | cut -f 1 -d : | sort | uniq | wc -l
요놈은 시스템에 tcp 프로토콜로 접속된 수를 확인할수 있다고 하고

나) netstat -anp | grep :80 | grep ESTAB | wc -l
요놈은 아파치에 접속된 숫자 확인이라고 합니다.

이 두개 모두 동시 접속자 수를 확인 할 수 있는 명령어라고 하는데요.

둘다 같은 값이 나오면 모르겠지만 아주 상이하게 차이가 납니다.

가) 방법으로 하면 약 200~300정도 되구요
나) 방법으로 하면 30이 채 되지 않습니다.

물론 몇초 간격으로 측정했습니다.

왜 이렇게 차이가 나는지 모르겠습니다. 어떤 면에서 차이가 있는 지 궁금하고.

정확하진 않겠지만 제 사양에서 동시 접속 몇명 정도까지 버틸 수 있을지 대충 예상 부탁드립니다.

감사합니다.

자일자일의 이미지

#ps aux | grep httpd | wc -l

아파치 데몬(httpd)의 갯수를 세어주는데... 위에서 확인하신 두개의 값과 어떤지 궁금하네요.

rhheo의 이미지

안녕하세요.
사이트 고맙게 사용하고 있습니다. (airless)

| : 앞 명령의 출력을 다음 명령의 입력으로 보냅니다.

가) netstat -ant | awk '{print $5}' | cut -f 1 -d : | sort | uniq | wc -l
netstat -ant : 
  at:현재 접속되어 있는 피어 중 tcp접속을 모두 출력합니다.
  n:숫자로 모두 출력합니다.
  (예를 들어서 포트 http대신에 80이라고 숫자로 출력합니다. 주소도 숫자로 출력합니다.)
awk {... $5} : 위의 출력중에 5번째 컬럼(즉 상대방 주소 : 포트)부분 출력합니다.
cut ... : ":"문자로 짜른 값중 첫번째 부분을 출력합니다. (즉 주소부분)
sort : 정렬합니다.
uniq : 중복된 값을 제거
wc -l : 라인수를 출력
 
나) netstat -anp | grep :80 | grep ESTAB | wc -l
netstat -anp :
  a : 모든 접속을 출력합니다. (UDP포함)
  n : 숫자로 출력합니다.
  p : 실제 프로그램명 + pid를 출력합니다.
grep :80 : ":80"이라는 문자열이 있는 줄만 출력합니다.
grep ESTAB : ESTABLISHED만 출력합니다. 
(그외 SYN_RECV, CLOSE_WAIT등등의 상태가 있습니다) 

결론 :
가) 80번 포트인지를 고려하지 않고 있네요. ESTABLISHED상태인지를 보지 않고 있네요.
나) 중복 아이피를 글르지 않고 있네요.
netstat -ant | grep :80 | grep : ESTAB | awk '{print $5}' | cut -f 1 -d : | sort | uniq | wc -l
이 명령으로 현재순간의 접속자를 판단할 수 있겠네요.

그리고... 웹에서는 웹사이트를 보고 있는 사람까지 다 카운팅해야 하기 때문에 이 방법은 별로 좋지 않네요...

jamesiha의 이미지

엇 반갑습니다. 여기서 뵙게 되네요.

netstat -ant | grep :80 | grep : ESTAB | awk '{print $5}' | cut -f 1 -d : | sort | uniq | wc -l

알려주신 명령문에서 grep : ESTAB -> grep ESTAB로 해서 하니 잘 되는군요.

Close_Wait나 SYN_RECV등은 카운팅 하지 않는다고 하면 보편적으로 동시 접속하고 있다는 말과는 조금 거리가 있어 보이는데 맞는지요?

그렇다면 가장 적절한 카운팅 방법은 어떤게 있을까요.

듣기로 MRTG 등으로 가늠할 수 있다던데 MRTG를 쓰고 있지만 대역폭이나 RAM, CPU 모니터링으로만 활용하고 있습니다.

그리고 자세한 답변 감사합니다.

rhheo의 이미지

아 ":"문자까지 복사해서 붙였군요;;
고수분들이 좋은 답변을 다셨을 지도 모르는데 괜히 저때문에 좋은 답변을 막아 버린건 아니지 모르겠네요.

저두 전문적으로 서버를 관리하는 것은 아니라서 잘은 정확한 해답은 못 내리겠습니다만
웹에서 동시 접속자란
현재 웹사이트를 열람하고 있는 사용자수
라고 정의하는 것으로 하겠습니다.

배경지식으로 필요한
http프로토콜의 동작의 개요는
1. 접속자가 링크를 클릭하면 브라우저는 서버로 요청을 보냅니다. (index.html링크를 클릭했다고 합시다)
2. index.html파일 내용을 브라우저로 보냅니다.
3. 브라우저는 index.html내용을 보고 더 필요한 파일들을 서버로 요청합니다.
4. 서버는 브라우저가 요청한 파일의 내용을 속속 보내줍니다.
5. 접속을 끊습니다. (끊는 절차는 약간 복잡하므로 생략)
(http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html의 8.1.2.1 Negotiation 절을 참고합니다)

한번의 클릭으로 1 ~ 4 또는 5까지의 동작이 일어납니다.
forum같은 경우는 늦어도 몇초내로 이들 동작이 완료됩니다.
이들 동작이 일어나고 있는 동안만 netstat에 표시가 됩니다.
즉, tcp가 establish한 상태의 것들이 이에 해당합니다. (데이터를 주고 받고 있는 상태)
(tcp의 나머지 상태들에 대해서는 별루 의미를 안두셔도 됩니다.
접속 컨트롤의 어떤 상태를 의미합니다. 접속을 시작하고 있는 상태 또는 접속을 종료하고 있는 상태같은 거죠)

사용자는 표시된 페이지를 보다가 다음 클릭을 하겠죠.
즉 netstat으로는 이 사람들을 감지할 수 없죠.

결과적으로 사용자가 1. 웹페이지를 보고 있는지 2. 브라우저를 종료시키고
자고 있는지는 알 수 없다라는 겁니다.

따라서 근사값으로 계산 해야 합니다.
예를 들어서 마지막 클릭이후 10분이 지나지 않은 사용자수를 현재 접속자로 계산한다던지가 되겠죠.

포럼같은 웹 프로그램에 들어 있는 현재 접속자 수 표시가 바로 이런 방법으로 계산하고 있을겁니다.
포럼 + 여러가지 공개 웹 프로그램으로 사이트를 구성하여 사용하고 있는 경우라면
각각 따로 접속자 수를 계산하고 있을 겁니다. 즉 각 프로그램별로 중복되어 계산되어서
단순 덧셈으로는 해결되지 않는다는 문제도 발생합니다.
이럴 때 사용하는 동시접속자수 계산하는 오픈소스 프로그램이 있을 듯합니다.
또는 방문자 분석기 라던지요.

너무 복잡하게 설명드렸는지 모르겠네요.

덤으로...

웹에서의 접속자 수는 비지니스쪽에서만 의미가 있습니다.
서버관리의 측면에서 관심을 가져야 할 내용은 gccc님께서 말씀하신 것 처럼
서버의 리소스가 얼마나 사용되고 있는가 입니다.
특히 Disk I/O가 높은 경우 예를 들어서 하드디스크가 고장난다던지 리스크가 커집니다.

백업은 생명입니다!

gccc의 이미지

서버가 얼마나 더 버틸수 있을까 궁금하시다면 리소스별로 모니터링을 해보세요.

일반적으로 CPU, RAM, Disk I/O, 네트웍대역폭소모량의 네가지 리소스를 체크하여 어느 하나라도 최대값에 도달하면 서비스에 차질이 빚어지기 시작하죠.

이때 해당 리소스를 증설할것인지, 코드수정을 할것인지, 부하분산을 할것인지 등을 결정하면 됩니다.

CPU와 메모리는 모니터링중이시라니까 디스크IO와 네트웍 대역 사용정도만 확인해보시면 되겠네요.

네트웍 대역폭은 MRTG에서 기본 SNMP MIB으로 모니터링이 가능하구요, Disko I/O는 net-snmp에서 읽기/쓰기 횟수 및 트래픽을 확인 가능합니다.

웹서버와 디비를 한대의 서버에서 서비스할 경우 네트웍 커넥션, 웹서버 동접만으로 부하를 단정하기는 곤란할듯합니다.

싸이트 특성에따라 리소스 사용 패턴이 현저하게 다를 수 있기 때문에 네트웍 커넥션 갯수나 웹서버 동점갯수는 추이를 살피기 위해 과거와 비교하는 정도로 활용하시는것이 좋아보입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.