STON Media Server 완벽 가이드

저자:STON 개발팀
최신버전:v20.03.0

1부. 구성과 설정

1장. STON 미디어 서버

STON 미디어 서버(Media Server)는 스마트폰, 태블릿, 데스크탑, IPTV등 다양한 환경에 최고의 미디어 경험을 제공하는 차세대 미디어 전송 솔루션이다. 지난 10년간 모바일 기기 시장의 규모가 폭발함과 동시에 소비자의 높아진 눈높이를 만족시켜줄 고화질 미디어 서비스를 요구하는 목소리도 커져왔다. 미디어 인프라의 규모는 꾸준히 커져 왔지만 이를 적절히 뒷받침할만한 솔루션의 부재는 항상 과도한 투자와 낮은 효율성이라는 숙제를 남겼다.

STON 미디어 서버는 콘텐츠 소비자 뿐만 아니라 서비스 공급자의 요구를 적극적으로 수용하도록 개발되어, 서비스 운영사가 보다 손쉽고 경제적으로 서비스를 구축/운영할 수 있는 기반을 제공한다.

High Performance

역사적으로 미디어 시장은 폐쇄적인 개발/운영 환경과 벤더사에 종속된 프로토콜에 기대어 성장해왔다. 그러다보니 성능보다는 다양한 환경(클라이언트, 벤더, 프로토콜 등)에서 무리없이 동작하는 호환성이 중요했다. HTTP가 열심히 세상을 짚어 삼키는 와중에도 미디어 프로토콜 표준화와 시장의 선택은 더디기만 했다.

하지만 다양한 모바일기기의 등장은 미디어 서비스 제공자에게 "어느 기기에서나 동작하는" 시장적 표준을 요구했고, 시장은 이에 대해 MPEG4 , H.264 / H.265 , AAC / MP3 로 답했다. 이런 환경에서 이제 우리는 솔루션의 핵심 가치인 성능에 대해 이야기해야 한다.

기존 미디어 솔루션들을 한번이라도 다루어본 사용자라면 아래 열거된 문제점에 대해 공감할 것이다.

  • 낮은 동시 클라이언트 세션처리 능력
  • 10Gbps에 미달하는 낮은 네트워크 출력
  • 서버자원(코어, 메모리)에 비례하지 못하는 성능
  • 갑작스러운 성능저하

STON 미디어 서버는 기존 미디어 솔루션보다 월등한 성능을 자랑한다.

  • Multi-core CPU코어가 늘어날수록 더 높은 성능을 보장한다.
  • Native 64 bit 설계단계부터 64bit를 기반으로 개발되었다.
  • C/C++ 급작스러운 성능저하가 없다.

다음은 10Gbps환경에서 진행된 STON 미디어 서버의 Adobe RTMP 성능 테스트 리포트이다.

_images/sms_avalanche_rtmp.png

저화질(300Kbps)환경에서도 22,500세션으로 10Gbps를 출력한다.

STON 미디어 서버의 성능은 기존 솔루션 대비 성능에서 확연한 차이를 가진다.

  • 높은 동시 클라이언트 세션처리 능력
  • 물리적 NIC 한계 출력
  • 서버자원의 증설과 함께 높아지는 성능
  • 24/7 균일한 성능보장

Massive Media Delivery

STON 미디어 서버의 목적은 다양한 환경의 클라이언트에게 대규모로 미디어를 서비스(=전송)하는 것이다. 이미 대규모 CDN서비스에서 성능과 안정성이 입증된 STON 엣지 서버와 같은 코어를 공유하여 높은 내구성을 가질 뿐만 아니라, 다양하고 정교한 미디어 최적화를 통해 솔루션의 완성도를 한층 높였다.

  • Multi Protocol

    단일 미디어 콘텐츠를 HTTP Pseudo-Streaming, HTTP Live Streaming, RTMP로 동시에 스트리밍한다. URL이 Adobe Media Server와 호환되기 때문에 기존에 미디어 솔루션을 사용하던 사용자라면 쉽게 도입할 수 있다.

  • 10만 동시세션 처리

    STON이 자랑하는 고성능 아키텍처는 10만 동시세션을 처리할 수 있다. 뛰어난 동시처리 능력을 통해 서버의 물리적인 한계치까지 성능을 이끌어낼 수 있다.

  • 강력한 캐싱엔진

    Add-on으로 연동되는 여타의 솔루션과는 달리 STON 미디어 서버는 강력한 STON 캐싱 엔진을 기반으로 개발되었다. 모든 미디어 처리능력과 멀티 프로토콜 전송은 캐싱 엔진과 하나가 되어 더욱 강력한 성능을 발휘한다.

  • Cost-Effective Scalability

    앞서 언급한 모든 요소들이 종합될 때 진정으로 비용 경제성과 확장성이라는 두마리 토끼를 모두 잡을 수 있다. CDN 친화적인 HTTP 기반 미디어 프로토콜의 시장 점유율 확대나 2016년 Facebook Live 플랫폼 구축 사례에서 알 수 있듯이 캐싱기반의 미디어 전송아키텍처는 대규모 미디어 서비스의 새로운 패러다임을 제시한다.

Easy Operation

STON 미디어 서버는 솔루션을 제공하는 것을 넘어 도입, 운영, 분석, 과금, 장애대처에 이르기까지 고객에게 최고의 서비스를 제공한다.

  • 쉬운 사용성

    텍스트 편집기만 있다면 10분이면 누구든지 STON 미디어 서버를 운영할 수 있다. "지금껏 사용해본 가장 쉬운 솔루션" 이라는 모토아래 온라인 매뉴얼 뿐만 아니라 동영상 강좌를 제공한다.

  • 비용의 합리적 과금체계

    도입비이나 유지보수비 없이 월 단위로 사용한 만큼 비용을 지불하는 합리적인 과금체계를 가진다. 더불어 평생 무상 업데이트를 제공한다.

  • 실시간 모니터링

    모든 수치는 각 프로토콜별로 실시간으로 측정/제공된다. 사용자는 즉시 서비스 상태를 모니터링할 수 있을 뿐만 아니라 시간, 일, 월, 년 단위로 제공되는 RRD 그래프 API를 언제든지 상태를 열람할 수 있다.

  • 인터페이스

    직관적인 Web 인터페이스인 WM을 제공한다. 클러스터 기능을 활용하면 여러 서버라도 한번에 운영할 수 있다.

  • 엔터프라이즈 서포트

    (주)WineSOFT가 직접 개발하고 공급한다. 장애상황에 대한 대처 뿐만 아니라 서비스에 특화된 커스터마이징도 가능하다.

Work Flow

STON 미디어 서버를 이용하면 서비스 Work flow를 보다 간결하고 확장가능하도록 구축할 수 있다. 실시간 미디어 분석과 Packetizing은 STON 캐싱엔진을 통해 재활용되어 성능이 극대화된다.

_images/sms_intro_workflow1.png

단 1번만 Packetizing된다.

가상호스트를 통해 VOD와 LIVE 서비스를 통합하여 운영/모니터링할 수 있다.

_images/sms_intro_workflow2.png

캐싱을 통해 전송능력이 극대화된다.

Future Plan

가까운 시일내에 업데이트 될 기능목록.

  • MPEG-DASH Packetizing
  • H.265/HEVC
  • Adaptive Bitrate Streaming

2장. 서버구성과 설치

이 장에서는 시스템 구성/설치 그리고 예제 가상호스트까지 구성해본다 텍스트 편집기만 있으면 누구나 할 수 있다.

STON 미디어 서버는 표준 Linux 서버에서 동작하도록 개발되었다. 개발 단계부터 HW뿐만 아니라 OS, 파일시스템 등 종속성을 가질 수 있는 요소는 최대한 배제하였다. 고객이 합리적인 장비를 선택할 수 있도록 돕는 것은 매우 중요하다. 왜냐하면 서비스의 특성과 규모에 따라 적절한 서버를 구성하는 것이 서비스의 시작이기 때문이다.

서버 구성

CPU, 메모리, 디스크 자원에 대해 고려해야 한다.

  • CPU

    코어가 많을수록 더 많은 미디어에 대한 동시처리가 가능하다. 8코어 이상을 추천한다.

  • 메모리

    메모리-인덱싱 방식을 사용하므로 8GB이상을 권장한다. 자주 요청되는 파일은 항상 메모리에 상주하지만 그렇지 않은 파일은 디스크에서 로딩한다. 따라서 파일이 많고 집중도가 낮다면(Long-tail) 디스크 부하 증가로 성능이 저하될 수 있다. 파일 크기가 커서 디스크 I/O 부하가 높다면 메모리를 증설하거나 SSD를 선택하는 것이 좋은 옵션이 될 수 있다.

  • 디스크

    OS를 포함하여 최소 3개 이상을 권장한다. 디스크 역시 많으면 많을수록 많은 파일을 캐싱할 수 있을뿐만 아니라 I/O부하도 분산된다.

    _images/02_disk.png

    항상 OS와 STON은 콘텐츠와 별도의 디스크로 구성한다.

    일반적으로 OS가 설치된 디스크에 STON을 설치한다. 로그 역시 같은 디스크에 구성하는 것이 일반적이다. 로그는 서비스 상황을 실시간으로 기록하기 때문에 항상 Write부하가 발생한다.

    STON 미디어 서버는 디스크를 RAID 0처럼 사용한다. 성능과 RAID의 상관여부는 고객 서비스 특성에 따라 달라진다. 하지만 파일 변경이 빈번하지 않고 콘텐츠의 크기가 물리적 메모리 크기보다 훨씬 큰 경우 RAID를 통한 Read속도 향상이 효과적일 수 있다.

OS 구성

가장 기본적인 형태로 설치한다. 표준 64bit Linux 배포판(Cent 6.2이상, Ubuntu 10.04이상) 이라면 정상동작한다. 패키지 의존성을 가지지 않는다.

설치

  1. 최신버전의 STON 미디어 서버를 다운로드 받는다.

    [root@localhost ~]# wget  http://foobar.com/sms/STONMediaServer.1.0.0.rhel.2.6.32.x64.tar.gz
    --2017-02-24 13:29:14--  http://foobar.com/sms/STONMediaServer.1.0.0.rhel.2.6.32.x64.tar.gz
    Resolving foobar.com... 192.168.0.14
    Connecting to foobar.com|192.168.0.14|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 71340645 (68M) [application/x-gzip]
    Saving to: “STONMediaServer.1.0.0.rhel.2.6.32.x64.tar.gz”
    
    100%[===============================================>] 71,340,645  42.9M/s   in 1.6s
    
    2017-02-24 13:29:15 (42.9 MB/s) - “STONMediaServer.1.0.0.rhel.2.6.32.x64.tar.gz” saved [71340645/71340645]
    
  2. 압축을 해지한다.

    [root@localhost ~]# tar -zxf STONMediaServer.1.0.0.rhel.2.6.32.x64.tar.gz
    
  3. 설치 스크립트를 실행한다.

    [root@localhost ~]# ./STONMediaServer.1.0.0.rhel.2.6.32.x64.sh
    
  4. 설치과정은 install.log에 기록된다. 로그를 통해 설치 중 발생하는 문제를 알 수 있다.

    #Target: STON Media Server 1.0.0
    #Date: 2017.04.12 21:35:57
    Prepare for STON Media Server 1.0.0 install process
    [Copying files]
        `./start-stop-daemon' -> `/usr/sbin/start-stop-daemon'
        `./libtbbmalloc_proxy.so' -> `/usr/local/StonMediaServer/libtbbmalloc_proxy.so'
        `./libtbbmalloc_proxy.so.2' -> `/usr/local/StonMediaServer/libtbbmalloc_proxy.so.2'
        `./libtbbmalloc.so' -> `/usr/local/StonMediaServer/libtbbmalloc.so'
        `./libtbbmalloc.so.2' -> `/usr/local/StonMediaServer/libtbbmalloc.so.2'
        `./libtbb.so' -> `/usr/local/StonMediaServer/libtbb.so'
        `./libtbb.so.2' -> `/usr/local/StonMediaServer/libtbb.so.2'
        `./stonmd' -> `/usr/local/StonMediaServer/stonmd'
        `./stonmx' -> `/usr/local/StonMediaServer/stonmx'
        `./stonmr' -> `/usr/local/StonMediaServer/stonmr'
        `./stonmu' -> `/usr/local/StonMediaServer/stonmu'
        `./stonmp' -> `/usr/local/StonMediaServer/stonmp'
        `./stonmc' -> `/usr/local/StonMediaServer/stonmc'
        `./stonmapi' -> `/usr/local/StonMediaServer/stonmapi'
        `./server.xml.default' -> `/usr/local/StonMediaServer/server.xml.default'
        `./vhosts.xml.default' -> `/usr/local/StonMediaServer/vhosts.xml.default'
        `./stonm_format.sh' -> `/usr/local/StonMediaServer/stonm_format.sh'
        `./stonm_diskinfo.sh' -> `/usr/local/StonMediaServer/stonm_diskinfo.sh'
        `./stonm_cacheclear.sh' -> `/usr/local/StonMediaServer/stonm_cacheclear.sh'
        `./wm.sh' -> `/usr/local/StonMediaServer/wm.sh'
        `./LICENSE-3RD-PARTY.txt' -> `/usr/local/StonMediaServer/LICENSE-3RD-PARTY.txt'
    [Exporting config files]
        #Export so directory
        /usr/local/StonMediaServer/ to ld.so.conf
        #Export sysctl to /etc/sysctl.conf
        vm.swappiness=0
        vm.min_free_kbytes=524288
        #Export sudoers for WM
        Defaults    !requiretty
        stonmedia ALL=NOPASSWD: /etc/init.d/stonm stop, /etc/init.d/stonm start, /bin/ps -ef
    [Configuring STON Media Server daemon script]
        STON Media Server deamon activate in run-level 2345.
    [Installing sub-packages]
        curl installed.
        rrdtool installed.
    [Installing WM]
        Stopping WM...
        WM stopped
        `./wm.server_default.xml' -> `/usr/local/StonMediaServer/wm/tmp/conf/server_default.xml'
        `./wm.vhost_default.xml' -> `/usr/local/StonMediaServer/wm/tmp/conf/vhost_default.xml'
        Uncompress WM and PHP module
        WM installation almost complete. Changing WM privileges.
    Installation successfully complete
    

라이선스 발급

신규 고객의 경우 다음 절차를 통해 라이선스를 발급한다.

라이선스 파일(license.xml)이 반드시 설치경로에 존재해야 STON 미디어 서버가 정상적으로 구동된다.

업데이트

최신버전이 배포되면 stonu명령어로 업데이트할 수 있다.

./stonmu 1.1.0

또는 12장. WM (Web Management)최신버전 업데이트 를 통해 간편하게 업데이트를 진행할 수 있다.

_images/sms_wm_update.png

실행하기

STON 미디어 서버는 다음 경로에 설치된다.

/usr/local/StonMediaServer

다음 파일 중 하나라도 존재하지 않거나 XML문법에 맞지 않을 경우 실행되지 않는다.

  • license.xml
  • server.xml
  • vhosts.xml

최초 설치시 모든 XML파일이 존재하지 않는다. 배포받은 라이센스파일을 설치 경로에 복사한다. 그리고 설치경로의 server.xml.default와 vhosts.xml.default를 복사 또는 수정하여 설정하길 바란다. *.default파일은 항상 최신패키지와 함께 배포된다.

API 호출

HTTP 기반의 API를 제공한다. API 호출권한은 env-host 의 영향을 받는다. 허가되지 않았다면 곧바로 연결을 종료한다.

STON 미디어 서버 버전을 확인한다.

http://127.0.0.1:20040/version

같은 API를 Linux Shell에서 명령어로 수행한다.

./stonmapi version

하드웨어 정보조회

하드웨어 정보를 조회한다.

http://127.0.0.1:20040/monitoring/hwinfo

결과는 JSON형식으로 제공된다.

{
   "version": "1.0.0",
   "method": "hwinfo",
   "status": "OK",
   "result":
   {
      "OS" : "Linux version 3.3.0 ...(생략)...",
      "STON" : "1.0.0",
      "CPU" :
      {
         "ProcCount": "4",
         "Model": "Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz",
         "MHz": "1200.000",
         "Cache": "8192 KB"
      },
      "Memory" : "8 GB",
      "NIC" :
      [
         {
            "Dev" : "eth1",
            "Model" : "Intel Corporation 82574L Gigabit Network Connection",
            "IP" : "192.168.0.13",
            "MAC" : "00:25:90:36:f4:cb"
         }
      ],
      "Disk" :
      [
         {
            "Dev" : "sda",
            "Model" : "HP DG0146FAMWL (scsi)",
            "Total" : "238787584",
            "Usage" : "40181760"
         },
         {
            "Dev" : "sdb",
            "Model" : "HITACHI HUC103014CSS600 (scsi)",
            "Total" : "144706478080",
            "Usage" : "2101075968"
         },
         {
            "Dev" : "sdc",
            "Model" : "HITACHI HUC103014CSS600 (scsi)",
            "Total" : "144706478080",
            "Usage" : "2012160000"
         }
      ]
   }
}

재시작/종료

명령어를 통해 STON 미디어 서버를 재시작/종료할 수 있다. 의도하지 않은 결과를 피하기 위해 웹 페이지를 통한 확인작업이 반드시 필요하도록 개발되었다.

http://127.0.0.1:20040/command/restart
http://127.0.0.1:20040/command/restart?key=JUSTDOIT       // 즉시 실행
http://127.0.0.1:20040/command/terminate
http://127.0.0.1:20040/command/terminate?key=JUSTDOIT       // 즉시 실행

Caching 초기화

서비스를 중단하며 캐싱된 모든 컨텐츠를 삭제한다. 설정된 모든 디스크를 포맷하며 작업이 완료되면 다시 서비스를 재개한다.

http://127.0.0.1:20040/command/cacheclear
http://127.0.0.1:20040/command/cacheclear?key=JUSTDOIT       // 즉시 실행

콘솔에서는 다음 명령어를 통해 전체 또는 하나의 가상호스트를 초기화한다.

./stonmapi reset
./stonmapi reset/www.example.com

3장. 설정

이 장에서는 전반적인 설정구조에 대해 설명한다. 특히 서버 관리자를 위한 전역설정과 설정파일을 다루는 방법에 대해 상세히 다룬다. 구조를 정확히 이해해야 빠르고 정확하게 서버를 배치할 수 있을뿐만 아니라 장애상황을 유연하게 극복할 수 있다.

구조와 표현

STON 미디어 서버는 XML표현을 사용한다. 설정파일은 전역(server.xml)과 가상호스트(vhosts.xml)로 나뉜다.

_images/sms_conf_files.png

2개의 .xml파일이 전부입니다.

2개의 XML파일로 대부분의 서비스를 구성한다. 여러 TXT파일에는 가상호스트별 예외조건을 설정하는데, 특정기능의 목록을 작성하는데 사용된다.

다음처럼 완전한 형태의 XML을 예시하는 것은 매우 번거롭다.

<Server>
    <VHostDefault>
        <Options>
            <Http>
                <ClientKeepAliveSec>10</ClientKeepAliveSec>
            </Http>
        </Options>
    </VHostDefault>
</Server>

따라서 다음과 같이 축약된 표현을 사용한다.

# server.xml - <Server><VHostDefault><Options><Http>

<ClientKeepAliveSec>ON</ClientKeepAliveSec>

주석

라이센스(license.xml)는 설정이 아니다.

server.xml 전역설정

실행파일과 같은 경로에 존재하는 server.xml이 전역설정 파일이다. XML형식의 텍스트파일이다.

# server.xml

<Server>
    <Host> ... </Host>
    <Cache> ... </Cache>
    <VHostDefault> ... </VHostDefault>
</Server>

우선 전역설정의 구조와 간단한 기능위주로 설명한다. 접근제어나 SNMP등 전역설정에 위치하지만 덩치가 큰 기능들에 대해서는 각 주제를 다루는 장에서 설명한다.

관리자 설정

관리목적의 기능을 설정한다.

# server.xml - <Server>

<Host>
    <Name>stream_07</Name>
    <Admin>admin@example.com</Admin>
    <Manager Port="20040" HttpMethod="ON" Role="Admin" UploadMultipartName="confile">
        <Allow>192.168.1.1</Allow>
        <Allow Role="Admin">192.168.2.1-255</Allow>
        <Allow Role="User">192.168.3.0/24</Allow>
        <Allow Role="Looker">192.168.4.0/255.255.255.0</Allow>
    </Manager>
</Host>
  • <Name>

    서버 이름을 설정한다. 이름이 입력되지 않으면 시스템 이름을 사용한다.

  • <Admin>

    관리자 정보(메일 또는 이름)를 설정한다. 이 항목은 SNMP 조회목적으로만 사용된다.

  • <Manager>

    관리용도로 사용할 매니저 포트와 ACL(Access Control List)을 설정한다. ACL은 IP, IP범위, BitMask, Subnet 이상 네 가지 형식을 지원한다. 접속한 세션이 Allow로 접근이 허가된 IP가 아니면 접속을 차단한다. API를 호출하는 IP가 <Allow> 목록에 반드시 설정되어야 한다.

    접근조건에 따라 접근권한(Role)을 설정할 수 있다. 접근권한이 없는 요청에 대해서는 401 Unauthorized 로 응답한다. <Allow> 조건에 Role 속성을 명시적으로 선언하지 않을 경우 <Manager>Role 속성이 적용된다.

    기타 다음과 같은 자잘한 관리목적의 속성을 가진다.

    • HttpMethod
      • ON (기본) api-etc-httpmethod 호출시 ACL을 검사한다.
      • OFF api-etc-httpmethod 호출시 ACL을 검사하지 않는다.
    • UploadMultipartName api-conf-upload 의 변수명을 설정한다.

Storage 구성

Caching된 콘텐츠를 저장할 Storage를 구성한다.

# server.xml - <Server>

<Cache>
    <Storage DiskFailSec="60" DiskFailCount="10" OnCrash="hang">
        <Disk>/user/cache1</Disk>
        <Disk>/user/cache2</Disk>
        <Disk Quota="100">/user/cache3</Disk>
    </Storage>
</Cache>
  • <Storage>

    콘텐츠를 저장할 디스크를 설정한다. 하위 <Disk> 개수제한은 없다.

    디스크는 장애가 가장 많이 발생하는 장비이기 때문에 명확한 장애조건을 설정할 것을 권장한다. DiskFailSec (기본: 60초) 동안 DiskFailCount (기본: 10) 만큼 디스크 작업이 실패하면 해당 디스크는 자동으로 배제된다. 배제된 디스크 상태는 "Invalid"로 명시된다.

    모든 디스크가 배제될 수도 있는데 이 때의 동작방식은 OnCrash 속성으로 설정한다.

    • hang (기본) 장애 디스크를 모두 재투입한다. 정상 서비스를 기대한다기 보다는 원본을 보호하려는 목적이 강하다.
    • selfkill STON 미디어 서버를 종료시킨다.

각 디스크마다 최대 캐싱용량을 Quota (단위: GB) 속성으로 설정할 수 있다. 굳이 설정하지 않더라도 항상 디스크가 꽉 차지 않도록 LRU(Least Recently Used) 알고리즘에 의해 오래된 콘텐츠를 자동으로 삭제한다. 특별히 호환성에 문제가 있는 파일시스템은 없다. 그러므로 관리자가 친숙한 파일 시스템을 사용해도 성능에 큰 영향은 없다.

메모리 제한

사용할 최대 메모리와 컨텐츠 적재비율 설정한다.

# server.xml - <Server>

<Cache>
    <SystemMemoryRatio>100</SystemMemoryRatio>
    <ContentMemoryRatio>50</ContentMemoryRatio>
</Cache>
  • <SystemMemoryRatio> (기본: 100%)

    시스템 메모리에서 STON 미디어 서버가 사용할 최대 메모리를 비율로 설정한다. 예를 들어 16GB장비에서 이 수치를 50(%)으로 설정하면 시스템 메모리가 8GB인 것처럼 동작한다.

  • <ContentMemoryRatio> (기본: 50%)

    STON 미디어 서버는 디스크에서 로딩된 Body 데이터를 메모리에 최대한 Caching하여 서비스 품질을 향상시킨다. 서비스 형태에 따라 이 비율을 조절하여 품질을 최적화한다.

    _images/bodyratio1.png

    ContentMemoryRatio를 통해 메모리비율을 설정한다.

    예를 들어 4K 고화질 영상처럼 파일 Contents크기가 큰 서비스의 경우 File I/O 부하가 부담스럽다. 이런 경우 <ContentMemoryRatio> 를 높여서 보다 많은 Contents데이터가 메모리에 상주할 수 있도록 설정하면 서비스 품질을 높일 수 있다.

    _images/bodyratio2.png

    ContentMemoryRatio를 높이면 I/O가 감소한다.

기타 Caching 설정

기타 Caching서비스의 기반동작을 설정한다.

# server.xml - <Server>

<Cache>
    <Cleanup>
        <Time>02:00</Time>
        <Age>0</Age>
    </Cleanup>
    <Listen>0.0.0.0</Listen>
    <ConfigHistory>30</ConfigHistory>
</Cache>
  • <Cleanup>

    하루에 한 번 시스템 최적화를 수행한다. 최적화의 대부분은 디스크정리 작업으로 I/O 부하가 발생한다. 서비스 품질저하를 방지하기 위해 최적화는 조금씩 점진적으로 수행된다.

    • <Time> (기본: AM 2) Cleanup 수행시간을 설정한다. 오후 11시 10분을 설정하고 싶다면 23:10으로 설정한다.
    • <Age> (기본: 0, 단위: 일) 0보다 큰 경우, 일정 기간동안 한번도 접근되지 않은 콘텐츠를 삭제한다. 디스크를 미리 확보하여 서비스 시간 중 디스크 부족이 발생할 확률을 줄이기 위함이다.
  • <Listen>

    모든 가상호스트가 Listen할 IP목록을 지정한다. 모든 가상호스트의 기본 Listen설정인 *:80, *:1935는 0.0.0.0:80과 0.0.0.0:1935를 의미한다. 지정된 IP만을 열고 싶은 경우 다음과 같이 명확하게 설정한다.

    # server.xml - <Server>
    
    <Cache>
      <Listen>10.10.10.10</Listen>
      <Listen>10.10.10.11</Listen>
      <Listen>127.0.0.2</Listen>
    </Cache>
    
  • <ConfigHistory> (기본: 30일)

    STON 미디어서버는 설정이 변경될 때마다 모든 설정을 백업한다. 압축 후 ./conf/ 에 하나의 파일로 저장된다. 파일명은 "날짜_시간_HASH.tgz"로 생성된다.

    20170224_174843_D62CA26F16FE7C66F81D215D8C52266AB70AA5C8.tgz
    

    모든 설정이 완전히 동일하다면 같은 HASH값을 가진다. api-conf-restore 가 호출되도 새로운 설정으로 저장된다. 백업된 설정은 Cleanup시간을 기준으로 설정된 날만큼만 저장된다. 설정파일 저장의 날짜제한은 없다.

강제 Cleanup

API호출로 Cleanup한다. <Age> 를 파라미터로 입력할 수 있다.

http://127.0.0.1:20040/command/cleanup
http://127.0.0.1:20040/command/cleanup?age=10

<Age> 가 0이라면 디스크 공간이 부족하다고 판단될 때만 Cleanup을 수행한다. <Age> 파라미터가 0보다 크다면 해당 "일"동안 한번도 접근되지 않은 콘텐츠를 삭제한다.

가상호스트 기본설정

관리자는 각각의 가상호스트를 독립적으로 설정할 수 있다. 하지만 가상호스트를 생성할 때마다 동일한 설정을 반복하는 것은 매우 소모적이다. 모든 가상호스트는 <VHostDefault> 을 상속받는다.

_images/sms_conf_overriding1.png

별도로 명시하지 않은 설정은 <VHostDefault>의 값을 사용한다.

가상호스트 foo.com의 경우 별도로 덮어쓰기(Overriding)한 값이 없으므로 ClientKeepAliveSec 는 10, BufferSize 는 3이 된다. 반면 가상호스트 bar.com은 BufferSize 를 8로 덮어 쓰기(Overriding)했으므로 ClientKeepAliveSec 는 10, BufferSize 는 8이 된다. 관리자들은 보통 같은 서비스특성을 가지는 서비스를 한 서버에 같이 구성한다. 그러므로 상속은 매우 효과적인 방법이다.

<VHostDefault> 는 5개의 하위 태그를 가진다.

# server.xml - <Server>

<VHostDefault>
    <Options> ... </Options>
    <OriginOptions> ... </OriginOptions>
    <ContentTransform> ... </ContentTransform>
    <Stats> ... </Stats>
    <Log> ... </Log>
</VHostDefault>

설정 API

STON 미디어 서버는 설정과 관련된 많은 API를 제공한다.

http://127.0.0.1:20040/conf/{명령어}

적용

설정이 변경되면 관리자는 명확하게 API를 호출해야 한다. 시스템과 성능 관련설정을 제외한 대부분의 설정은 서비스 중단 없이 즉시 적용된다.

http://127.0.0.1:20040/conf/reload

설정이 변경될 때마다 admin-log-info 에 변경사항이 기록된다.

열람

서비스 중인 설정파일을 열람한다. txt파일들은 가상호스트(vhost)를 명확하게 지정해주어야 한다.

http://127.0.0.1:20040/conf/server.xml
http://127.0.0.1:20040/conf/vhosts.xml
http://127.0.0.1:20040/conf/querystring.txt?vhost=www.example.com
http://127.0.0.1:20040/conf/ttl.txt?vhost=www.example.com
http://127.0.0.1:20040/conf/http_headers.txt?vhost=www.example.com
http://127.0.0.1:20040/conf/http_throttling.txt?vhost=www.example.com

히스토리

백업된 설정목록을 열람한다.

http://127.0.0.1:20040/conf/latest
http://127.0.0.1:20040/conf/history

결과는 JSON 형식으로 제공된다. 빠르게 마지막 설정상태만 확인하고 싶은 경우는 /conf/latest를 사용할 것을 권장한다.

{
    "history" :
    [
        {
            "id" : "5",
            "conf-date" : "2017-02-25",
            "conf-time" : "15:26:37",
            "type" : "loaded",
            "size" : "16368",
            "hash" : "D62CA26F16FE7C66F81D215D8C52266AB70AA5C8",
            "ver": "1.0.0"
        },
        {
            "id" : "6",
            "conf-date" : "2017-02-26",
            "conf-time" : "07:02:21",
            "type" : "modified",
            "size" : "27544",
            "hash" : "F81D215D8C52266AB70AA5C8D62CA26F16FE7C66",
            "ver": "1.0.1"
        }
    ]
}
  • id 설정의 고유 아이디 (Reload할때마다 +1)
  • conf-date 설정 변경날짜
  • conf-time 설정 변경시간
  • type 설정이 반영된 형태 - loaded STON 미디어 서버가 시작될 때 - modified 설정이 (관리자 또는 WM에 의해) 변경될 때 - uploaded 설정파일 API를 통해 업로드 되었을 때 - restored 설정파일이 API를 통해 복구되었을 때
  • size 설정파일 크기
  • hash 설정파일을 SHA-1으로 hash한 값

복구

hash값 또는 id를 기준으로 원하는 시점의 설정으로 되돌린다. hash와 id가 모두 명시된 경우 hash값이 우선한다. 정상적으로 Rollback된 경우 200 OK, 실패한 경우 500 Internal Error로 응답한다.

http://127.0.0.1:20040/conf/restore?hash=...
http://127.0.0.1:20040/conf/restore?id=...

다운로드

hash값 또는 id를 기준으로 원하는 시점의 설정을 다운로드 한다. Content-Type은 "application/x-compressed"로 명시된다. hash와 id가 모두 명시된 경우 hash값이 우선하며, 해당 시점의 설정이 존재하지 않는 경우 404 NOT FOUND로 응답한다.

http://127.0.0.1:20040/conf/download?hash=...
http://127.0.0.1:20040/conf/download?id=...

업로드

설정파일을 HTTP Post방식(Multipart 지원)으로 업로드 한다.

http://127.0.0.1:20040/conf/upload

다음과 같이 주소, Content-Length, Content-Type(="multipart/form-data")이 명확하게 선언되어 있어야 한다.

POST /conf/upload
Content-Length: 16455
Content-Type: multipart/form-data; boundary=......

업로드가 완료되면 압축을 해지한 뒤 즉시 반영시킨다.

Multipart방식에서는 "confile"을 기본 이름으로 사용한다. 이 값은 <Manager>UploadMultipartName 속성에서 설정할 수 있다.

<form enctype="multipart/form-data" action="http://127.0.0.1:20040/conf/upload" method="POST">
    <input name="confile" type="file" />
    <input type="submit" value="Upload" />
</form>

2부. 멀티프로토콜 서비스

4장. 가상호스트

이 장에서는 가상호스트와 URL표현에 대해 설명한다. 가상호스트는 서비스의 기본단위로 vhosts.xml을 통해 설정하며 개수제한은 없다.

가상호스트가 생성되면 멀티프로토콜이 사용하는 포트(HTTP/HLS=80, RTMP=1935)가 오픈된다. 가상호스트 설정에 따라 제공되는 멀티프로토콜 URL(Uniform Resource Locator)표현이 조금씩 차이난다. 가상호스트는 클라이언트가 요청하는 URL을 통해 어떤 프로토콜을 사용해야 하는지 알 수 있다.

프로토콜에 따라 지원되는 미디어 포맷은 아래와 같다.

프로토콜 확장자 Video Codec Audio Codec
RTMP .mp4 H.264 AAC
Apple HLS .mp4 H.264 AAC
HTTP Pseudo-Streaming .mp4 H.264 AAC

생성/파괴

<Vhosts> 하위에 <Vhost> 로 가상호스트를 설정한다.

# vhosts.xml

<Vhosts>
    <Vhost Name="www.example.com"> ... </Vhost>
    <Vhost Name="/foo" Status="Active"> ... </Vhost>
    <Vhost Name="www.example.com/bar" Status="Inactive"> ... </Vhost>
    <Vhost Name="/foobar" Prefix="http/"> ... </Vhost>
</Vhosts>
  • <Vhost> 가상호스트를 설정한다.

    • Name 가상호스트 이름. 중복될 수 없으며 3가지 형태로 구성이 가능하다.

      • 도메인 (www.example.com)
      • 1 depth 디렉토리 (/foo)
      • 도메인 (www.example.com) + 1depth 디렉토리(/bar)
    • Status (기본: Active) Inactive인 경우 해당 가상호스트는 임시적으로 서비스되지 않는다.

    • Prefix 기존주소와 호환성을 맞추기 위한 문자열 설정

가상호스트가 생성되면 멀티프로토콜(HTTP, HLS, RTMP) 서비스가 기본으로 활성화된다.

주석

1 depth 디렉토리 Name 표현은 Adobe 미디어 서버의 Application과 같은 개념이다. RTMP 클라이언트는 URL의 첫번째 디렉토리를 Application으로 인식한다.

rtmp://www.example.com/mp4:1.mp4

위 주소로 재생을 요청할 경우 RTMP 클라이언트는 아래와 같이 Connect 하여 재생이 실패하게 된다.

_images/rtmp_invalid_connect.jpg

따라서 RTMP 서비스를 제공한다면 아래와 같이 1 depth 디렉토리 표현을 추가해야 한다.

rtmp://www.example.com/bar/mp4:1.mp4

<Vhost> 를 삭제하면 해당 가상호스트가 삭제된다. 삭제된 가상호스트의 모든 콘텐츠는 삭제된다. 다시 추가해도 콘텐츠는 되살아나지 않는다.

원본서버 주소

가상호스트는 원본서버에 저장된 미디어 콘텐츠를 멀티 프로토콜로 서비스하는 것이 목적이다. 서비스 형태에 맞게 다양하게 주소 표현이 가능하다.

<Vhosts>
    <Vhost Name="www.example.com">
        <Origin>
            <Address>1.1.1.1</Address>
            <Address>1.1.1.2</Address>
        </Origin>
    </Vhost>
</Vhosts>
  • <Address> 가상호스트가 콘텐츠를 복제 할 원본서버 주소. 개수제한은 없다. 주소가 2개 이상일 경우 Active/Active방식(Round-Robin)으로 선택된다. 원본서버 주소 포트가 80인 경우 생략할 수 있다.

예를 들어 다른 포트(8080)로 서비스되는 경우 1.1.1.1:8080과 같이 포트번호를 명시해야 한다. 주소는 {IP|Domain}{Port}{Path}형식으로 8가지 형식이 가능하다.

Address Host헤더
1.1.1.1 가상호스트명
1.1.1.1:8080 가상호스트명:8080
1.1.1.1/account/dir 가상호스트명
1.1.1.1:8080/account/dir 가상호스트명:8080
www.example.com www.example.com
www.example.com:8080 www.example.com:8080
www.example.com/account/dir www.example.com
www.example.com:8080/account/dir www.example.com:8080

HTTP 요청헤더 중 Host헤더를 별도로 설정하지 않는한 표의 Host헤더를 전송한다.

<Vhosts>
    <Vhost Name="www.example.com">
        <Origin>
            <Address>origin.com:8888/account/dir</Address>
        </Origin>
    </Vhost>
</Vhosts>

예를 들어 위와같이 설정하면 원본으로 다음과 같이 요청한다.

GET /trip.mp4 HTTP/1.1
Host: origin.com:8888

보조 주소

보조 원본서버를 설정한다.:

<Vhosts>
    <Vhost Name="www.example.com">
        <Origin>
            <Address>1.1.1.1</Address>
            <Address>1.1.1.2</Address>
            <Address2>1.1.1.3</Address2>
            <Address2>1.1.1.4</Address2>
        </Origin>
    </Vhost>
</Vhosts>
  • <Address2>

    모든 <Address> 가 정상동작하고 있다면 <Address2> 는 서비스에 투입되지 않는다. Active서버에 장애가 감지되면 해당 서버를 대체하기 위해 투입되며 Active서버가 복구되면 다시 Standby상태로 돌아간다. 만약 Standby서버에 장애가 감지되면 해당 Standby서버가 복구되기 전까지 서비스에 투입되지 않는다.

Alias

하나의 가상호스트를 여러 이름으로 서비스하고 싶다면 <Alias> 를 사용한다.

# vhosts.xml - <Vhosts>

<Vhost Name="www.example.com">
    <Alias>sample.com</Alias>
    <Alias>*.sub.example.com</Alias>
    <Alias>/myvideo</Alias>
</Vhost>
  • <Alias>

    가상호스트의 별명(Alias)을 설정하며 개수에 제한은 없다. 명확한 표현(sample.com)과 패턴표현(*.sub.example.com)을 지원한다. 패턴은 복잡한 정규표현식이 아닌 prefix에 * 표현을 하나만 붙일 수 있는 간단한 형식만을 지원한다.

가상호스트 검색 순서는 다음과 같다.

  1. <Vhost>Name 과 일치하는가?
  2. 명시적인 <Alias> 와 일치하는가?
  3. 패턴 <Alias> 를 만족하는가?

Default 가상호스트

클라이언트 요청을 처리할 가상호스트를 찾지못한 경우 서비스를 제공할 기본 가상호스트를 지정한다. 클라이언트 요청을 처리하고 싶지 않다면 설정하지 않아도 된다.

# vhosts.xml

<Vhosts>
    <Vhost Name="www.example.com"> ... </Vhost>
    <Vhost Name="/foo"> ... </Vhost>
    <Vhost Name="www.example.com/bar"> ... </Vhost>
    <Default>/foo</Default>
</Vhosts>
  • <Default>

    기본 가상호스트 이름을 설정한다. 반드시 <Vhost>Name 속성과 같아야 한다.

서비스 포트

프로토콜별로 서비스 포트를 설정한다. 기본 포트로 HTTP는 80, RTMP는 1935를 사용한다.

# vhosts.xml - <Vhosts>

<Vhost Name="www.example.com">
    <Listen>
      <Http>*:80</Http>
      <Rtmp>*:1935</Rtmp>
    </Listen>
</Vhost>

포트설정에 제한은 없지만, 이미 특정 프로토콜에 바인딩된 포트를 다른 프로토콜에서 열 수 없다.

# vhosts.xml - <Vhosts>

<Vhost Name="/foo">
    <Listen>
        <Http>*:80</Http>
        <Rtmp>*:1935</Rtmp>
    </Listen>
</Vhost>

<Vhost Name="www.example.com/bar">
    <Listen>
        <Http>*:8080</Http>   // 가능
        <Rtmp>*:80</Rtmp>     // 불가능 - 이미 HTTP에서 사용
    </Listen>
</Vhost>

목록조회

가상호스트 목록을 조회한다.

http://127.0.0.1:20040/monitoring/vhostslist

결과는 JSON형식으로 제공된다.

{
   "version": "1.0.0",
   "method": "vhostslist",
   "status": "OK",
   "result": [ "www.example.com","/foo", "www.example.com/bar" ]
}

5장. 멀티 프로토콜

이 장에서는 프로토콜 별 URL표현과 클라이언트 연결/요청을 세밀하게 처리하는 방법에 대해 설명한다.

# vhosts.xml

<Vhosts>
    <Vhost Name="www.example.com/bar">
        <Options>
            <Rtmp>...</Rtmp>
            <Http>...</Http>
            <Hls>...</Hls>
        </Options>
    </Vhost>
</Vhosts>

이 장의 모든 설정은 <Options> 하위 프로토콜에 따라 분류된다. 프로토콜마다 설정할 수 있는 범위가 다르지만 HTTP기반의 프로토콜(HLS, MPEG-DASH)은 많은 공통점을 가진다.

Adobe RTMP

STON 미디어 서버는 VOD 콘텐츠를 RTMP(Real Time Messaging Protocol)로 스트리밍할 수 있다. Adobe Flash Player의 NetConnection 객체를 이용해 연결하고 NetStream 객체를 통해 스트리밍한다. RTMP URL 형식은 다음과 같다.

rtmp://{virtual-host}/{stream-name}
rtmp://{ston-ip-address}/{virtual-host}/{stream-name}
  • {virtual-host} 가상호스트 Name
  • {stream-name} Prefix("mp4:", 생략가능)가 붙은 재생할 스트림
  • {ston-ip-address} STON 미디어 서버의 IP주소

NetConnection.connect 에서 사용해야 하는 URL은 가상호스트 Name 표현에 따라 달라진다.

<Vhost Name="..."> NetConnection.connect
www.example.com/bar rtmp://www.example.com/bar
www.example.com rtmp://www.example.com
/foo rtmp://{ston-ip-address}/foo

원본서버 URL이 /mov/trip.mp4인 경우 Stream주소는 다음과 같다.

mp4:mov/trip.mp4

<Vhost>Prefix 가 "http/" 로 설정된 경우 Stream주소는 다음과 같다.

mp4:http/mov/trip.mp4

주석

NetConnection 연결에서 별도의 설정없이 {virtual-host} 다음에 오는 _definst_ 표현을 인식한다.

rtmp://www.example.com/bar/_definst_
rtmp://www.example.com/_definst_
rtmp://{ston-ip-address}/foo/_definst_

세션

RTMP 클라이언트 세션에 대해 설정한다.

# server.xml - <Server><VHostDefault><Options><Rtmp>
# vhosts.xml - <Vhosts><Vhost><Options><Rtmp>


<BufferSize>3</BufferSize>
<ClientKeepAliveSec>10</ClientKeepAliveSec>
  • <BufferSize> (기본: 3초) PLAY가 시작되면 설정된 시간(초)만큼을 대역폭 제한없이 클라이언트에게 전송한다.
  • <ClientKeepAliveSec> (기본: 10초) 아무런 통신이 없는 상태로 설정된 시간(초)이 경과하면 RTMP 클라이언트에게 Ping Request을 보낸다. RTMP 클라이언트가 Ping Response를 보내지 않으면 연결을 종료한다.

HTTP Pseudo-Streaming

STON 미디어 서버는 VOD 콘텐츠를 HTTP Pseudo-Streaming으로 전송할 수 있다. 서비스 효율을 높이는 다양한 기능이 제공된다.

  • VOD 콘텐츠를 분석하여 가장 경제적인 대역폭으로 전송
  • VOD 콘텐츠의 헤더가 뒤에 있어도 전송 단계에서 앞으로 재배치
  • 요청 즉시 캐싱/전송되는 빠른 반응성과 성능

HTTP Pseudo-Streaming의 URL형식은 다음과 같다.

http://{virtual-host}/{stream-name}
http://{ston-ip-address}/{virtual-host}/{stream-name}
  • {virtual-host} 가상호스트 Name
  • {stream-name} Prefix("MP4:", 생략가능)가 붙은 재생할 스트림
  • {ston-ip-address} STON 미디어 서버의 IP주소

URL은 가상호스트 Name 표현에 따라 달라진다. 예를 들어 원본서버 URL이 /mov/trip.mp4인 경우 URL는 다음과 같다.

<Vhost Name="..."> URL
www.example.com/bar http://www.example.com/bar/mp4:mov/trip.mp4
www.example.com http://www.example.com/mp4:mov/trip.mp4
/foo http://{ston-ip-address}/foo/mp4:mov/trip.mp4

<Vhost>Prefix 가 "http/" 로 설정된 경우 URL은 다음과 같다.

<Vhost Name="..." Prefix="http/"> URL
www.example.com/bar http://www.example.com/bar/mp4:http/mov/trip.mp4
www.example.com http://www.example.com/mp4:http/mov/trip.mp4
/foo http://{ston-ip-address}/foo/mp4:http/mov/trip.mp4

주석

URL에서 별도의 설정없이 {virtual-host} 다음에 오는 _definst_ 표현을 인식한다.

http://www.example.com/bar/_definst_/mp4:mov/trip.mp4
http://www.example.com/_definst_/mp4:mov/trip.mp4
http://{ston-ip-address}/foo/_definst_/mp4:mov/trip.mp4

세션

HTTP 클라이언트가 요청을 보내고 응답이 완료되기 까지를 HTTP 트랜잭션이라고 부른다. HTTP 클라이언트는 하나의 연결을 통해 여러 번의 HTTP 트랜잭션을 진행한다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<ClientKeepAliveSec>10</ClientKeepAliveSec>
<ConnectionHeader>keep-alive</ConnectionHeader>
<KeepAliveHeader Max="0">ON</KeepAliveHeader>
  • <ClientKeepAliveSec> (기본: 10초) 아무런 통신이 없는 상태로 설정된 시간이 경과하면 연결을 종료한다.
  • <ConnectionHeader> (기본: keep-alive) HTTP 클라이언트에게 보내는 응답의 Connection헤더( keep-alive 또는 close )를 설정한다.
  • <KeepAliveHeader>
    • ON (기본) HTTP응답에 Keep-Alive헤더를 명시한다. Max (기본: 0) 를 0보다 크게 설정하면 Keep-Alive헤더의 값으로 Max 값이 명시된다. 이후 HTTP 트랜잭션이 진행될때마다 1씩 차감된다.
    • OFF HTTP응답에 Keep-Alive헤더를 생략한다.

연결 유지정책

HTTP 연결 유지정책은 Apache의 정책을 따른다. HTTP 헤더 값에 따른 변수가 많아 다소 복잡하다.

  • HTTP 클라이언트 요청에 명시된 Connection헤더 ("Keep-Alive" 또는 "Close")
  • 가상호스트 <ConnectionHeader> 설정
  • 가상호스트 연결 Keep-Alive시간 설정
  • 가상호스트 <Keep-Alive> 설정
  1. HTTP 클라이언트 요청에 "Connection: Close"로 명시되어 있는 경우

    GET / HTTP/1.1
    ...(생략)...
    Connection: Close
    

    이같은 요청에 대해서는 가상호스트 설정여부와 상관없이 "Connection: Close"로 응답한다. Keep-Alive헤더는 명시되지 않는다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Close
    

    이 HTTP 트랜잭션이 완료되면 HTTP 연결을 종료한다.

  2. <ConnectionHeader>Close 로 설정된 경우

    # server.xml - <Server><VHostDefault><Options><Http>
    # vhosts.xml - <Vhosts><Vhost><Options><Http>
    
    <ConnectionHeader>Close</ConnectionHeader>
    

    HTTP 클라이언트 요청과 상관없이 "Connection: Close"로 응답한다. Keep-Alive헤더는 명시되지 않는다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Close
    
  3. <KeepAliveHeader>OFF 로 설정된 경우

    # server.xml - <Server><VHostDefault><Options><Http>
    # vhosts.xml - <Vhosts><Vhost><Options><Http>
    
    <ConnectionHeader>Keep-Alive</ConnectionHeader>
    <KeepAliveHeader>OFF</KeepAliveHeader>
    

    Keep-Alive헤더가 명시되지 않는다. HTTP 연결은 지속적으로 재사용가능하다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Keep-Alive
    
  4. <KeepAliveHeader>ON 으로 설정된 경우

    # server.xml - <Server><VHostDefault><Options><Http>
    # vhosts.xml - <Vhosts><Vhost><Options><Http>
    
    <HttpClientKeepAliveSec>10</HttpClientKeepAliveSec>
    <ConnectionHeader>Keep-Alive</ConnectionHeader>
    <KeepAliveHeader>ON</KeepAliveHeader>
    

    Keep-Alive헤더가 명시된다. timeout값은 연결 Keep-Alive시간 설정을 사용한다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Keep-Alive
    Keep-Alive: timeout=10
    
  5. <KeepAliveHeader>Max 속성이 설정된 경우

    # server.xml - <Server><VHostDefault><Options><Http>
    # vhosts.xml - <Vhosts><Vhost><Options><Http>
    
    <HttpClientKeepAliveSec>10</HttpClientKeepAliveSec>
    <ConnectionHeader>Keep-Alive</ConnectionHeader>
    <KeepAliveHeader Max="50">ON</KeepAliveHeader>
    

    Keep-Alive헤더에 max값을 명시한다. 이 연결은 max회만큼 사용이 가능하며 HTTP 트랜잭션이 진행될때마다 1씩 감소된다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Keep-Alive
    Keep-Alive: timeout=10, max=50
    
  6. Keep-Alive의 max가 만료된 경우

    위의 설정대로 max가 설정되었다면 max는 점차 줄어 다음처럼 1까지 도달하게 된다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Keep-Alive
    Keep-Alive: timeout=10, max=1
    

    이 응답은 현재 연결으로 앞으로 1번 HTTP 트랜잭션 진행이 가능하다는 의미이다. 이 연결으로 HTTP 요청이 한번 더 진행될 경우 다음과 같이 "Connection: Close"로 응답한다.

    HTTP/1.1 200 OK
    ...(생략)...
    Connection: Close
    

MP4 헤더위치 변경

MP4파일의 헤더가 뒤에 있다면 플레이어에 따라 HTTP Pseudo-Streaming이 원활하지 않을 수 있다. 전송 단계에서 헤더 위치를 앞으로 배치하면 이런 문제를 해결할 수 있다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<UpfrontMP4Header>ON</UpfrontMP4Header>
  • <UpfrontMP4Header>
    • ON (기본) 확장자가 .mp4, .m4a인 파일의 헤더가 뒤에 있다면 앞으로 옮겨서 전송한다.
    • OFF 아무 것도 하지 않는다.

처음 요청되는 콘텐츠의 헤더를 앞으로 옮겨야 한다면 필요한 부분을 우선적으로 다운로드 받는다. 헤더위치 변경은 전송단계에서만 발생할 뿐 원본의 형태를 변경하거나 별도의 저장공간을 사용하지 않는다.

주석

분석할 수 없거나 깨진 파일이라면 원본형태 그대로 서비스된다.

Bandwidth Throttling

Bandwidth Throttling(이하 쓰로틀링)이란 (각 연결마다) 대역폭을 최적화하여 전송하는 기능이다. 일반적인 미디어 파일의 내부는 다음과 같이 헤더, V(Video), A(Audio)로 구성되어 있다.

_images/conf_media_av.png

헤더는 쓰로틀링의 대상이 아니다.

헤더는 재생시간이 길거나 키 프레임(Key Frame)주기가 짧을수록 커진다. 그러므로 인식할 수 있는 미디어 파일이라면 원활한 재생을 위해 헤더는 대역폭 제한없이 전송한다. 다음 그림처럼 헤더가 완전히 전송된 뒤 쓰로틀링이 시작된다.

_images/conf_bandwidththrottling2.png

최적화된 대역폭 활용

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<BandwidthThrottling>
   <Settings>
      <Bandwidth Unit="kbps">2000</Bandwidth>
      <Ratio>150</Ratio>
      <Boost>5</Boost>
   </Settings>
   <Throttling>ON</Throttling>
</BandwidthThrottling>

<BandwidthThrottling> 태그 하위에 기본동작을 설정한다.

  • <Settings>

    기본 동작을 설정한다.

    • <Bandwidth> (기본: 2000 Kbps) 클라이언트 전송 대역폭을 설정한다. Unit 속성을 통해 기본 단위( kbps , mbps , bytes , kb , mb )를 설정한다.
    • <Ratio> (기본: 150 %) <Bandwidth> 설정에 비율을 반영하여 대역폭을 설정한다.
    • <Boost> (기본: 5 초) 일정 시간만큼의 데이터를 속도제한 없이 클라이언트에게 전송한다. 데이터의 양은 <Boost> X <Bandwidth> X <Ratio> 공식으로 계산한다.
  • <Throttling>

    • ON (기본) 조건목록과 일치하면 쓰로틀링을 적용한다.
    • OFF 쓰로틀링을 적용하지 않는다. 최대 속도로 전송한다.

쓰로틀링은 조건목록을 설정해야 동작한다. 설정된 순서대로 우선순위를 가진다. 전송 정책은 /svc/{가상호스트 이름}/http_throttling.txt 에 설정한다.

# /svc/www.example.com/http_throttling.txt
# 구분자는 콤마(,)이며 {조건},{Bandwidth},{Ratio},{Boost} 순서로 표기한다.
# {조건}을 제외한 모든 필드는  생략가능하다.
# 생략된 필드는 ``<Settings>`` 에 설정된 기본 값을 사용한다.
# 모든 조건표현은 acl.txt설정과 동일하다.
# {Bandwidth} 단위는 ``<Settings>`` ``<Bandwidth>`` 의 ``Unit`` 속성을 사용한다.

# 3초의 데이터를 속도 제한없이 전송한 후 3Mbps(3000Kbps = 2000Kbps X 150%)로 클라이언트에게 전송한다.
$IP[192.168.1.1], 2000, 150, 3

# bandwidth만 정의. 5(기본)초의 데이터를 속도 제한없이 전송한 후 800 Kbps로 클라이언트에게 전송한다.
!HEADER[referer], 800

# boost만 정의. 10초의 데이터를 속도 제한없이 전송한 후 1000 Kbps로 클라이언트에게 전송한다.
HEADER[cookie], , , 10

# 확장자가 m4a인 경우 쓰로틀링을 적용하지 않는다.
$URL[*.m4a], no

미디어 파일(MP4, M4A, MP3)을 분석하면 Encoding Rate로부터 Bandwidth를 얻을 수 있다. 접근되는 콘텐츠의 확장자는 반드시 .mp4, .m4a, .mp3 중 하나여야 한다. 동적으로 Bandwidth를 추출하려면 다음과 같이 Bandwidth뒤에 x 를 붙인다.

# /vod/*.mp4 파일에 대한 접근이라면 bandwidth를 구한다. 구할 수 없다면 1000Kbps을 bandwidth로 사용한다.
$URL[/vod/*.mp4], 1000x, 120, 5

# user-agent헤더가 없다면 bandwidth를 구한다. 구할 수 없다면 500Kbps을 bandwidth로 사용한다.
!HEADER[user-agent], 500x

# /low_quality/* 파일에 대한 접근이라면 bandwidth를 구한다. 구할 수 없다면 기본 값을 bandwidth로 사용한다.
$URL[/low_quality/*], x, 200

HTTP QueryString을 사용하여 <Bandwidth> , <Ratio> , <Boost> 를 URL로 지정할 수 있다. QueryString 조건은 http_throttling.txt보다 우선한다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<BandwidthThrottling>
   <Settings>
      <Bandwidth Param="mybandwidth" Unit="mbps">2</Bandwidth>
      <Ratio Param="myratio">100</Ratio>
      <Boost Param="myboost">3</Boost>
   </Settings>
   <Throttling QueryString="ON">ON</Throttling>
</BandwidthThrottling>
  • <Bandwidth> , <Ratio> , <Boost>Param

    용도별 HTTP QueryString 키를 설정한다.

  • <Throttling>QueryString

    • ON (기본) QueryString으로 조건을 재정의한다.
    • OFF QueryString으로 조건을 재정의하지 않는다.

위와 같이 설정되어 있다면 다음과 같이 클라이언트가 요청한 URL에 따라 쓰로틀링이 동적으로 설정된다.

# 10초의 데이터를 속도 제한없이 전송한 후 1.3Mbps(1mbps X 130%)로 클라이언트에게 전송한다.
http://www.example.com/bar/mp4:trip.mp4?myboost=10&mybandwidth=1&myratio=130

반드시 모든 파라미터를 명시할 필요는 없다.

http://www.example.com/bar/mp4:trip.mp4?myratio=150

위와 같이 일부 조건이 생략된 경우 나머지 조건(여기서는 bandwidth, boost)을 결정하기 위해 조건목록을 검색한다. 여기서도 적합한 조건을 찾지 못하는 경우 <Settings> 에 설정된 기본 값을 사용한다. QueryString이 일부 존재하더라도 조건목록에서 미적용 옵션(no)이 설정되어 있다면 쓰로틀링은 적용되지 않는다.

QueryString을 사용하므로 자칫 QueryString 구분 과 혼동을 일으킬 소지가 있다. QueryString 구분ON 인 경우 클라이언트가 요청한 URL의 QueryString이 모두 인식되지만 BoostParam , BandwidthParam , RatioParam 은 제외된다.

GET /bar/mp4:trip.mp4?mybandwidth=2000&myratio=130&myboost=10
GET /bar/mp4:trip.mp4?tag=3277&myboost=10&date=20170331

예를 들어 위와 같은 입력은 쓰로틀링 정책을 결정하는데 쓰일 뿐 Caching-Key를 생성하거나 HTTP 원본서버로 요청을 보낼 때는 제거된다. 즉 각각 다음과 같이 인식된다.

GET /trip.mp4
GET /trip.mp4?tag=3277&date=20170331

요청/응답 헤더변경

HTTP 클라이언트 요청과 응답을 특정 조건에 따라 변경한다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<ModifyHeader FirstOnly="OFF">OFF</ModifyHeader>
  • <ModifyHeader>
    • OFF (기본) 변경하지 않는다.
    • ON 헤더 변경조건에 따라 헤더를 변경한다.

헤더 변경시점을 정확히 이해하자.

  • HTTP 요청헤더 변경시점

    HTTP 요청을 최초로 인식하는 시점에 헤더를 변경한다. 헤더가 변경되었다면 변경된 상태로 Cache 모듈에서 처리된다. 단, Host헤더와 URI는 변경할 수 없다.

  • HTTP 응답헤더 변경시점

    HTTP 응답 직전에 헤더를 변경한다. 단, Content-Length는 변경할 수 없다.

헤더 변경조건은 /svc/{가상호스트 이름}/http_headers.txt에 설정한다. 헤더는 멀티로 설정이 가능하므로 조건과 일치한다면 모든 변경설정이 순차적으로 모두 적용된다.

최초 조건에만 변경을 원할 경우 FirstOnly 속성을 ON 으로 설정한다. 서로 다른 조건이 같은 헤더를 변경하는 경우 set 에 의해 Last-Win이 되거나 명시적으로 put append 할 수 있다.

# /svc/www.example.com/http_headers.txt
# 구분자는 콤마(,)이다.

# 요청변경
# {Match}, {$REQ}, {Action(set|put|append|unset)} 순서로 표기한다.
$IP[192.168.1.1], $REQ[SOAPAction], unset
$IP[192.168.2.1-255], $REQ[accept-encoding: gzip], set
$IP[192.168.3.0/24], $REQ[cache-control: no-cache], append
$IP[192.168.4.0/255.255.255.0], $REQ[x-custom-header], unset
$IP[AP], $REQ[X-Forwarded-For], unset
$HEADER[user-agent: *IE6*], $REQ[accept-encoding], unset
$HEADER[via], $REQ[via], unset
$URL[/source/*.zip], $REQ[accept-encoding: deflate], set

# 응답변경
# {Match}, {$RES}, {Action(set|put|append|unset)}, {condition} 순서로 표기한다.
# {condition}은 특정 응답코드에 한하여 헤더를 변경할 수 있지만 필수는 아니다.
$IP[192.168.1.1], $RES[via: STON for CDN], set
$IP[192.168.2.1-255], $RES[X-Cache], unset, 200
$IP[192.168.3.0/24], $RES[cache-control: no-cache, private], append, 3xx
$IP[192.168.4.0/255.255.255.0], $RES[x-custom-header], unset
$HEADER[user-agent: *IE6*], $RES[vary], unset
$HEADER[x-custom-header], $RES[cache-control: no-cache, private], append, 5xx
$URL[/source/*], $RES[cache-control: no-cache], set, 404
/secure/*.dat, $RES[x-custom], unset, 200
/*.mp4, $RES[Access-Control-Allow-Origin: example1.com], set
/*.mp4, $RES[Access-Control-Allow-Origin: example2.com], put

{Match}는 IP, GeoIP, Header, URL 4가지로 설정이 가능하다.

  • IP $IP[...]로 표기하며 IP, IP Range, Bitmask, Subnet 네 가지 형식을 지원한다.
  • GeoIP $IP[...]로 표기하며 반드시 GeoIP 가 설정되어 있어야 한다. 국가코드는 ISO 3166-1 alpha-2ISO 3166-1 alpha-3 를 지원한다.
  • Header $HEADER[Key : Value]로 표기한다. Value는 명확한 표현과 패턴을 지원한다. Value가 생략된 경우에는 Key에 해당하는 헤더의 존재유무를 조건으로 판단한다.
  • URL $URL[...]로 표기하며 생략이 가능하다. 명확한 표현과 패턴을 인식한다.

{$REQ}와 {$RES}는 헤더변경 방법을 설정한다. set put append 의 경우 {Key: Value}로 설정하며, Value가 입력되지 않은 경우 빈 값("")이 입력된다. unset 의 경우 {Key}만 입력한다.

{Action}은 set , put , append , unset 4가지로 설정이 가능하다.

  • set 요청/응답 헤더에 설정되어 있는 Key와 Value를 헤더에 추가한다. 이미 같은 Key의 Value 존재한다면 새로운 Value로 덮어쓴다.
  • put ( set 과 유사하나) 같은 Key가 존재하면, 덮어쓰지 않고 새로운 라인으로 붙여 넣는다.
  • append ( set 과 유사하나) 같은 Key가 존재하면, 기존의 Value와 설정된 Value사이에 Comma(,)로 구분하여 값을 결합한다.
  • unset 요청/응답 헤더에 설정되어 있는 Key에 해당하는 헤더를 삭제한다.

{Condition}은 200이나 304같은 구체적인 응답 코드외에 2xx, 3xx, 4xx, 5xx처럼 응답코드 계열조건으로 설정한다. {Match}와 일치하더라도 {Condition}과 일치하지 않는다면 변경이 반영되지 않는다. {Condition}이 생략된 경우 응답코드를 검사하지 않는다.

Accept-Encoding 헤더

같은 URL에 대한 HTTP요청이라도 Accept-Encoding헤더의 존재 유무에 따라 다른 콘텐츠가 캐싱될 수 있다. 원본서버에 요청을 보내는 시점에 압축여부를 알 수 없다. 응답을 받았다고해도 압축여부를 매번 비교할 수도 없다.

_images/sms_acceptencoding2.png

URL은 같지만 다른 파일로 인식하여 중복캐싱될 수 있다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<AcceptEncoding>ON</AcceptEncoding>
  • <AcceptEncoding>
    • ON (기본) HTTP 클라이언트가 보내는 Accept-Encoding 헤더를 인식한다.
    • OFF HTTP 클라이언트가 보내는 Accept-Encoding 헤더를 무시한다.

원본서버에서 압축을 지원하지 않거나, 압축이 필요없는 대용량 파일의 경우 OFF 로 설정하는 것이 바람직하다.

Server 헤더

HTTP 클라이언트에게 보내는 HTTP 응답에 Server 헤더 명시여부를 설정한다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<ServerHeader>ON</ServerHeader>
  • <ServerHeader>
    • ON (기본) 원본서버의 Server헤더를 명시한다.
    • OFF Server헤더를 생략한다.

원본 비표준 헤더

성능과 보안상의 이유로 원본서버가 보내는 헤더 중 표준헤더만을 선택적으로 인식한다.

# server.xml - <Server><VHostDefault><Options><Http>
# vhosts.xml - <Vhosts><Vhost><Options><Http>

<OriginalHeader>OFF</OriginalHeader>
  • <OriginalHeader>
    • OFF (기본) 표준헤더가 아니라면 무시한다.
    • ON cookie, set-cookie, set-cookie2를 제외한 모든 헤더를 저장하여 클라이언트에게 전달한다. 단, 메모리와 저장비용을 좀 더 소비한다.

Apple HLS

STON 미디어 서버는 VOD 콘텐츠를 HLS(HTTP Live Streaming)로 전송할 수 있다. HLS는 "Cupertino" 스트리밍이라고도 알려져 있지만 정확히 말하면 스트리밍이 아닌 HTTP 기반의 Chunk전송방식이다.

_images/sms_hls_flow2.png

Apple이 제공하는 iOS 기반의 디바이스(iPhone, iPad, iPod touch iOS version 3.0 이상), QuickTime 플레이어 (버전 10이상), Safari 브라우저 (버전 4.0 이상)에서 폭넓게 지원된다.

주석

Apple HLS는 Android에서도 지원되지만 일부 구버전 호환성 문제가 있다. JWPlayer - The Pain of Live Streaming on Android 참고.

STON 미디어 서버는 약속된 주소를 이용해 VOD 콘텐츠로부터 인덱스/메타 파일과 MPEG2-TS Chunk를 만들어낸다. HLS의 URL 형식은 다음과 같다.

http://{virtual-host}/{stream-name}/playlist.m3u8
http://{ston-ip-address}/{virtual-host}/{stream-name}/playlist.m3u8
  • {virtual-host} 가상호스트 Name
  • {stream-name} Prefix("MP4:", 생략가능)가 붙은 재생할 스트림
  • {ston-ip-address} STON 미디어 서버의 IP주소

URL은 가상호스트 Name 표현에 따라 달라진다. 예를 들어 원본서버 URL이 /mov/trip.mp4인 경우 URL는 다음과 같다.

<Vhost Name="..."> URL
www.example.com/bar http://www.example.com/bar/mp4:mov/trip.mp4/playlist.m3u8
www.example.com http://www.example.com/mp4:mov/trip.mp4/playlist.m3u8
/foo http://{ston-ip-address}/foo/mp4:mov/trip.mp4/playlist.m3u8

<Vhost>Prefix 가 "http/" 로 설정된 경우 URL은 다음과 같다.

<Vhost Name="..." Prefix="http/"> URL
www.example.com/bar http://www.example.com/bar/mp4:http/mov/trip.mp4/playlist.m3u8
www.example.com http://www.example.com/mp4:http/mov/trip.mp4/playlist.m3u8
/foo http://{ston-ip-address}/foo/mp4:http/mov/trip.mp4/playlist.m3u8

모든 인덱스/Chunk 파일은 동적으로 생성되며 별도의 저장공간을 소비하지 않는다. 서비스 즉시 임시적으로 생성되며 서비스되지 않을 때 자동으로 없어진다.

주석

URL에서 별도의 설정없이 {virtual-host} 다음에 오는 _definst_ 표현을 인식한다.

http://www.example.com/bar/_definst_/mp4:mov/trip.mp4/playlist.m3u8
http://www.example.com/_definst_/mp4:mov/trip.mp4/playlist.m3u8
http://{ston-ip-address}/foo/_definst_/mp4:mov/trip.mp4/playlist.m3u8

세션

# server.xml - <Server><VHostDefault><Options><Hls>
# vhosts.xml - <Vhosts><Vhost><Options><Hls>

<ClientKeepAliveSec>30</ClientKeepAliveSec>
  • <ClientKeepAliveSec> (기본: 30초) 아무런 통신이 없는 상태로 설정된 시간이 경과하면 연결을 종료한다.

Packetizing

MPEG2-TS(Transport Stream)로 Packetizing하고 인덱스 파일을 구성하는 정책을 설정한다.

# server.xml - <Server><VHostDefault><Options><Hls>
# vhosts.xml - <Vhosts><Vhost><Options><Hls>

<Packetizing Status="Active">
   <Index Ver="3" Alternates="ON">index.m3u8</Index>
   <Sequence>0</Sequence>
   <Duration>10</Duration>
   <AlternatesName>playlist.m3u8</AlternatesName>
   <MP4Tracks Param="">All</MP4Tracks>
   <MP3SegmentType>TS</MP3SegmentType>
</Packetizing>
  • <Packetizing>

    • Status (기본: Active) 값이 Inactive 라면 Packetizing하지 않고 원본서버의 HLS 파일들을 릴레이한다.
  • <Index> (기본: index.m3u8) HLS 인덱스(.m3u8) 파일명

    • Ver (기본 3) 인덱스 파일 버전. 3인 경우 #EXT-X-VERSION:3 헤더가 명시되며 #EXTINF 의 시간 값이 소수점 3째 자리까지 표시된다. 1인 경우 #EXT-X-VERSION 헤더가 없으며, #EXTINF 의 시간 값이 정수(반올림)로 표시된다.

    • Alternates (기본: ON) Stream Alternates 사용여부.

      _images/hls_alternates_on.png

      ON. <AlternatesName> 에서 TS목록을 서비스한다.

      _images/hls_alternates_off.png

      OFF. <Index> 에서 TS목록을 서비스한다.

  • <Sequence> (기본: 0) .ts 파일의 시작 번호. 이 수를 기준으로 순차적으로 증가한다.

  • <Duration> (기본: 10초) 콘텐츠를 분할(Segmentation)하는 기준 시간(초). 분할의 기준은 Video/Audio의 KeyFrame이다. KeyFrame은 들쭉날쭉할 수 있으므로 정확히 분할되지 않을 수 있다. 만약 10초로 분할하려는데 KeyFrame이 9초와 12초에 있다면 가까운 값(9초)을 선택한다.

  • <AlternatesName> (기본: playlist.m3u8) Stream Alternates 파일명.

    http://www.example.com/bar/mp4:trip.mp4/playlist.m3u8
    
  • <MP4Tracks>

    • All (기본) MP4파일에서 비디오/오디오를 Packetizing한다.
    • AudioOnly MP4파일에서 오디오만 Packetizing한다.
    • VideoOnly MP4파일에서 비디오만 Packetizing한다.

    기본 값 설정보다 Param 속성 설정을 통해 QueryString으로 선택적으로 Packetizing 할 수 있다. 다음은 <MP4Trakcs Param="tracks">All</MP4Tracks> 로 설정한 예제이다.

    // 기본 (=전체재생)
    http://www.example.com/mp4:trip.mp4/index.m3u8
    http://www.example.com/mp4:trip.mp4/index.m3u8?tracks=all
    
    // 오디오만 재생
    http://www.example.com/mp4:trip.mp4/index.m3u8?tracks=audioonly
    
    // 비디오만 재생
    http://www.example.com/mp4:trip.mp4/index.m3u8?tracks=videoonly
    
  • <MP3SegmentType> (기본: TS) MP3라면 Chunk포맷을 설정한다. (TS 또는 MP3)

다음 URL이 호출되면 HTTP 원본서버의 /trip.mp4로부터 인덱스 파일을 생성한다.

http://www.example.com/bar/mp4:trip.mp4/index.m3u8

Alternates 속성이 ON이라면 <Index> 파일은 <AlternatesName> 파일을 서비스한다.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=200000,RESOLUTION=720x480
/bar/mp4:trip.mp4/playlist.m3u8

#EXT-X-STREAM-INF 의 Bandwidth와 Resolution은 영상을 분석하여 동적으로 제공한다.

최종적으로 생성된 .ts 목록(버전 3)은 다음과 같다.

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:11.637,
/bar/mp4:trip.mp4/0.ts
#EXTINF:10.092,
/bar/mp4:trip.mp4/1.ts
#EXTINF:10.112,
/bar/mp4:trip.mp4/2.ts

... (중략)...

#EXTINF:10.847,
/bar/mp4:trip.mp4/161.ts
#EXTINF:9.078,
/bar/mp4:trip.mp4/162.ts
#EXT-X-ENDLIST

키 프레임과 <Duration>

분할(Segmentation)의 경우 <Duration> 보다 Key Frame 간격이 우선한다. 아래 3가지 경우에서 분할이 어떻게 되는지 설명한다.

  • KeyFrame 간격보다 <Duration> 설정이 큰 경우 KeyFrame이 3초, <Duration> 이 20초라면 20초를 넘지 않는 KeyFrame의 배수인 18초로 분할된다.
  • KeyFrame 간격과 <Duration> 이 비슷한 경우 KeyFrame이 9초, <Duration> 이 10초라면 10초를 넘지 않는 KeyFrame의 배수인 9초로 분할된다.
  • KeyFrame 간격이 <Duration> 설정보다 큰 경우 KeyFrame단위로 분할된다.

다음 클라이언트 요청에 대해 STON 미디어 서버가 어떻게 동작하는지 이해해보자.

GET /bar/mp4:trip.mp4/99.ts HTTP/1.1
Range: bytes=0-512000
Host: www.example.com
  1. STON Media Server : 최초 로딩 (아무 것도 캐싱되어 있지 않음.)
  2. HTTP/HLS Client : HTTP Range 요청 (100번째 파일의 최초 500KB 요청)
  3. STON Media Server : /trip.mp4 파일 캐싱객체 생성
  4. STON Media Server : /trip.mp4 파일 분석을 위해 필요한 부분만을 원본서버에서 다운로드
  5. STON Media Server : 100번째(99.ts)파일 서비스를 위해 필요한 부분만을 원본서버에서 다운로드
  6. STON Media Server : 100번째(99.ts)파일 생성 후 Range 서비스
  7. STON Media Server : 서비스가 완료되면 99.ts파일 파괴

주석

MP4Trimming 기능이 ON 이라면 Trimming된 MP4를 HLS로 변환할 수 있다. (HLS영상을 Trimming할 수 없다. HLS는 MP4가 아니라 MPEG2-TS 임에 주의하자.) 영상을 Trimming한 뒤, HLS로 변환하기 때문에 다음과 같이 표현하는 것이 자연스럽다.

/bar/mp4:trip.mp4?start=0&end=60/playlist.m3u8

동작에는 문제가 없지만 QueryString을 맨 뒤에 붙이는 HTTP 규격에 어긋난다. 이를 보완하기 위해 다음과 같은 표현해도 동작은 동일하다.

/bar/mp4:trip.mp4/playlist.m3u8?start=0&end=60
/bar/mp4:trip.mp4?start=0/playlist.m3u8?end=60

MPEG-DASH

현재는 캐싱기반의 릴레이 전송만 지원하며 향후 Packetizing과 전용 설정을 제공할 계획이다. MPEG-DASH에서 사용하는 확장자(.mpd, mp4v, mp4a, m4s)와 관련된 전송은 별도의 MPEG-DASH 통계로 수집된다.

6장. HTTP 원본서버

이 장에서는 STON 미디어 서버와 HTTP 원본서버 구간의 통신에 대해 알아본다. HTTP 원본서버에 대해 Apache 웹서버만 생각하기 쉽지만 AWS S3같은 HTTP로 통신할 수 있는 서버 모두를 포함한다.

# server.xml - <Server><VHostDefault>
# vhosts.xml - <Vhosts><Vhost>

<OriginOptions>
    <Http>
        ... (세부설정) ...
    </Http>
</OriginOptions>

이 장에서 다루는 모든 설정은 <Http> 하위 태그로 구성된다.

원본주소 사용정책

원본주소(IP)는 다음 요소들에 의해 어떻게 사용될지 결정된다.

서비스를 운영하다보면 원본주소가 배제/복구되는 일은 빈번하다. STON은 IP테이블을 기반으로 원본주소를 사용하며 원본상태 모니터링 API를 통해 정보를 제공한다.

원본주소를 IP로 설정한 경우 매우 간단하다.

  • 설정변경 이외에 IP목록을 변화시키는 요인은 없다.
  • TTL에 의해 IP주소가 만료되지 않는다.
  • 장애/복구 모두 설정(IP주소)에 기반하여 동작한다.

원본주소를 Domain으로 설정하면 Resolving해서 IP를 얻어야 한다. ( admin-log-dns 에 기록된다.) IP 목록은 동적으로 변경될 수 있으며 모든 IP는 TTL(Time To Live)동안만 유효하다.

  • Domain은 주기적으로(1~10초) Resolving한다.
  • Resolving결과를 통해 사용할 IP테이블을 구성한다.
  • 모든 IP는 TTL만큼만 유효하며 TTL이 만료되면 사용하지 않는다.
  • 같은 IP가 다시 Resolving되면 TTL을 갱신한다.
  • IP테이블은 비어서는 안된다. (TTL이 만료되었더라도) 마지막 IP들은 삭제되지 않는다.

원본주소를 Domain으로 설정하여도 장애/복구는 IP기반으로 동작한다. Domain주소 장애/복구 정책은 다음과 같다.

  • (Domain에 대해) 알고 있는 모든 IP주소가 배제(Inactive)되면 해당 Domain주소가 배제된다.
  • 신규 IP가 Resolving되더라도 Domain이 배제되어 있다면 IP주소는 처음부터 배제된다.
  • 모든 IP가 TTL 만료되더라도 배제된 Domain상태는 풀리지 않는다.
  • 배제된 Domain에 속한 IP주소가 하나라도 복구되어야 해당 Domain은 다시 활성화된다.

다소 복잡한 내용이므로 원본상태 모니터링 API를 통해 서비스 동작상태에 대해 이해도를 높이는 것이 좋다.

장애감지와 복구

Caching과정 중 원본서버에 장애가 발생하면 자동배제한다. 다시 안정화됐다고 판단하면 서비스에 투입한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<ConnectTimeout>3</ConnectTimeout>
<ReceiveTimeout>10</ReceiveTimeout>
<Exclusion>3</Exclusion>
<Recovery Cycle="10" Uri="/" ResCode="0" Log="ON">5</Recovery>
  • <ConnectTimeout> (기본: 3초)

    n초 이내에 원본서버와 접속이 이루어지지 않는 경우 접속실패로 간주한다.

  • <ReceiveTimeout> (기본: 10초)

    정상적인 HTTP요청에도 불구하고 원본서버가 HTTP응답을 n초 동안 보내지 않는 경우 전송실패로 간주한다.

  • <Exclusion> (기본: 3회)

    원본서버에서 연속적으로 n번 장애상황( <ConnectTimeout> 또는 <ReceiveTimeout> )이 발생하면 해당 서버를 유효 원본서버 목록에서 배제한다. 배제 전 정상적인 통신이 이루어진다면 이 값은 다시 0으로 초기화된다.

  • <Recovery> (기본: 5회)

    Cycle 마다 Uri 로 요청하여 원본서버가 ResCode 로 연속적으로 n회 응답하면 해당 서버를 복구한다. 이 값을 0으로 설정하면 복구하지 않는다.

    • Cycle (기본: 10초) 일정시간(초)마다 시도한다.
    • Uri (기본: /) 요청을 보낼 Uri
    • ResCode (기본: 0) 정상응답으로 처리할 응답코드. 0인 경우 응답코드와 상관없이 응답이 오면 성공으로 간주한다. 200으로 설정하면 응답코드가 반드시 200이어야 정상응답으로 처리한다. 콤마(,)를 사용하여 유효한 응답코드를 멀티로 설정한다. 200, 206, 404로 설정하면 응답코드가 이 중 하나인 경우 정상응답으로 처리한다.
    • Log (기본: ON) 복구를 위해 사용된 HTTP 트랜잭션을 admin-log-origin 에 기록한다.

원본상태 모니터링

API를 통해 가상호스트의 원본상태를 모니터링한다.

http://127.0.0.1:20040/monitoring/origin       // 모든 가상호스트
http://127.0.0.1:20040/monitoring/origin?vhost=www.example.com

결과는 JSON형식으로 제공된다.

{
    "origin" :
    [
        {
            "VirtualHost" : "example.com",
            "Address" :
            [
                { "1.1.1.1" : "Active" },
                { "1.1.1.2" : "Active" }
            ],
            "Address2" : [  ],
            "ActiveIP" :
            [
                { "1.1.1.1" : 0 },
                { "1.1.1.2" : 0 }
            ] ,
            "InactiveIP" : [ ]
        },
        {
            "VirtualHost" : "foobar.com",
            "Address" :
            [
                { "origin.foobar.com" : "Active" }
            ],
            "Address2" : [  ],
            "ActiveIP" :
            [
                { "5.5.5.5" : 21 },
                { "5.5.5.6" : 60 },
                { "5.5.5.7" : 37 }
            ],
            "InactiveIP" :
            [
                { "5.5.5.8" : 10 },
                { "5.5.5.9" : 184 }
            ]
        }
    ]
}
  • VirtualHost 가상호스트 이름
  • Address 원본서버 주소 . 설정주소가 사용중이라면 Active , (장애발생으로) 사용하고 있지 않다면 Inactive 로 표시된다.
  • Address2 보조 주소 . 설정주소를 사용중이라면 Active , 사용하고 있지 않다면 Inactive 로 표시된다.
  • ActiveIP 사용 중인 IP목록과 TTL. 원본서버를 IP로 설정하면 Address 와 동일한 IP에 TTL은 0으로 표시된다. Domain으로 설정하면 Resolving결과에 따른다. 다양한 IP와 TTL을 사용한다.
  • InactiveIP 사용하지 않는 IP목록과 TTL. 사용하지 않더라도 복구 중이거나 HealthChecker에 의해 관리될 수 있다. 해당 주소는 TTL 동안 복구되지 않으면 삭제된다.

원본상태 초기화

API를 통해 가상호스트의 원본서버 배제/복구를 초기화한다. 또한 현재 사용 중인 세션을 재사용하지 않고 새롭게 연결을 생성한다.

http://127.0.0.1:20040/command/resetorigin       // 모든 가상호스트
http://127.0.0.1:20040/command/resetorigin?vhost=www.example.com

과부하 판단

처음 요청되는 콘텐츠는 항상 원본서버에 요청해야 한다. 하지만 이미 Caching된 콘텐츠라면 좀 더 유연하게 대처할 수 있다. 원본서버가 과부하 상태라고 판단되면 갱신을 늦추어 원본부하를 높이지 않는다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<BusySessionCount>100</BusySessionCount>
  • <BusySessionCount> (기본: 100개) 원본서버와 HTTP트랜잭션을 진행 중인 세션 수가 일정개수를 넘으면 과부하 상태로 판단한다. 과부하 상태에서 만료된 컨텐츠를 갱신하기 위해 원본서버로 접속하지 않도록 TTL을 TTL (Time To Live)<OriginBusy> 만큼 연장한다. 무조건 원본서버로 요청이 가도록 하려면 이 값을 아주 크게 설정하면 된다.

원본 선택

원본서버 주소가 멀티(2개 이상)로 구성되어 있을 때 원본서버 선택정책을 설정한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<BalanceMode>RoundRobin</BalanceMode>
  • <BalanceMode> (기본: RoundRobin)
    • RoundRobin (기본) 모든 원본서버가 균등하게 요청을 받도록 Round-Robin으로 동작한다. 연결된 Idle세션은 해당 서버로 요청이 필요할 때만 사용한다.
    • Session 재사용할 수 있는 세션이 있다면 우선 사용한다. 신규 세션이 필요하면 Round-Robin으로 할당한다.
    • Hash 컨텐츠를 Consistent Hashing 알고리즘에 따라 원본서버로 분산하여 요청한다. 서버가 선택되면 이미 연결된 세션을 재사용하며 없다면 신규로 접속한다.
/ RoundRobin Session
부하(요청) 모든 서버가 부하를 균등하게 분배 반응성과 재사용성이 좋은 서버로 로드가 가중됨
연결비용 높음 (해당 서버의 순서가 되면 연결된 세션을 찾고 없으면 연결시도) 낮음 (재사용할 수 있는 세션이 없을 때만 연결)
재사용성 낮음 (서버 분배 우선) 높음 (항상 연결된 세션을 우선 사용)
세션수 많음 (각 서버마다 동시에 진행되는 HTTP 트랜잭션의 합) 적음 (동시에 진행되는 HTTP 트랜잭션 만큼 세션 존재)

세션 재사용

원본서버가 Keep-Alive를 지원한다면 연결된 세션은 항상 재사용된다. 하지만 세션을 재사용하여 보낸 요청에 대해 원본서버가 일방적으로 연결을 종료할 수 있다. 때문에 연결을 복구하느라 사용자 반응성이 늦어질 가능성이 있다. 특히 오랫동안 재사용하지 않은 세션의 경우 이러한 가능성은 더욱 높다. 이를 방지하기 위하여 n초 동안 재사용되지 않은 세션에 대해서 자동으로 연결을 종료하도록 설정한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<ReuseTimeout>60</ReuseTimeout>
  • <ReuseTimeout> (기본: 60초) 일정 시간동안 사용되지 않은 원본세션은 종료한다. 0으로 설정하면 원본서버 세션을 재사용하지 않는다.

Range요청

한번에 다운로드 받는 컨텐츠 크기를 설정한다. 동영상처럼 앞 부분만이 주로 소비되는 컨텐츠의 경우 다운로드 크기를 제한하면 불필요한 원본 트래픽을 줄일 수 있다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<PartSize>0</PartSize>
  • <PartSize> (기본: 0 MB) 0보다 크면 클라이언트가 요청한 지점부터 설정크기(MB) 만큼 Range요청으로 다운로드 한다.

<PartSize> 를 사용하는 또 다른 이유는 디스크 공간을 절약하기 위함이다. 기본설정으로 STON은 원본크기의 파일을 디스크에 생성한다. 하지만 <PartSize> 가 0이 아니라면 다운로드 되는만큼만 파일을 분할하여 저장한다.

예를 들어 1시간짜리 영상(600MB)을 1분(10MB)만 시청한 경우에 디스크 공간을 10MB만 사용한다. 공간을 절약하는 장점은 있지만 파일이 분할되어 저장되기 때문에 디스크 부하가 조금 높아진다.

주석

최초 콘텐츠를 다운로드할 때 Content-Length를 알 수 없으므로 Range요청을 할 수 없다. 때문에 <PartSize> 가 설정되어 있다면 설정크기만큼만 다운로드 받고 연결을 종료한다.

전체 Range 초기화

원본서버로부터 처음 파일을 다운로드 할 때나 갱신확인 할 때는 다음과 같이 단순한 형태의 GET 요청을 보낸다.

GET /trip.mp4 HTTP/1.1

하지만 원본서버가 일반적인 GET요청에 대하여 항상 파일을 변조하도록 설정되어 있다면 원본파일 그대로를 Caching할 수 없어서 문제가 될 수 있다.

가장 대표적인 예는 Apache 웹서버가 mod_h.264_streaming같은 외부모듈과 같이 구동되는 경우이다. Apache 웹서버는 GET요청에 대해서 항상 mod_h.264_streaming모듈을 통해서 응답한다. 클라이언트(이 경우에는 STON 미디어 서버)는 원본파일 그대로가 아닌 모듈에 의해 변조된 파일을 서비스 받는다.

_images/sms_origin_http_fullrangeinit1.png

mod_h.264_streaming모듈은 항상 원본을 변조한다.

Range요청을 사용하면 모듈을 우회하여 원본을 다운로드할 수 있다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<FullRangeInit>OFF</FullRangeInit>
  • <FullRangeInit>

    • OFF (기본) 일반적인 HTTP요청을 보낸다.

    • ON 0부터 시작하는 Range요청을 보낸다. Apache의 경우 Range헤더가 명시되면 모듈을 우회한다.

      GET /trip.mp4 HTTP/1.1
      Range: bytes=0-
      

      최초로 파일 Caching할 때는 컨텐츠의 Range를 알지 못하므로 Full-Range(=0부터 시작하는)를 요청한다. 원본서버가 Range요청에 대해 정상적으로 응답(206 OK)하는지 반드시 확인해야 한다.

콘텐츠를 갱신할 때는 다음과 같이 If-Modified-Since 헤더가 같이 명시된다. 원본서버가 올바르게 304 Not Modified 로 응답해야 한다.

GET /trip.mp4 HTTP/1.1
Range: bytes=0-
If-Modified-Since: Fri, 31 Mar 2017 19:43:31 GMT

주석

<FullRangeInit> 가 정상동작함을 확인한 웹서버들 목록.

  • Microsoft-IIS/7.5
  • nginx/1.4.2
  • lighttpd/1.4.32
  • Apache/2.2.22

HTTP 요청헤더

STON 미디어 서버가 원본서버에서 다운로드를 위해 보내는 HTTP 요청헤더를 설정한다.

Host 헤더

HTTP 요청의 Host헤더를 설정한다. 별도로 설정하지 않은 경우 가상호스트 이름이 명시된다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<Host />
  • <Host> 원본서버로 보낼 Host헤더를 설정한다. 원본서버에서 80포트 이외의 포트로 서비스하고 있다면 반드시 포트 번호를 명시해야 한다.

    # server.xml - <Server><VHostDefault><OriginOptions><Http>
    # vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>
    
    <Host>www.example2.com:8080</Host>
    

클라이언트가 보낸 Host헤더를 원본으로 보내고 싶은 경우 *로 설정한다.

User-Agent 헤더

HTTP 요청의 User-Agent헤더를 설정한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<UserAgent>STON Media Server</UserAgent>
  • <UserAgent> (기본:  STON Media Server ) 원본서버로 보낼 User-Agent헤더를 설정한다.

클라이언트가 보낸 User-Agent헤더를 원본으로 보내고 싶은 경우 *로 설정한다.

XFF(X-Forwarded-For) 헤더

HTTP 클라이언트와 원본서버 사이에 STON 미디어 서버가 위치하면 원본서버는 클라이언트 IP를 얻을 수 없다. 때문에 원본서버로 보내는 모든 HTTP 요청에 X-Forwarded-For헤더를 명시한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<XFFClientIPOnly>OFF</XFFClientIPOnly>
  • <XFFClientIPOnly>

    • OFF (기본) 클라이언트(IP: 128.134.9.1)가 보낸 XFF헤더에 클라이언트 IP를 추가한다. 클라이언트가 XFF헤더를 보내지 않았다면 클라이언트 IP만 명시된다.

      X-Forwarded-For: 220.61.7.150, 61.1.9.100, 128.134.9.1
      
    • ON XFF헤더의 첫번째 주소만을 원본서버로 전송한다.

      X-Forwarded-For: 220.61.7.150
      

ETag 헤더 인식

원본서버에서 응답하는 ETag헤더 인식여부를 설정한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<OriginalETag>OFF</OriginalETag>
  • <OriginalETag>
    • OFF (기본) ETag헤더를 무시한다.
    • ON ETag를 인식하며 컨텐츠 갱신시 If-None-Match헤더를 추가한다.

헤더변경

원본서버로 요청을 보낼 때 조건에 따라 HTTP 헤더를 변경한다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<ModifyHeader FirstOnly="OFF">OFF</ModifyHeader>
  • <ModifyHeader>
    • OFF (기본) 변경하지 않는다.
    • ON 헤더 변경조건에 따라 헤더를 변경한다.

헤더 변경시점은 HTTP 요청패킷이 완성되어 원본서버로 전송하기 직전에 수행된다. 단, Range헤더는 변조할 수 없다.

이 기능은 handling_http_requests_modify_client 의 하위 기능이다. 헤더변경에는 $ORGREQ 키워드를 사용한다.

# /svc/www.example.com/http_headers.txt

$URL[/*.mp4], $ORGREQ[x-media-type: video/mp4], set
$IP[1.1.1.1], $ORGREQ[user-agent: media_probe], put
*, $ORGREQ[If-Modified-Since], unset
*, $ORGREQ[If-None-Match], unset

주석

If-Modified-Since 헤더와 If-None-Match 헤더를 unset 하면 TTL이 만료된 컨텐츠는 항상 다시 다운로드 한다.

비정상 TTL 연장

원본서버 종료로 인해 응답이 오지 않는 경우에는 장애판단이 명확하지만 간혹 정상적으로 응답하면서 장애상황인 경우가 발생한다. 예를 들어 콘텐츠를 저장하는 Storage와의 연결을 잃거나, 뭔가 정상처리가 불가능하다고 판단하는 경우가 있을 수 있다. 전자의 경우 4xx응답(주로 404 Not Found ), 후자는 5xx응답(주로 500 Internal Error )을 받게된다.

하지만 이미 관련 콘텐츠가 저장되어 있다면, 원본의 응답을 믿는 것보다 TTL을 연장시켜 서비스 전체장애가 발생하지 않도록 하는편이 효과적이다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<TTLExtensionBy4xx>OFF</TTLExtensionBy4xx>
<TTLExtensionBy5xx>ON</TTLExtensionBy5xx>
  • <TTLExtensionBy4xx>
    • OFF (기본) 4xx 응답으로 콘텐츠를 갱신한다.
    • ON 304 not modified를 받은 것처럼 동작한다.

의도된 4xx응답이 아닌지 주의해야 한다.

  • <TTLExtensionBy5xx>
    • ON (기본) 304 Not Modified 를 받은 것처럼 동작한다.
    • OFF 5xx 응답으로 콘텐츠를 갱신한다.

정상적인 서버라면 5xx로 응답하지 않는다. 주로 서버의 일시적인 장애로부터 콘텐츠를 무효화하여 원본부하를 가중시키지 않기 위한 용도로 사용된다.

Health-Checker

장애감지와 복구 는 Caching 과정 중 발생하는 장애에만 대응한다. 주기적으로 동작하는 Health-Checker를 설정해 놓으면 장애를 더 빨리 감지할 수 있다. Health-Checker는 HTTP 트랜잭션이 올바르게 완료되는지 까지 확인한다.

주석

Health-Checker는 <Origin> 태그 하위에 설정한다.

# vhosts.xml - <Vhosts><Vhost>

<Origin>
    <HttpHealthChecker ResCode="0" Timeout="10" Cycle="10"
                       Exclusion="3" Recovery="5" Log="ON">/</HealthChecker>
    <HttpHealthChecker ResCode="200, 404" Timeout="3" Cycle="5"
                       Exclusion="5" Recovery="20" Log="ON">/alive.html</HealthChecker>
</Origin>
  • <HttpHealthChecker> (기본: /)

    Health-Checker를 구성한다. 멀티로 구성이 가능하다. 값으로 URI를 지정하며, XML예외 문자의 경우 CDATA로 감싸주어야 한다.

    • ResCode (기본: 0) 올바른 HTTP 응답코드 (콤마로 멀티 구성가능)
    • Timeout (기본: 10초) 소켓연결부터 HTTP 트랜잭션이 완료될 때까지 유효시간
    • Cycle (기본: 10초) 실행주기
    • Exclusion (기본: 3회) 연속 n회 실패 시 해당서버 배제
    • Recovery (기본: 5회) 연속 n회 성공 시 해당서버 재투입
    • Log (기본: ON) HTTP 트랜잭션을 admin-log-origin 에 기록한다.

Health-Checker는 멀티로 구성할 수 있으며 클라이언트 요청과 상관없이 독립적으로 수행된다. 장애감지와 복구 나 다른 Health-Checker와도 정보를 공유하지 않고 자신만의 기준으로 배제와 투입을 결정한다.

7장. Caching 정책

이 장에서는 서비스의 핵심이 되는 TTL(Time To Live)과 Caching-Key 그리고 만료정책에 대해 설명한다. 저장된 콘텐츠는 TTL동안 유효하다. HTTP 규격은 TTL을 설정할 수 있도록 Cache-Control을 명시하고 있다. 하지만 이는 절대적인 것은 아니다. 다양한 방식의 TTL 정책과 caching-purge 를 통해 서비스 품질을 높일 수 있다.

HTTP에는 콘텐츠를 구분하는 다양한 규격이 존재한다. 그만큼 Caching-Key도 다양하게 존재할 수 있다. 콘텐츠 변경이 없을수록 원본부하를 줄일 수 있을뿐만 아니라 쉽게 확장할 수 있다. 서비스에 최적화된 만료정책을 수립하는 다양한 방식에 대해 설명한다.

**Caching-Key**란 콘텐츠를 구분하는 고유 값이다. 파일시스템에서 파일들과 구분되는 고유경로(예. /usr/conf.txt)를 가지는 것과 같은 개념이다. 흔히 Caching-Key는 URL과 혼동되기 쉽다. HTTP의 여러 기능에 따라 같은 URL이라고 하더라도 콘텐츠가 달라질 수 있다.

TTL (Time To Live)

TTL이란 저장된 콘텐츠의 유효시간이다. TTL을 길게 설정하면 원본서버의 부하는 줄어들지만 변경사항이 늦게 반영된다. 반대로 짧게 설정하면 너무 빈번한 변경확인 요청으로 원본서버 부하가 높아진다. 운영의 묘미는 TTL을 적절히 설정하여 원본부하를 줄이는 것에 있다. TTL은 한번 설정되면 만료되기 전까지 바뀌지 않는다. 새로운 TTL은 파일이 만료되었을 때 적용된다. 관리자는 api-cmd-purge , api-cmd-expire , api-cmd-expireafter , api-cmd-hardpurge 등의 API를 사용해 TTL을 변경할 수 있다.

기본 TTL

TTL은 원본서버의 응답에 따라 결정된다. TTL이 만료되기 전까지 저장된 콘텐츠로 서비스 된다. TTL이 만료되면 원본서버로 콘텐츠 변경여부( If-Modified-Since 또는 If-None-Match )를 확인한다. 원본서버가 304 Not Modified 응답을 준다면 TTL은 연장된다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<TTL>
    <Res2xx Ratio="20" Max="86400">1800</Res2xx>
    <NoCache Ratio="0" Max="5" MaxAge="0">5</NoCache>
    <Res3xx>300</Res3xx>
    <Res4xx>30</Res4xx>
    <Res5xx>30</Res5xx>
    <ConnectTimeout>3</ConnectTimeout>
    <ReceiveTimeout>3</ReceiveTimeout>
    <OriginBusy>3</OriginBusy>
</TTL>

Ratio (0~100)를 제외한 모든 설정 단위는 초(sec) 다.

  • <Res2xx> (기본: 1800초, Ratio: 20, Max=86400) 원본서버가 200 OK로 응답했을 때 TTL을 설정한다. 콘텐츠를 처음 저장할 때 <Res2xx> 초 뒤에 콘텐츠가 만료(TTL)되도록 설정한다. (TTL만료 후) 원본서버에서 변경되지 않았다면(304 Not Modified) Ratio 비율(0~100)만큼 TTL을 연장한다. TTL은 최대 Max 까지 증가한다.

  • <NoCache> (기본: 5초, Ratio: 0, Max=5, MaxAge=0) <Res2xx> 와 동일하나 원본서버가 no-cache로 응답하는 경우에만 적용된다.

    cache-control: no-cache 또는 private 또는 must-revalidate
    

    MaxAge 가 0보다 크다면 max-age를 줄 수 있다.

    _images/sms_nocache_maxage1.png

    Max-Age만큼 클라이언트에 Caching된다.

  • <Res3xx> (기본: 300초) 원본서버가 3xx로 응답했을 때 TTL을 설정한다. Redirect용도로 사용되는 경우가 많다.

  • <Res4xx> (기본: 30초) 원본서버가 4xx로 응답했을 때 TTL을 설정한다. 404 Not Found 인 경우가 많다.

  • <Res5xx> (기본: 30초) 원본서버가 5xx로 응답했을 때 TTL을 설정한다. 원본서버 내부 장애상황인 경우가 많다.

  • <ConnectTimeout> (기본: 3초) 원본서버로 접속하지 못하는 경우 TTL을 설정한다. 콘텐츠가 이미 저장되어 있다면 <ConnectTimeout> 초 만큼 TTL을 연장한다. 콘텐츠가 저장되어 있지 않다면 <ConnectTimeout> 초 만큼 장애상황으로 응답한다. 이는 장애상황을 서비스한다는 의미보다는 TTL시간동안 (아마도 장애상황일) 원본서버에 부담을 주지 않기 위함이다.

  • <ReceiveTimeout> (기본: 3초) 접속은 됐으나 데이터를 수신하지 못하는 경우 TTL을 설정한다. <ConnectTimeout> 과 의미적으로 동일하다.

  • <OriginBusy> (기본: 3초) 과부하 판단 조건을 만족하면 원본서버 요청없이 만료된 콘텐츠의 TTL을 설정된 시간만큼 연장한다. 이는 원본서버의 부하를 가중시키지 않기 위함이다.

주석

TTL 값을 0으로 설정하면 서비스 직후 곧바로 만료된다. 만약 모든 요청에 대해 원본서버의 응답을 주고 싶다면 바이패스할 것을 권장한다.

Custom TTL

URL마다 별도로 TTL을 설정한다. 명확한 URL 또는 패턴 URL에 매칭되는 콘텐츠마다 고정된 TTL을 설정할 수 있다. /svc/{가상호스트 이름}/ttl.txt 에 설정한다.

# /svc/www.example.com/ttl.txt
# 구분자는 콤마(,)이며 시간 단위는 초이다.

/hot/*.mp4, 300
/trip.mp4, 3600

프로토콜에 따라 클라이언트가 접속하는 URL이 다르기 때문에 원본서버에서 제공하는 URL을 설정해야 한다. 예를 들어 원본서버 URL이 /hot/sample.mp4라면 위 설정(/hot/*.mp4, 300)에 의해 300초 TTL이 설정된다. 이때 클라이언트 URL은 아래와 같다.

//////////////////////////////////////////////////////
// <Vhost Name="www.example.com/bar">
//////////////////////////////////////////////////////

// Adobe Flash Player (RTMP)
Server: rtmp://www.example.com/bar
Stream: mp4:hot/sample.mp4

// Apple iOS device (Cupertino/Apple HTTP Live Streaming)
http://www.example.com/bar/mp4:hot/sample.mp4/playlist.m3u8

// HTTP Pseudo-Streaming
http://www.example.com/bar/mp4:hot/sample.mp4

TTL 우선순위

적용할 TTL설정의 우선순위를 설정한다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<TTL Priority="cc_nocache, custom, cc_maxage, rescode">
    ... (생략) ...
</TTL>

<TTL>Priority (기본: cc_nocache, custom, cc_maxage, rescode) 속성으로 설정한다.

  • cc_nocache 원본이 Cache-Control: no-cache로 응답한 경우
  • custom caching-policy-customttl
  • cc_maxage 원본이 Cache-Control에 maxage를 명시한 경우
  • rescode 원본 응답코드별 기본 TTL

대소문자 구분

원본서버의 대소문자 구분여부를 능동적으로 알 수 없다.

_images/sms_casesensitive1.png

아마도 같은 콘텐츠이거나 404가 발생한다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<CaseSensitive>ON</CaseSensitive>
  • <CaseSensitive>
    • ON (기본) URL 대소문자를 구문한다.
    • OFF URL 대소문자를 구분하지 않는다. 모두 소문자로 처리된다.

QueryString 구분

QueryString에 의하여 동적으로 생성되는 콘텐츠가 아니라면 QueryString을 인식하는 것은 불필요하다. 아무 의미없는 Random값이나 항상 변하는 시간 값이 매번 붙는다면 원본에 엄청난 부하가 발생할 수 있다.

_images/sms_querystring1.png

동적 콘텐츠가 아니라면 같은 콘텐츠일 가능성이 높다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<ApplyQueryString Collective="OFF">ON</ApplyQueryString>
  • <ApplyQueryString>
    • ON (기본) QueryString을 인식한다. 예외조건에 만족하면 QueryString이 무시된다.
    • OFF QueryString을 무시한다. 예외조건에 만족하면 QueryString을 인식한다.

QueryString-예외조건은 /svc/{가상호스트 이름}/querystring.txt에 설정한다.

# ./svc/www.example.com/querystring.txt

/private/personal.mp4?login=ok*
/ad/spot.mp4

예외조건이 <ApplyQueryString> 설정에 따라 의미가 달라짐에 주의한다. 명확한 URL또는 패턴(*만 허용한다)으로 설정이 가능하다.

Collective 속성은 Purge API가 호출되었을 때 대상을 지정한다.

  • Collective
    • OFF (기본) 파라미터 URL만을 대상으로 지정한다.
    • ON 파라미터 URL뿐만 아니라 URL에 QueryString이 존재하는 모든 컨텐츠를 대상으로 지정한다.

Collective 속성이 ON이고 파일이 많을수록 Purge API를 수행할 때 CPU부하가 높아진다. 관련 파일을 검색하는 소요시간이 길어질 수 있어 예기치 않은 문제를 일으킬 수 있다. 가급적 QueryString까지 붙은 명확한 URL로 Purge API를 호출할 것을 권장한다.

8장. Caching 무효화

이 장에서는 Caching된 콘텐츠를 관리자가 임의대로 갱신하는 방법에 대해 설명한다. 보통 Purge로 지칭되지만 STON 미디어 서버는 여러상황에 맞춰 활용할 수 있는 다양한 API를 제공한다.

원본서버로부터 캐싱된 콘텐츠는 TTL (Time To Live) 에 기반한 갱신주기를 가진다. 하지만 명백히 콘텐츠가 변경되었고 관리자가 이를 즉시 반영하고 싶을 경우 TTL (Time To Live) 이 만료될 때까지 기다릴 필요는 없다. Purge / Expire / HardPurge 등을 사용하면 즉시 콘텐츠를 무효화시킬 수 있다.

주석

API로 입력되는 파라미터는 원본서버 URL을 기준으로 한다. 각 프로토콜 URL표현을 구분할 경우 자칫 프로토콜마다 콘텐츠를 별도로 캐싱하는 것처럼 오해할 수 있기 때문이다.

http://127.0.0.1:20040/command/purge?url=www.example.com/bar/mp4:trip.mp4

예를 들어 위 URL처럼 HLS형식을 입력해도 동작하지만 자칫 HLS에서만 Purge 되는 것처럼 인식될 수 있다. 따라서 아래와 같은 표현이 올바르다.

http://127.0.0.1:20040/command/purge?url=www.example.com/bar/trip.mp4

캐싱조회

캐싱하고 있는 파일상태를 조회한다. 파일은 URL로 구분되지만 같은 URL에 다른 옵션(i.e. Accept-Encoding등)이 존재하는 경우 여러 개의 파일이 존재할 수 있다.

http://127.0.0.1:20040/monitoring/fileinfo?url=www.example.com/bar/trip.mp4

결과는 JSON형식으로 제공된다. 다음은 /trip.mp4파일의 정보를 열람한 결과이다.

{
    "version": "1.0.0",
    "method": "fileinfo",
    "status": "OK",
    "result":
    [
        {
            "URI": "/trip.mp4",
            "Accept-Encoding": "N",
            "RefCount": 0,
            "Disk-Index": 0,
            "Size": 210026703,
            "FID": 24267,
            "LocalPath": "/cache1/www.example.com/000i/q3.bin",
            "File-Opened ": "N",
            "File-Updating": "-",
            "Downloader-Count": "0",
            "LastAccess": "[ 2016.09.03 14:29:50, -2 ]",
            "UpdateTime": "[ 2016.09.03 13:53:43, -2169 ]",
            "TTL-Left": "[ 2017.10.03 13:53:43, 2589831 ]",
            "ResponseCode": 200,
            "ContentType": "video/mp4",
            "LastModifiedTime": "[ 2016.09.03 13:53:43, -2169 ]",
            "ExpireTime": "[ 0, 0 ]",
            "CacheControl": "not-specified",
            "ETag": "502dd614:200c2b",
            "CustomTTL": 0,
            "NoMoreExist": "N",
            "LocalFileExist": "Y",
            "SmallFile": "N",
            "State": "Cached",
            "Deleted": "N",
            "AddedSize": "Y",
            "TransferEncoding": "N",
            "Compression": "-",
            "Purge": "N",
            "Ignore-IMS ": "N",
            "Redirect-Location ": "-",
            "Content-Disposition ": "-",
            "NoCache": "N"
        }
    ]
}
  • URI 파일 URI
  • Accept-Encoding ("Y" or "N") Accept-Encoding을 지원한다면 "Y"
  • RefCount 파일참조 카운트
  • Size (Bytes) 파일크기
  • Disk-Index (0부터 시작) 저장된 디스크 인덱스
  • FID 파일 ID
  • LocalPath 로컬 경로
  • File-Opened ("Y" or "N") 로컬파일을 열고 있다면 "Y"
  • File-Updating 파일을 갱신 중이라면 갱신하는 객체의 포인터가 명시
  • Downloader-Count 원본서버에서 이 파일을 다운로드 받는 현재 세션의 개수
  • LastAccess (마지막 접근시간, 마지막 접근시간-현재시간) [ 2016.09.03 14:29:50, -2 ]의 의미는 2016.09.03 14:29:50에 접근됐으며 현재로부터 2초 전에 접근됐다는 의미이다.
  • UpdateTime (갱신시간, 갱신시간-현재시간) 파일이 마지막으로 갱신된 시간. 304 Not Modified에도 시간은 갱신된다.
  • TTL-Left (만료시간, 만료시간-현재시간) 컨텐츠 만료 예정시간. TTL이 남았다면 양수로, 만료됐다면 음수로 표기된다.
  • ResponseCode 원본서버 응답코드
  • ContentType MIME Type
  • LastModifiedTime (Last Modified Time, Last Modified Time`` 현재시간) 원본서버가 보낸 Last Modified Time. 원본서버가 이 값을 보내지 않았다면 0으로 표시된다.
  • ExpireTime (Expire Time, Expire Time`` 현재시간) 원본서버가 보낸 Expire Time. 원본서버가 이 값을 보내지 않았다면 0으로 표시된다.
  • CacheControl ("no-cache" or "not-specified" or (정수)) 원본서버가 보낸 Cache-Contorl 값
  • ETag STON이 생성한 ETag
  • CustomTTL 커스텀 TTL. 설정되어 있지 않다면 0이다.
  • NoMoreExist ("Y" or "N") 파일을 파기예약되어 있다면 "Y"
  • LocalFileExist ("Y" or "N") 로컬에 파일이 존재하면 "Y" (200 OK가 아닌 파일들은 항상 "Y")
  • SmallFile ("Y" or "N") 파일을 작은파일로 판단한다면 "Y" (개발적인 이유)
  • State ("Not Init" or "Cached" or "Error") 파일 상태
  • Deleted ("Y" or "N") 삭제되었다면 "Y" (개발적인 이유)
  • AddedSize ("Y" or "N") 크기가 통계에 반영되었다면 "Y" (개발적인 이유)
  • TransferEncoding ("Y" or "N") Transfer-Encoding을 지원한다면 "Y"
  • Compression 압축방식
  • Purge ("Y" or "N") Purge됐다면 "Y"
  • Ignore-IMS ("Y" or "N") 갱신할 때 If-Modified-Since헤더를 보내지 않도록 설정되었다면 "Y"
  • Redirect-Location Location 헤더 값
  • Content-Disposition Content-Disposition 헤더 값
  • NoCache ("Y" or "N") 원본서버에서 no-cache응답을 줬다면 "Y"

Purge

타겟 컨텐츠를 무효화시켜 원본서버로부터 컨텐츠를 다시 다운로드 받도록 한다. Purge후 최초 접근 시점에 원본서버로부터 컨텐츠를 다시 캐싱한다. 만약 원본서버에 장애가 발생하여 컨텐츠를 가져올 수 없다면 무효화된 컨텐츠를 다시 복원시켜 서비스에 장애가 없도록 처리한다. 이렇게 복원된 컨텐츠는 해당 시점으로부터 ConnectTimeout설정만큼 뒤에 갱신한다.

http://127.0.0.1:20040/command/purge?url=...

타겟 컨텐츠는 URL, 패턴으로 지정할 수 있을 뿐만 아니라 "|"(Vertical Bar)를 구분자를 사용하여 복수의 도메인에 복수의 타겟을 지정할 수 있다. 만약 도메인 이름이 생략되었다면 최근 사용된 도메인을 사용한다.

http://127.0.0.1:20040/command/purge?url=http://www.example.com/bar/trip.mp4
http://127.0.0.1:20040/command/purge?url=www.example.com/bar/*.mp4
http://127.0.0.1:20040/command/purge?url=www.example.com/bar/*.mp4|/bar/hot/sample.mp4
http://127.0.0.1:20040/command/purge?url=www.example.com/bar/trip.mp4|foo.com/page/*.mp3

결과는 JSON형식으로 제공된다. 타겟 컨텐츠 개수/용량 및 처리시간(단위: ms)이 명시된다. 이미 Purge 된 컨텐츠는 다시 Purge되지 않는다.

{
    "version": "1.0.0",
    "method": "purge",
    "status": "OK",
    "result": { "Count": 24, "Size": 37474913829, "Time": 12 }
}

<Purge2Expire> 를 통해 특정조건의 Purge를 Expire로 동작하도록 설정할 수 있다. 결과없는 응답에 대해서는 <ResCodeNoCtrlTarget> 로 HTTP 응답코드를 설정할 수 있다.

주석

원본서버가 장애로 인해 모두 배제되었다면 컨텐츠를 갱신할 수 없기 때문에 Purge가 동작하지 않는다.

Expire

타겟 컨텐츠의 TTL을 즉시 만료시킨다. Expire후 최초 접근 시점에 원본서버로부터 변경여부를 확인한다. 변경되지 않았다면 TTL연장만 있을 뿐 컨텐츠 다운로드는 발생하지 않는다.

http://127.0.0.1:20040/command/expire?url=...

그 외의 모든 동작은 Purge 와 동일하다.

ExpireAfter

타겟 컨텐츠의 TTL만료 시간을 현재(API호출시점)로부터 입력된 시간(초)만큼 뒤에 설정한다. ExpireAfter로 만료시간을 앞당겨 컨텐츠를 더 빨리 갱신하거나, 반대로 만료시간을 늘려 원본서버 부하를 줄일 수 있다.

http://127.0.0.1:20040/command/expireafter?sec=86400&url=...

함수 호출규격은 Purge / Expire 와 유사하지만 sec파라미터(단위: 초)를 통해 TTL만료 시간을 지정할 수 있다. sec가 생략된다면 기본 값은 1일(86400초)로 설정되며 0을 입력할 경우 실패한다. 결과는 Purge / Expire 와 동일하지만 원본서버 장애여부와 상관없이 동작한다. 결과없는 응답에 대해서는 <ResCodeNoCtrlTarget> 로 HTTP 응답코드를 설정할 수 있다.

주석

ExpireAfter는 캐싱되어있는 컨텐츠의 현재 만료시간만을 설정할 뿐 커스텀TTL이나 설정된 기본 TTL을 변경시키는 API가 아니다. ExpireAfter 호출뒤에 캐싱된 컨텐츠들은 영향을 받지 않는다.

url파라미터를 먼저 입력하는 경우 sec파라미터가 url파라미터의 QueryString으로 인식될 수 있다. 그러므로 sec파라미터가 먼저 입력되는 것이 안전하다.

HardPurge

Purge / Expire / ExpireAfter 이상의 API는 원본서버 장애상황에서도 컨텐츠가 사라지지 않고 정상적으로 동작한다. 하지만 HardPurge는 컨텐츠의 완전한 삭제를 의미한다. HardPurge는 가장 강력한 삭제방법이지만 삭제한 컨텐츠는 원본서버에 장애가 발생해도 되살릴 수 없다. 결과없는 응답에 대해서는 <ResCodeNoCtrlTarget> 로 HTTP 응답코드를 설정할 수 있다.

http://127.0.0.1:20040/command/hardpurge?url=...

Purge 기본동작

Purge API가 호출될 때 컨텐츠 복구 여부를 선택한다.

# server.xml - <Server><Cache>

<Purge>Normal</Purge>
  • <Purge>
    • Normal (기본) Purge 로 동작한다. (원본장애 시 복구 함)
    • Hard HardPurge 로 동작한다. (원본장애 시 복구하지 않음)

기타설정

관리자는 다음과 같이 몇가지 동작방식에 대해 설정할 수 있다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<Purge2Expire>NONE</Purge2Expire>
<RootPurgeExpire>ON</RootPurgeExpire>
<ResCodeNoCtrlTarget>200</ResCodeNoCtrlTarget>
  • <Purge2Expire> (기본: NONE)

    Purge 요청을 설정에 따라 Expire 로 처리한다. 예를 들어 특정 패턴(/hotclips/*.mp4)를 Purge 하는 경우 의도하지 않게 많은 컨텐츠가 삭제되어 원본에 과도한 부하를 발생시킬 수 있다. 이런 경우 Expire 로 처리하도록 설정하면 과도한 원본부하를 방지할 수 있다.

    • NONE Expire 로 처리하지 않는다.
    • ROOT 도메인 전체(/*)에 대한 PurgeExpire 로 처리한다.
    • PATTERN 모든 패턴 PurgeExpire 로 처리한다.
    • ALL 모든 PurgeExpire 로 처리한다.
  • <RootPurgeExpire> (기본: ON)

    전체 콘텐츠에 대한 의도하지 않은 Purge / Expire 는 과도한 원본서버 부하를 발생시킬 수 있다. 이 설정을 통하여 전체 콘텐츠에 대한 Purge / Expire 를 차단할 수 있다. 이 설정은 <Purge2Expire> 보다 우선한다.

  • <ResCodeNoCtrlTarget> (기본: 200)

    Purge , Expire , HardPurge , ExpireAfter 의 대상객체가 없을 때의 HTTP 응답코드를 설정한다.

대상 지정은 URL, 패턴 2가지로 표현한다.

www.example.com/bar/trip.mp4     // URL
www.example.com/bar/hot/         // URL
www.example.com/bar/*.mp4        // 패턴
www.example.com/bar/hot/*        // 패턴

명확한 URL 외에 패턴(*.mp4)으로 무효화가 가능하다. 하지만 작업을 수행하기 전까지 대상개수를 명확히 알 수 없다. 이는 자칫 관리자의 의도와 다르게 너무 많은 대상을 지정할 수 있다. 이는 실제로 CPU자원을 너무 많이 소모하게 되어 시스템 전체에 부담을 줄 수 있다.

그러므로 실 서비스 중에는 명확한 URL만을 사용할 것을 강력히 권장한다. 패턴표현은 서비스에서 배제된 상태에서 관리용도로 사용하기 위함이다.

주석

보안적인 이유로 www.example.com/files/ 같은 특정 디렉토리에 대한 접근은 403 FORBIDDEN등으로 차단된다. 하지만 루트 디렉토리는 예외를 가진다. 예를 들어 사용자가 www.example.com에 접근하면 브라우저는 루트 디렉토리(/)를 요청한다.

GET / HTTP/1.1
Host: www.example.com

이에 대해 웹서버는 관리자가 설정한 기본 페이지(아마도 index.html 또는 index.htm)로 응답한다. 분명 웹 서비스 구성에서 루트 디렉토리(/)는 디렉토리가 아닌 페이지로 동작한다.

하지만 Cache서버는 루트 디렉토리(/)에 접근했더니 200 OK 페이지가 왔다고 이해한다. 심지어 원본서버가 어떤 페이지를 응답했는지 알지 못한다. 간단히 정리하면 Cache서버의 관점에서는 디렉토리 표현도 URL의 한 종류일 뿐이다.

www.example.com/hot/          // www.example.com 가상호스트의 /hot/  접근한 결과 페이지
www.example.com/              // www.example.com 가상호스트의 기본 페이지(/)
www.example.com/hot/*         // www.example.com 가상호스트의 /hot 디렉토리와  하위 페이지
www.example.com/*             // www.example.com 가상호스트의 모든 콘텐츠

POST 규격

무효화 API를 다음과 같이 POST로 호출할 수 있다.

POST /command/purge HTTP/1.1
Content-Length: 37

url=http://www.example.com/trip.mp4

3부. 관리/운영

9장. 모니터링 & 통계

이 장에서는 모니터링과 통계에 대해 설명한다. 모니터링과 통계는 용도에 따라 서로 다르게 이해되는 경우도 있지만 서비스는 숫자로 이야기한다는 관점에서 둘은 같다고 볼 수 있다.

서비스 인프라의 가장 중요한 요소는 실시간성이다. 5분도 너무 길다. 실시간으로 서비스 상태변화를 볼 수 있어야 한다. 수 많은 정책이 적용과 동시에 효과를 내는지 즉시 알 수 있어야 한다. STON 미디어 서버에서 모든 통계는 1초단위로 수집되며 최소 단위가 된다.

통계는 가상호스트별로 따로 수집될 뿐만 아니라 실시간(1초), 5분 평균으로 제공된다. 고객이 통계를 보다 쉽게 분석, 가공할 수 있도록 JSON과 XML 포맷으로 제공한다.

http://127.0.0.1:20040/monitoring/realtime?type=[JSON 또는 XML]
http://127.0.0.1:20040/monitoring/average?type=[JSON 또는 XML]
  • realtime 1초 전 서비스 상태를 제공한다.
  • average 5분 단위 통계를 제공한다.

호스트 종합통계

호스트 통계는 가장 상위 개념의 통계로 서비스하는 모든 가상호스트의 통계를 종합한다. 같은 통계를 JSON과 XML형식으로 제공한다.

{                                            <Host
  "Host":                                      Version="1.0.0"
  {                                            Name="localhost"
    "Version":"1.0.0",                         State="Healthy"
    "Name":"localhost",                        Uptime="155986"
    "State":"Healthy",                         AllOriginSession="0"
    "Uptime":155996,                           AllOriginActiveSession="0"
    "AllOriginSession":33,                     AllOriginInbound="0"
    "AllOriginActiveSession":20,               AllOriginOutbound="0"
    "AllOriginInbound":688177,                 HttpOriginSession="0"
    "AllOriginOutbound":14184,                 HttpOriginActiveSession="0"
    "HttpOriginSession":62,                    HttpOriginInbound="0"
    "HttpOriginActiveSession":62,              HttpOriginOutbound="0"
    "HttpOriginInbound":2375,                  HlsOriginSession="0"
    "HttpOriginOutbound":2509,                 HlsOriginActiveSession="0"
    "HlsOriginSession":62,                     HlsOriginInbound="0"
    "HlsOriginActiveSession":62,               HlsOriginOutbound="0"
    "HlsOriginInbound":2375,                   MpegDashOriginSession="0"
    "HlsOriginOutbound":2509,                  MpegDashOriginActiveSession="0"
    "MpegDashOriginSession":62,                MpegDashOriginInbound="0"
    "MpegDashOriginActiveSession":62,          MpegDashOriginOutbound="0"
    "MpegDashOriginInbound":2375,              AllClientSession="0"
    "MpegDashOriginOutbound":2509,             AllClientActiveSession="0"
    "AllClientSession":54,                     AllClientInbound="0"
    "AllClientActiveSession":2327,             AllClientOutbound="0"
    "AllClientInbound":2481,                   HttpClientSession="0"
    "AllClientOutbound":8,                     HttpClientActiveSession="0"
    "HttpClientSession":54,                    HttpClientInbound="0"
    "HttpClientActiveSession":2327,            HttpClientOutbound="0"
    "HttpClientInbound":2481,                  HlsClientSession="0"
    "HttpClientOutbound":8,                    HlsClientActiveSession="0"
    "HlsClientSession":54,                     HlsClientInbound="0"
    "HlsClientActiveSession":2327,             HlsClientOutbound="0"
    "HlsClientInbound":2481,                   MpegDashClientSession="0"
    "HlsClientOutbound":8,                     MpegDashClientActiveSession="0"
    "MpegDashClientSession":54,                MpegDashClientInbound="0"
    "MpegDashClientActiveSession":2327,        MpegDashClientOutbound="0"
    "MpegDashClientInbound":2481,              RtmpClientSession="0"
    "MpegDashClientOutbound":8,                RtmpClientActiveSession="0"
    "RtmpClientSession":54,                    RtmpClientInbound="0"
    "RtmpClientActiveSession":2327,            RtmpClientOutbound="0"
    "RtmpClientInbound":2481,                  RequestHitRatio="0"
    "RtmpClientOutbound":8,                    ByteHitRatio="0" >
    "RequestHitRatio":6387,                      <VirtualHost> ... </VirtualHost>
    "ByteHitRatio":2926,                         <VirtualHost> ... </VirtualHost>
    "System":{ ... },                            <VirtualHost> ... </VirtualHost>
    "VirtualHost": [ ... ]                       <View> ... </View>
    "View": [ ... ]                              <View> ... </View>.
  }                                            </Host>
}
  • Version STON 미디어 서버 버전

  • Name 호스트이름. 설정하지 않았다면 시스템 이름을 보여준다.

  • State 서비스 상태. (Healthy=정상 서비스, Inactive=라이센스 비활성화, Emergency)

  • Uptime (단위: 초) 서비스 실행시간

  • AllOriginSession 연결된 전체 원본세션 수

  • AllOriginActiveSession 전송 중인 전체 원본세션 수

  • AllOriginInbound (단위: Bytes, 평균) 전체 원본서버부터 받은 양

  • AllOriginOutbound (단위: Bytes, 평균) 전체 원본서버로 보낸 양

  • HttpOriginSession 연결된 HTTP 원본세션 수

  • HttpOriginActiveSession 전송 중인 HTTP 원본세션 수

  • HttpOriginInbound (단위: Bytes, 평균) HTTP를 이용해 원본서버부터 받은 양

  • HttpOriginOutbound (단위: Bytes, 평균) HTTP를 이용해 원본서버로 보낸 양

  • HlsOriginSession 연결된 HLS 원본세션 수

  • HlsOriginActiveSession 전송 중인 HLS 원본세션 수

  • HlsOriginInbound (단위: Bytes, 평균) HLS를 이용해 원본서버부터 받은 양

  • HlsOriginOutbound (단위: Bytes, 평균) HLS를 이용해 원본서버로 보낸 양

  • MpegDashOriginSession 연결된 MPEG-DASH 원본세션 수

  • MpegDashOriginActiveSession 전송 중인 MPEG-DASH 원본세션 수

  • MpegDashOriginInbound (단위: Bytes, 평균) MPEG-DASH를 이용해 원본서버부터 받은 양

  • MpegDashOriginOutbound (단위: Bytes, 평균) MPEG-DASH를 이용해 원본서버로 보낸 양

  • AllClientSession 연결된 전체 클라이언트 세션 수

  • AllClientActiveSession 전송 중인 전체 클라이언트 세션 수

  • AllClientInbound (단위: Bytes, 평균) 전체 클라이언트로부터 받은 양

  • AllClientOutbound (단위: Bytes, 평균) 전체 클라이언트로에게 보낸 양

  • HttpClientSession 연결된 HTTP 클라이언트 세션 수

  • HttpClientActiveSession 전송 중인 HTTP 클라이언트 세션 수

  • HttpClientInbound (단위: Bytes, 평균) HTTP를 이용해 클라이언트로부터 받은 양

  • HttpClientOutbound (단위: Bytes, 평균) HTTP를 이용해 클라이언트로 보낸 양

  • HlsClientSession 연결된 HLS 클라이언트 세션 수

  • HlsClientActiveSession 전송 중인 HLS 클라이언트 세션 수

  • HlsClientInbound (단위: Bytes, 평균) HLS를 이용해 클라이언트로부터 받은 양

  • HlsClientOutbound (단위: Bytes, 평균) HLS를 이용해 클라이언트로 보낸 양

  • MpegDashClientSession 연결된 MPEG-DASH 클라이언트 세션 수

  • MpegDashClientActiveSession 전송 중인 MPEG-DASH 클라이언트 세션 수

  • MpegDashClientInbound (단위: Bytes, 평균) MPEG-DASH를 이용해 클라이언트로부터 받은 양

  • MpegDashClientOutbound (단위: Bytes, 평균) MPEG-DASH를 이용해 클라이언트로 보낸 양

  • RtmpClientSession 연결된 RTMP 클라이언트 세션 수

  • RtmpClientActiveSession 전송 중인 RTMP 클라이언트 세션 수

  • RtmpClientInbound (단위: Bytes, 평균) RTMP를 이용해 클라이언트로부터 받은 양

  • RtmpClientOutbound (단위: Bytes, 평균) RTMP를 이용해 클라이언트로 보낸 양

  • RequestHitRatio (단위: 0.01%, 평균) HIT율. 캐싱객체가 생성되어 있고 해당 객체가 초기화되어 있다면 HIT이다. 반대로 캐싱객체가 없거나 해당 객체가 원본서버로부터 초기화되지 않았다면 MISS이다.

  • ByteHitRatio (단위: 0.01%, 평균) 원본서버 대비 클라이언트 전송률.

    (클라이언트 Outbound - 원본서버 Inbound) / 클라이언트 Outbound
    

    원본서버가 훨씬 빠른 속도를 가지고 있거나 클라이언트 세션이 금방 끊어진다면 음수가 될 수 있다.

System 통계

시스템 및 전역자원 통계를 JSON과 XML형식으로 제공한다.

"System":                                   <System>
{                                             <CPU
  "CPU":                                          Kernel="689"
  {                                               User="1316"
    "Kernel":689,                                 Idle="7993"
    "User":1316,                                  ProcKernel="570"
    "Idle":7993,                                  ProcUser="1216"
    "ProcKernel":570,                             Nice="0"
    "ProcUser":1216,                              IOWait="52"
    "Nice":0,                                     IRQ="10"
    "IOWait":52,                                  SoftIRQ="12"
    "IRQ":10,                                     Steal="0" />
    "SoftIRQ":12,                             <Mem Free="5914644" STON="9785800"/>
    "Steal":0                                 <Storage>
  },                                            <Disk
  "Mem":                                            Path="/cache1"
  {                                                 Status="Normal"
    "Free":5914644,                                 Read="23"
    "STON":9785800                                  ReadMerged="0"
  },                                                ReadSectors="344"
  "Storage":                                        ReadTime="117"
  {                                                 Write="24"
    "Disk":                                         WriteMerged="93"
    [                                               WriteSectors="936"
      {                                             WriteTime="256"
        "Path":"/cache1",                           IOProgress="0"
        "Status":"Normal",                          IOTime="173"
        "Read":23,                                  IOWeightedTime="373"/>
        "ReadMerged":0,                         <Disk
        "ReadSectors":344,                          Path="/cache2"
        "ReadTime":117,                             Status="Normal"
        "Write":24,                                 Read="27"
        "WriteMerged":93,                           ReadMerged="1"
        "WriteSectors":936,                         ReadSectors="488"
        "WriteTime":256,                            ReadTime="144"
        "IOProgress":0,                             Write="24"
        "IOTime":173,                               WriteMerged="86"
        "IOWeightedTime":373                        WriteSectors="880"
      },                                            WriteTime="254"
      {                                             IOProgress="0"
        "Path":"/cache2",                           IOTime="189"
        "Status":"Normal",                          IOWeightedTime="380"/>
        "Read":27,                            </Storage>
        "ReadMerged":1,                       <ServerSocket
        "ReadSectors":488,                          Total="42"
        "ReadTime":144,                             Established="2"
        "Write":24,                                 Accepted="1"
        "WriteMerged":86,                           Closed="0"/>
        "WriteSectors":880,                   <ClientSocket
        "WriteTime":254,                            Total="1"
        "IOProgress":0,                             Established="0"
        "IOTime":189,                               Connected="0"
        "IOWeightedTime":380                        Closed="0"/>
      }                                       <TCPSocket
    ]                                               Established="30"
  },                                                Timewait="2"
  "ServerSocket":                                   Orphan="0"
  {                                                 Alloc="0"
    "Total":42,                                     Mem="20"/>
    "Established":1,                          <EQ>0</EQ>
    "Accepted":0,                             <RQ>1000000</RQ>
    "Closed":0                                <WaitingFiles2Write>0</WaitingFiles2Write>
  },                                          <ServiceAccess Allow="60" Deny="2"/>
  "ClientSocket":                             <SystemLoadAverage Min1="0" Min5="0" Min15="0"/>
  {                                           <URLRewrite>57</URLRewrite>
    "Total":1,                              </System>
    "Established":0,
    "Connected":0,
    "Closed":0
  },
  "TCPSocket":
  {
    "Established":30,
    "Timewait":2,
    "Orphan":0,
    "Alloc":0,
    "Mem":20
  },
  "EQ":0,
  "RQ":1000000,
  "WaitingFiles2Write":0,
  "ServiceAccess":{"Allow":60, "Deny":2}
  "SystemLoadAverage":
  {
    "Min1":0,
    "Min5":0,
    "Min15":0
  },
  "URLRewrite":57
}
  • CPU (단위: 0.01%) CPU사용량. 전체 CPU사용량은 Kernel + User로 계산해야 한다.
    • Kernel CPU(Kernel) 사용량
    • User CPU(User) 사용량
    • Idle 사용되지 않는 CPU량
    • ProcKernel STON이 사용하는 CPU(Kernel) 사용량
    • ProcUser STON이 사용하는 CPU(User) 사용량
    • Nice niced processes executing in user mode
    • IOWait waiting for I/O to complete
    • IRQ servicing interrupts
    • SoftIRQ servicing softirqs
    • Steal involuntary wait
  • Mem (단위: Bytes) 메모리 사용량. - Free 시스템 Free 메모리 크기 - STON STON이 사용하는 메모리 크기
  • Disk 디스크 성능지표
    • Path 디스크 경로
    • Status 디스크 상태 (Normal: 정상동작, Invalid: 장애로 배제됨, Unmounted: 관리자에 의해 Unmount됨)
    • Read 읽기 성공 횟수
    • ReadMerged 읽기가 병합된 횟수
    • ReadMerged 읽은 섹터 수
    • ReadTime (단위: ms) 읽기 소요시간
    • Write 쓰기 성공 횟수
    • WriteMerged 쓰기가 병합된 횟수
    • WriteSectors 써진 섹터 수
    • WriteTime (단위: ms) 쓰기 소요시간
    • IOProgress 진행 중인 IO개수
    • IOTime (단위: ms) IO 소요시간
    • IOWeightedTime (단위: ms) IO 소요시간(가중치 적용)
  • ServerSocket 서버 소켓(클라이언트와 STON 구간) 정보
    • Total 전체 서버소켓 수
    • Established 연결된 상태의 서버소켓 수
    • Accepted 새롭게 연결된 서버소켓 수
    • Closed 연결이 종료된 서버소켓 수
  • ClientSocket 클라이언트 소켓(STON과 원본서버 구간) 정보
    • Total 전체 클라이언트소켓 수
    • Established 연결된 상태의 클라이언트소켓 수
    • Connected 새롭게 연결된 클라이언트소켓 수
    • Closed 연결이 종료된 클라이언트소켓 수
  • TCPSocket 시스템(OS)이 제공하는 TCP상태 정보
    • Established Established상태의 TCP 연결개수
    • Timewait TIME_WAIT 상태의 TCP 연결개수
    • Orphan 아직 file handle에 attach되지 않은 TCP 연결
    • Alloc 할당된 TCP 연결
    • Mem undocumented
  • EQ STON Framework에서 아직 처리되지 않은 Event개수
  • RQ 최근 서비스된 컨텐츠 참조 큐에 저장된 Event 개수
  • WaitingFiles2Write 디스크에 쓰기 대기중인 파일개수
  • ServiceAccess ServiceAccess에 의해 허가(Allow), 거부(Deny)된 소켓 수
  • SystemLoadAverage System Load Average의 1분/5분/15분 평균
  • URLRewrite URL전처리에 의해 변환이 성공한 횟수

가상호스트 - 종합통계

가상호스트별로 통계가 제공된다. 가상호스트 통계는 프로토콜별로 구분된다.

"VirtualHost":                              <VirtualHost
[                                               Name="www.example.com"
  {                                             Uptime="155986"
    "Name":"www.example.com",                   AllOriginSession="0"
    "Uptime":155996,                            AllOriginActiveSession="0"
    "AllOriginSession":33,                      AllOriginInbound="0"
    "AllOriginActiveSession":20,                AllOriginOutbound="0"
    "AllOriginInbound":688177,                  HttpOriginSession="0"
    "AllOriginOutbound":14184,                  HttpOriginActiveSession="0"
    "HttpOriginSession":62,                     HttpOriginInbound="0"
    "HttpOriginActiveSession":62,               HttpOriginOutbound="0"
    "HttpOriginInbound":2375,                   HlsOriginSession="0"
    "HttpOriginOutbound":2509,                  HlsOriginActiveSession="0"
    "HlsOriginSession":62,                      HlsOriginInbound="0"
    "HlsOriginActiveSession":62,                HlsOriginOutbound="0"
    "HlsOriginInbound":2375,                    MpegDashOriginSession="0"
    "HlsOriginOutbound":2509,                   MpegDashOriginActiveSession="0"
    "MpegDashOriginSession":62,                 MpegDashOriginInbound="0"
    "MpegDashOriginActiveSession":62,           MpegDashOriginOutbound="0"
    "MpegDashOriginInbound":2375,               AllClientSession="0"
    "MpegDashOriginOutbound":2509,              AllClientActiveSession="0"
    "AllClientSession":54,                      AllClientInbound="0"
    "AllClientActiveSession":2327,              AllClientOutbound="0"
    "AllClientInbound":2481,                    HttpClientSession="0"
    "AllClientOutbound":8,                      HttpClientActiveSession="0"
    "HttpClientSession":54,                     HttpClientInbound="0"
    "HttpClientActiveSession":2327,             HttpClientOutbound="0"
    "HttpClientInbound":2481,                   HlsClientSession="0"
    "HttpClientOutbound":8,                     HlsClientActiveSession="0"
    "HlsClientSession":54,                      HlsClientInbound="0"
    "HlsClientActiveSession":2327,              HlsClientOutbound="0"
    "HlsClientInbound":2481,                    MpegDashClientSession="0"
    "HlsClientOutbound":8,                      MpegDashClientActiveSession="0"
    "MpegDashClientSession":54,                 MpegDashClientInbound="0"
    "MpegDashClientActiveSession":2327,         MpegDashClientOutbound="0"
    "MpegDashClientInbound":2481,               RtmpClientSession="0"
    "MpegDashClientOutbound":8,                 RtmpClientActiveSession="0"
    "RtmpClientSession":54,                     RtmpClientInbound="0"
    "RtmpClientActiveSession":2327,             RtmpClientOutbound="0"
    "RtmpClientInbound":2481,                   RequestHitRatio="0"
    "RtmpClientOutbound":8,                     ByteHitRatio="0">
    "RequestHitRatio":6387,                   <Memory>784786700</Memory>
    "ByteHitRatio":2926                       <SecuredMemory>0</SecuredMemory>
    "Memory":785740769,                       <Disk> ... </Disk>
    "SecuredMemory":0,                        <CacheFileEvent> ... </CacheFileEvent>
    "Disk": { ... },                          <OriginTraffics> ... </OriginTraffics>
    "CacheFileEvent": { ... },                <ClientTraffic> ... </ClientTraffic>
    "OriginTraffics": { ... },              </VirtualHost>
    "ClientTraffics": { ... },
  },
  ...
]
  • Memory (단위: Bytes) 메모리에 적재된 컨텐츠 양
  • SecuredMemory (단위: Bytes) 메모리에서 삭제한 컨텐츠 양
  • Disk 디스크 정보
  • CacheFileEvent 캐싱파일 이벤트
  • OriginTraffics 원본 상세통계
  • ClientTraffics 클라이언트 상세통계

디스크 통계

가상호스트가 사용하는 디스크통계를 제공한다.

"Disk":                                      <Disk>
{                                              <TotalSize>22003701435</TotalSize>
  "TotalSize":22004057982,                     <Create>1</Create>
  "Create":0,                                  <Open>10</Open>
  "Open":1,                                    <Delete>0</Delete>
  "Delete":0,                                  <ReadCount>9</ReadCount>
  "ReadCount":1,                               <ReadSize>735726</ReadSize>
  "ReadSize":104744,                           <WriteCount>1</WriteCount>
  "WriteCount":0,                              <WriteSize>157145</WriteSize>
  "WriteSize":0,                               <Distribution
  "Distribution":                                U1K="45725"
  {                                              U2K="192523"
    "U1K="45725,                                 U4K="137055"
    "U2K="192523,                                U8K="39740"
    "U4K="137055,                                U16K="13408"
    "U8K="39740,                                 U32K="12303"
    "U16K="13408,                                U64K="11462"
    "U32K="12303,                                U128K="2560"
    "U64K="11462,                                U256K="22"
    "U128K="2560,                                U512K="0"
    "U256K="22,                                  U1M="45725"
    "U512K="0,                                   U2M="192523"
    "U1M="45725,                                 U4M="137055"
    "U2M="192523,                                U8M="39740"
    "U4M="137055,                                U16M="13408"
    "U8M="39740,                                 U32M="12303"
    "U16M="13408,                                U64M="11462"
    "U32M="12303,                                U128M="2560"
    "U64M="11462,                                U256M="22"
    "U128M="2560,                                U512M="0"
    "U256M="22,                                  U1G="0"
    "U512M="0,                                   U2G="0"
    "U1G="0,                                     U4G="0"
    "U2G="0,                                     U8G="0"
    "U4G="0,                                     U16G="0"
    "U8G="0,                                     O16G="0" />
    "U16G":0,                                  </Disk>
    "O16G":0

  }
}
  • TotalSize (단위: Bytes) 로컬파일 크기 합
  • Create 로컬파일 생성 횟수
  • Open 로컬파일 Open 횟수
  • Delete 로컬파일 삭제 횟수
  • ReadCount 로컬파일에서 Read한 횟수
  • ReadSize (단위: Bytes) 로컬파일에서 Read한 크기
  • WriteCount 로컬파일에서 Write한 횟수
  • WriteSize (단위: Bytes) 로컬파일에서 Write한 크기
  • Distribution 로컬파일 크기별 분포
    • U1K 1KB 미만 파일 개수
    • U2K 2KB 미만 파일 개수
    • U4K 4KB 미만 파일 개수
    • U8K 8KB 미만 파일 개수
    • U16K 16KB 미만 파일 개수
    • U32K 32KB 미만 파일 개수
    • U64K 64KB 미만 파일 개수
    • U128K 128KB 미만 파일 개수
    • U256K 256KB 미만 파일 개수
    • U512K 512KB 미만 파일 개수
    • U1M 1MB 미만 파일 개수
    • U2M 2MB 미만 파일 개수
    • U4M 4MB 미만 파일 개수
    • U8M 8MB 미만 파일 개수
    • U16M 16MB 미만 파일 개수
    • U32M 32MB 미만 파일 개수
    • U64M 64MB 미만 파일 개수
    • U128M 128MB 미만 파일 개수
    • U256M 256MB 미만 파일 개수
    • U512M 512MB 미만 파일 개수
    • U1G 1GB 미만 파일 개수
    • U2G 2GB 미만 파일 개수
    • U4G 4GB 미만 파일 개수
    • U8G 8GB 미만 파일 개수
    • U16G 16GB 미만 파일 개수
    • O16G 16GB 이상 파일 개수

가상호스트 - 원본 상세통계

STON 미디어 서버와 원본서버 사이에 발생하는 트래픽을 프토콜별로 제공한다.

"OriginTraffics":                             <OriginTraffics>
{                                               <Http> ... </Http>
  "Http": { ... }                               <Hls> ... </Hls>
  "Hls": { ... }                                <MpegDash> ... </MpegDash>
  "MpegDash": { ... }                         </OriginTraffics>
}

HTTP 상세통계

HTTP 세부통계는 다음과 같다.

"Http":                                       <Http>
{                                               <ReqCount Sum="600">2</ReqCount>
  "ReqCountSum":0,                              <ReqHeaderSize>3238</ReqHeaderSize>
  "ReqCount":0,                                 <ReqBodySize>0</ReqBodySize>
  "ReqHeaderSize":269,                          <ResHeaderSize>2020</ResHeaderSize>
  "ReqBodySize":0,                              <ResBodySize>104894</ResBodySize>
  "ResHeaderSize":169,                          <Response>
  "ResBodySize":0,                                <ResTotal>
  "Response":                                       <Count Sum="8100">13</Count>
  {                                                 <Completed Sum="8100">12</Completed>
    "ResTotal":                                     <TimeRes>1553</TimeRes>
    {                                               <TimeComplete>6630</TimeComplete>
      "CountSum":0,                               </ResTotal>
      "Count":1,                                  <Res2xx>
      "CompletedSum":0,                             <Count Sum="8100">1</Count>
      "Completed":1,                                <Completed Sum="8100">1</Completed>
      "TimeRes":3300,                               <TimeRes>3300</TimeRes>
      "TimeComplete":3300                           <TimeComplete>69300</TimeComplete>
    },                                            </Res2xx>
    "Res2xx":                                     <Res3xx>
    {                                               <Count Sum="8100">12</Count>
      "CountSum":0,                                 <Completed Sum="8100">11</Completed>
      "Count":0,                                    <TimeRes>1408</TimeRes>
      "CompletedSum":0,                             <TimeComplete>1408</TimeComplete>
      "Completed":0,                              </Res3xx>
      "TimeRes":0,                                <Res4xx>
      "TimeComplete":0                              <Count Sum="8100">0</Count>
    },                                              <Completed Sum="8100">0</Completed>
    "Res3xx":                                       <TimeRes>0</TimeRes>
    {                                               <TimeComplete>0</TimeComplete>
      "CountSum":0,                               </Res4xx>
      "Count":1,                                  <Res5xx>
      "CompletedSum":0,                             <Count Sum="8100">0</Count>
      "Completed":1,                                <Completed Sum="8100">0</Completed>
      "TimeRes":3300,                               <TimeRes>0</TimeRes>
      "TimeComplete":3300                           <TimeComplete>0</TimeComplete>
    },                                            </Res5xx>
    "Res4xx":                                     <ConnectTimeout Sum="8100">0</ConnectTimeout>
    {                                             <ReceiveTimeout Sum="8100">0</ReceiveTimeout>
      "CountSum":0,                               <Close Sum="8100">0</Close>
      "Count":0,                                </Response>
      "CompletedSum":0,                         <Connect>
      "Completed":0,                              <Count>0</Count>
      "TimeRes":0,                                <AvgDNSQueryTime>0</AvgDNSQueryTime>
      "TimeComplete":0                            <AvgConnTime>0</AvgConnTime>
    },                                          </Connect>
    "Res5xx":                                 </Http>
    {
      "CountSum":0,
      "Count":0,
      "CompletedSum":0,
      "Completed":0,
      "TimeRes":0,
      "TimeComplete":0
    },
    "ConnectTimeoutSum":0,
    "ConnectTimeout":0,
    "ReceiveTimeoutSum":0,
    "ReceiveTimeout":0,
    "CloseSum":0,
    "Close":0
  },
  "Connect":
  {
    "Count":0,
    "AvgDNSQueryTime":0,
    "AvgConnTime":0
  }
},
  • ReqCount 원본서버로 보낸 HTTP 요청 횟수
  • ReqHeaderSize (단위: Bytes) 원본서버로 보낸 HTTP 헤더 크기
  • ReqBodySize (단위: Bytes) 원본서버로 보낸 HTTP Body 크기
  • ResHeaderSize (단위: Bytes) 원본서버에서 받은 HTTP 헤더 크기
  • ResBodySize (단위: Bytes) 원본서버에서 받은 HTTP Body 크기
  • Response 원본서버에서 보낸 응답 (ResXXX)
    • Count 응답횟수
    • Completed 정상적으로 전송완료된 HTTP트랜잭션 횟수
    • TimeRes HTTP 응답시간
    • TimeComplete HTTP 트랜잭션 완료시간
    • ConnectTimeout 연결실패
    • ReceiveTimeout 전송지연
    • Close 전송 중 원본서버에서 먼저 소켓 종료
  • Connect 원본서버 접속통계
    • Count 접속횟수
    • AvgDNSQueryTime (단위: 0.01ms) 평균 DNS쿼리 시간
    • AvgConnTime (단위: 0.01ms) 평균 접속시간 (TCP SYN전송 ~ TCP SYN ACK수신)

주석

5분 통계에서만 제공되는 항목.

  • HttpReqCountSum HTTP요청의 총 회수
  • CountSum HTTP응답의 총 회수
  • CompletedSum 완료된 HTTP 트랜잭션의 총 회수
  • ConnectTimeoutSum 원본서버 접속실패 총 회수
  • ReceiveTimeoutSum 원본서버 전송지연 총 회수
  • CloseSum 원본서버에서 먼저 연결을 종료한 총 회수

HLS 상세통계

HLS는 HTTP기반 프로토콜이므로 세부통계가 HTTP 상세통계와 모두 동일하다.

"Hls":                                       <Hls>
{                                               ...
  ...                                        </Hls>
}

MPEG-DASH 상세통계

MPEG-DASH는 HTTP기반 프로토콜이므로 세부통계가 HTTP 상세통계와 모두 동일하다.

"MpegDash":                                  <MpegDash>
{                                               ...
  ...                                        </MpegDash>
}

가상호스트 - 클라이언트 상세통계

STON 미디어 서버와 클라이언트 사이에 발생하는 트래픽을 프토콜별로 제공한다.

"ClientTraffics":                             <ClientTraffics>
{                                               <Http> ... </Http>
  "Http": { ... },                              <Hls> ... </Hls>
  "Hls": { ... },                               <MpegDash> ... </MpegDash>
  "MpegDash": { ... },                          <Rtmp> ... </Rtmp>
  "Rtmp": { ... },                            </ClientTraffics>
}

HTTP 상세통계

HTTP 클라이언트 상세통계는 다음과 같다.

"Http":                                       <Http RequestHitRatio="9998">
{                                               <ReqCount Sum="0">0</ReqCount>
  "RequestHitRatio":9998                        <ReqHeaderSize>4113</ReqHeaderSize>
  "ReqCountSum":0,                              <ReqBodySize>0</ReqBodySize>
  "ReqCount":100,                               <ResHeaderSize>0</ResHeaderSize>
  "ReqHeaderSize":13968,                        <ResBodySize>892871</ResBodySize>
  "ReqBodySize":0,                              <Response>
  "ResHeaderSize":5654,                           <ResTotal>
  "ResBodySize":104744,                             <Count Sum="0">18</Count>
  "Response":                                       <Completed Sum="0">18</Completed>
  {                                                 <TimeRes>666</TimeRes>
    "ResTotal":                                     <TimeComplete>4377</TimeComplete>
    {                                             </ResTotal>
      "CountSum":0,                               <Res2xx>
      "Count":52,                                   <Count Sum="0">10</Count>
      "CompletedSum":0,                             <Completed Sum="0">10</Completed>
      "Completed":52,                               <TimeRes>1200</TimeRes>
      "TimeRes":94,                                 <TimeComplete>7870</TimeComplete>
      "TimeComplete":107                          </Res2xx>
    },                                            <Res3xx>
    "Res2xx":                                       <Count Sum="0">8</Count>
    {                                               <Completed Sum="0">8</Completed>
      "CountSum":0,                                 <TimeRes>0</TimeRes>
      "Count":1,                                    <TimeComplete>12</TimeComplete>
      "CompletedSum":0,                           </Res3xx>
      "Completed":1,                              <Res4xx>
      "TimeRes":4700,                               <Count Sum="0">0</Count>
      "TimeComplete":4800                           <Completed Sum="0">0</Completed>
    },                                              <TimeRes>0</TimeRes>
    "Res3xx":                                       <TimeComplete>0</TimeComplete>
    {                                             </Res4xx>
      "CountSum":0,                               <Res5xx>
      "Count":51,                                   <Count Sum="0">0</Count>
      "CompletedSum":0,                             <Completed Sum="0">0</Completed>
      "Completed":51,                               <TimeRes>0</TimeRes>
      "TimeRes":3,                                  <TimeComplete>0</TimeComplete>
      "TimeComplete":15                           </Res5xx>
    },                                          </Response>
    "Res4xx":                                   <RequestHit
    {                                              TCP_NONE="0"
      "CountSum":0,                                TCP_HIT="0"
      "Count":0,                                   TCP_IMS_HIT="0"
      "CompletedSum":0,                            TCP_REFRESH_HIT="0"
      "Completed":0,                               TCP_REF_FAIL_HIT="0"
      "TimeRes":0,                                 TCP_NEGATIVE_HIT="0"
      "TimeComplete":0                             TCP_REDIRECT_HIT="0"
    },                                             TCP_MISS="0"
    "Res5xx":                                      TCP_REFRESH_MISS="0"
    {                                              TCP_CLIENT_REFRESH_MISS="0"
      "CountSum":0,                                TCP_DENIED="0"
      "Count":0,                                   TCP_ERROR="0" />
      "CompletedSum":0,                         <RequestHitSum
      "Completed":0,                               TCP_NONE="0"
      "TimeRes":0,                                 TCP_HIT="0"
      "TimeComplete":0                             TCP_IMS_HIT="0"
    }                                              TCP_REFRESH_HIT="0"
  },                                               TCP_REF_FAIL_HIT="0"
  "RequestHit":                                    TCP_NEGATIVE_HIT="0"
  {                                                TCP_REDIRECT_HIT="0"
    "TCP_NONE":0,                                  TCP_MISS="0"
    "TCP_HIT":0,                                   TCP_REFRESH_MISS="0"
    "TCP_IMS_HIT":0,                               TCP_CLIENT_REFRESH_MISS="0"
    "TCP_REFRESH_HIT":0,                           TCP_DENIED="0"
    "TCP_REF_FAIL_HIT":0,                          TCP_ERROR="0" />
    "TCP_NEGATIVE_HIT":0,                     </Http>
    "TCP_REDIRECT_HIT":0,
    "TCP_MISS":0,
    "TCP_REFRESH_MISS":0,
    "TCP_CLIENT_REFRESH_MISS":0,
    "TCP_DENIED":0,
    "TCP_ERROR":0
  },
  "RequestHitSum":
  {
    "TCP_NONE":0,
    "TCP_HIT":0,
    "TCP_IMS_HIT":0,
    "TCP_REFRESH_HIT":0,
    "TCP_REF_FAIL_HIT":0,
    "TCP_NEGATIVE_HIT":0,
    "TCP_REDIRECT_HIT":0,
    "TCP_MISS":0,
    "TCP_REFRESH_MISS":0,
    "TCP_CLIENT_REFRESH_MISS":0,
    "TCP_DENIED":0,
    "TCP_ERROR":0
  }
}
  • RequestHit 캐싱 HIT결과
  • ReqCount(단위: Bytes) 클라이언트가 보낸 요청수
  • ReqHeaderSize(단위: Bytes) 클라이언트가 보낸 요청 헤더 크기
  • ReqBodySize(단위: Bytes) 클라이언트가 보낸 요청 Body 크기
  • ResHeaderSize(단위: Bytes) STON이 보낸 응답 헤더 크기
  • ResBodySize(단위: Bytes) STON이 보낸 응답 Body 크기
  • Response STON이 보낸 응답
    • Count 응답횟수
    • Completed 정상적으로 전송완료된 트랜잭션 횟수
    • TimeRes 응답에 소요된 시간 (ms)
    • TimeComplete 트랜잭션 완료시간 (ms)

주석

5분 통계에서만 제공되는 항목.

  • ReqCountSum 클라이언트가 보낸 요청수 누적
  • CountSum 응답의 총 회수
  • CompletedSum 완료된 트랜잭션의 총 회수
  • RequestHitSum 캐시 HIT 결과

HLS 상세통계

HLS는 HTTP기반 프로토콜이므로 세부통계가 HTTP 상세통계와 모두 동일하다.

"Hls":                                       <Hls>
{                                               ...
  ...                                        </Hls>
}

MPEG-DASH 상세통계

MPEG-DASH는 HTTP기반 프로토콜이므로 세부통계가 HTTP 상세통계와 모두 동일하다.

"MpegDash":                                  <MpegDash>
{                                               ...
  ...                                        </MpegDash>
}

RTMP 상세통계

RTMP 통계는 다음과 같다.

"Rtmp":                                       <Rtmp RequestHitRatio="9998">
{                                               <ReqCount Sum="0">0</ReqCount>
  "RequestHitRatio":9998                        <ReqHeaderSize>4113</ReqHeaderSize>
  "ReqCountSum":0,                              <ReqBodySize>0</ReqBodySize>
  "ReqCount":100,                               <ResHeaderSize>0</ResHeaderSize>
  "ReqHeaderSize":13968,                        <ResBodySize>892871</ResBodySize>
  "ReqBodySize":0,                              <NetConnection>
  "ResHeaderSize":5654,                           <Connect>
  "ResBodySize":104744,                             <Success Sum="0">18</Count>
  "NetConnection":                                  <Fail Sum="0">18</Count>
  {                                                 <TimeRes>666</TimeRes>
    "Connect":                                    </Connect>
    {                                             <CreateStream>
      "Success":0,                                  <Success Sum="0">18</Count>
      "Fail":52,                                    <Fail Sum="0">18</Count>
      "TimeRes":0,                                  <TimeRes>666</TimeRes>
    },                                            </CreateStream>
    "CreateStream":                             </NetConnection>
    {                                           <NetStream>
      "Success":0,                                <Play>
      "Fail":52,                                    <Success Sum="0">18</Count>
      "TimeRes":0,                                  <Fail Sum="0">18</Count>
    },                                              <TimeRes>666</TimeRes>
  },                                              </Play>
  "NetStream":                                    <Close>
  {                                                 <Success Sum="0">18</Count>
    "Play":                                         <Fail Sum="0">18</Count>
    {                                               <TimeRes>666</TimeRes>
      "Success":0,                                </Close>
      "Fail":52,                                  <Delete>
      "TimeRes":0,                                  <Success Sum="0">18</Count>
    },                                              <Fail Sum="0">18</Count>
    "Close":                                        <TimeRes>666</TimeRes>
    {                                             </Delete>
      "Success":0,                                <Seek>
      "Fail":52,                                    <Success Sum="0">18</Count>
      "TimeRes":0,                                  <Fail Sum="0">18</Count>
    },                                              <TimeRes>666</TimeRes>
    "Delete":                                     </Seek>
    {                                             <Pause>
      "Success":0,                                  <Success Sum="0">18</Count>
      "Fail":52,                                    <Fail Sum="0">18</Count>
      "TimeRes":0,                                  <TimeRes>666</TimeRes>
    },                                            </Pause>
    "Seek":                                     </NetStream>
    {                                           <RequestHit
      "Success":0,                                 TCP_NONE="0"
      "Fail":52,                                   TCP_HIT="0"
      "TimeRes":0,                                 TCP_IMS_HIT="0"
    },                                             TCP_REFRESH_HIT="0"
    "Pause":                                       TCP_REF_FAIL_HIT="0"
    {                                              TCP_NEGATIVE_HIT="0"
      "Success":0,                                 TCP_REDIRECT_HIT="0"
      "Fail":52,                                   TCP_MISS="0"
      "TimeRes":0,                                 TCP_REFRESH_MISS="0".
    },                                             TCP_CLIENT_REFRESH_MISS="0"
    "RequestHit":                                  TCP_DENIED="0"
    {                                              TCP_ERROR="0" />
      "TCP_NONE":0,                             <RequestHitSum
      "TCP_HIT":0,                                 TCP_NONE="0"
      "TCP_IMS_HIT":0,                             TCP_HIT="0"
      "TCP_REFRESH_HIT":0,                         TCP_IMS_HIT="0"
      "TCP_REF_FAIL_HIT":0,                        TCP_REFRESH_HIT="0"
      "TCP_NEGATIVE_HIT":0,                        TCP_REF_FAIL_HIT="0"
      "TCP_REDIRECT_HIT":0,                        TCP_NEGATIVE_HIT="0"
      "TCP_MISS":0,                                TCP_REDIRECT_HIT="0"
      "TCP_REFRESH_MISS":0,                        TCP_MISS="0"
      "TCP_CLIENT_REFRESH_MISS":0,                 TCP_REFRESH_MISS="0".
      "TCP_DENIED":0,                              TCP_CLIENT_REFRESH_MISS="0"
      "TCP_ERROR":0                                TCP_DENIED="0"
    },                                             TCP_ERROR="0" />
    "RequestHitSum":                          </Rtmp>
    {
      "TCP_NONE":0,
      "TCP_HIT":0,
      "TCP_IMS_HIT":0,
      "TCP_REFRESH_HIT":0,
      "TCP_REF_FAIL_HIT":0,
      "TCP_NEGATIVE_HIT":0,
      "TCP_REDIRECT_HIT":0,
      "TCP_MISS":0,
      "TCP_REFRESH_MISS":0,
      "TCP_CLIENT_REFRESH_MISS":0,
      "TCP_DENIED":0,
      "TCP_ERROR":0
    }
  },
  • RequestHit 캐싱 HIT결과

  • ReqCount(단위: Bytes) 클라이언트가 보낸 요청수

  • ReqHeaderSize(단위: Bytes) 클라이언트가 보낸 요청 헤더 크기

  • ReqBodySize(단위: Bytes) 클라이언트가 보낸 요청 Body 크기

  • ResHeaderSize(단위: Bytes) STON이 보낸 응답 헤더 크기

  • ResBodySize(단위: Bytes) STON이 보낸 응답 Body 크기

  • NetConnection - Connect, CreateStream 메소드 호출 응답

    • Success 성공처리 횟수
    • Fail 실패처리 횟수
    • TimeRes 응답에 소요된 시간 (ms)
  • NetStream - Play, Close, Delete, Seek, Pause 메소드 호출 응답

    • Success 성공처리 횟수
    • Fail 실패처리 횟수
    • TimeRes 응답에 소요된 시간 (ms)

10장. SNMP

이 장에서는 SNMP(Simple Network Management Protocol)에 대해 다룬다. monitoring_stats 의 모든 수치는 SNMP로도 제공될 뿐만 아니라 시간단위와 시스템 상태정보까지 제공한다.

주석

모든 수치는 Gauge로 제공된다. Counter가 아님에 주의한다.

가상호스트별로 실시간 통계와 최대 60분까지 "분" 단위의 평균 통계를 제공한다.

  • 별도의 패키지가 필요없다.
  • snmpd를 별도로 실행하지 않는다.
  • SNMP v1과 v2c를 지원한다.

변수

설정이나 사용자의 의도에 의하여 변경될 수 있는 값을 [변수명]으로 명시한다. 예를 들어 디스크는 여러개가 존재할 수 있다. 이 경우 각 디스크를 가리키는 고유 번호가 필요하며 입력된 순서대로 1부터 할당된다. 이런 변수를 [diskIndex] 로 명시한다.

  • [diskIndex]

    Storage에 설정된 디스크를 의미한다.

    # server.xml - <Server><Cache>
    
    <Storage>
       <Disk>/cache1</Disk>
       <Disk>/cache2</Disk>
       <Disk>/cache3</Disk>
    </Storage>
    

    위와 같이 3개의 디스크가 설정된 환경에서 /cache1의 [diskIndex] 는 1, /cache3의 [diskIndex] 는 3을 가진다. 예를 들어 /cache1의 전체용량에 해당하는 OID는 system.diskInfo.diskInfoTotalSize.1 (1.3.6.1.4.1.40001.2.2.18.1.3.1이 된다. 마지막 .1은 첫번째 디스크를 의미한다.

  • [vhostIndex]

    가상호스트가 로딩될 때 자동으로 부여된다.

    # vhosts.xml
    
    <Vhosts>
       <Vhost Name="www.example.com"> ... </Vhost>
       <Vhost Name="/foo"> ... </Vhost>
       <Vhost Name="www.example.com/bar" StaticIndex="10300"> ... </Vhost>
    </Vhosts>
    

    최초 위와 같이 3개의 가상호스트가 로딩되면 1부터 순차적으로 [vhostIndex] 가 부여된다. 이후 가상호스트는 [vhostIndex] 를 기억하며, 가상호스트가 삭제되더라도 [vhostIndex] 는 변하지 않는다. 가상호스트의 삭제와 추가가 동시에 발생할 경우 삭제가 먼저 동작하며, 신규 추가된 가상호스트는 비어있는 [vhostIndex] 를 부여 받는다.

    _images/sms_snmp_vhostindex1.png

    [vhostIndex] 의 동작방식

  • [diskMin] , [vhostMin]

    시간(분)을 의미한다. 5는 5분의 평균을 의미하며 60은 60분의 평균을 의미한다. 이 값은 1(분)부터 60(분)까지 범위를 가지며 0은 실시간(1초) 데이터를 의미한다.

SNMP에서는 동적으로 값이 바뀔 수 있는 항목에 대하여 Table구조를 사용한다. 예를 들어 "디스크 전체크기"는 디스크의 개수에 따라 제공하는 데이터 개수가 달라지기 때문에 Table구조를 사용하여 표현해야 한다. STON 미디어 서버는 모든 가상호스트에 대하여 "분"단위 통계를 제공한다. 그러므로 [vhostMin] . [vhostIndex] 라는 다소 난해한 표현을 제공한다.

이 표현은 가상호스트별로 원하는 "분" 단위의 통계를 볼 수 있다는 장점을 가지고 있지만 변수가 2개이므로 Table구조로 표현하기 어렵다는 단점이 있다. 이런 문제를 극복하기 위하여 [vhostMin] 의 기본값을 설정하여 SNMPWalk가 동작할 수 있도록 한다.

활성화

전역설정(server.xml)을 통해 SNMP동작방식과 ACL을 설정한다.

# server.xml - <Server><Host>

<SNMP Port="161" Status="Inactive">
   <Allow>192.168.5.1</Allow>
   <Allow>192.168.6.0/24</Allow>
</SNMP>
  • <SNMP> 속성을 통해 SNMP의 동작방식을 설정한다.
    • Port (기본: 161) SNMP 서비스 포트
    • Status (기본: Inactive) SNMP를 활성화 하려면 이 값을 Active 로 설정한다.
  • <Allow> SNMP접근을 허가할 IP주소를 설정한다. IP지정, IP범위지정, 비트마스크, 서브넷 이상 네 가지 형식을 지원한다. 접속한 소켓이 허가된 IP가 아니면 응답을 주지 않는다.

가상호스트/View 변수

SNMP를 통해 제공되는 가상호스트/View 개수와 기본시간(분)을 설정한다.

# server.xml - <Server><Host>

<SNMP VHostCount=0, VHostMin=5 ViewCount=0, ViewMin=5 />
  • VHostCount (기본: 0) 0일 경우 존재하는 가상호스트까지만 응답을 한다. 0보다 큰 값일 경우 가상호스트 존재 유무에 상관없이 설정된 가상호스트까지 응답한다.
  • ViewCount (기본: 0) View에 적용. ( VHostCount 와 동일)
  • VHostMin (기본: 5분, 최대: 60분) [vhostMin] 값을 설정한다. 0~60까지의 값을 가진다. 0일 경우 실시간 데이터를 제공하하며 1~60사이인 경우 해당 분만큼의 평균값을 제공한다.
  • ViewMin (기본: 0) View에 적용. ( VHostMin 와 동일)

예를 들어 3개의 가상호스트가 설정되어 있는 환경에서 SNMPWalk의 동작방식이 달라진다.

  • VHostCount=0인 경우

    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.1 = STRING: "www.example.com"
    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.2 = STRING: "/foo"
    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.3 = STRING: "www.example.com/bar"
    
  • VHostCount=5 경우

    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.1 = STRING: "www.example.com"
    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.2 = STRING: "/foo"
    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.3 = STRING: "www.example.com/bar"
    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.4 = ""
    SNMPv2-SMI::enterprises.40001.2.4.2.1.2.5 = ""
    

기타 변수

기타 변수를 설정한다.

# server.xml - <Server><Host>

<SNMP GlobalMin="5" DiskMin="5" ConfCount="10" />
  • GlobalMin (기본: 5분, 최대: 60분) [globalMin] 값을 설정한다.
  • DiskMin (기본: 5분, 최대: 60분) [diskMin] 값을 설정한다.
  • ConfCount (기본: 10) 설정목록을 n개까지 열람한다. 1~100사이에서 지정 가능하다. 1은 현재 반영된 설정을 의미하며 2는 이전 설정을 의미한다. 100은 현재를 기준으로 99번 이전의 설정을 의미한다.

Community

Community를 설정하여 허가된 OID에만 접근/차단되도록 설정한다.

# server.xml - <Server><Host>

<SNMP UnregisteredCommunity="Allow">
   <Community Name="example1" OID="Allow">
      <OID>1.3.6.1.4.1.40001.2.4.1</OID>
      <OID>1.3.6.1.4.1.40001.2.4.2</OID>
      <OID>1.3.6.1.4.1.40001.2.4.4</OID>
   </Community>
   <Community Name="example2" OID="Deny">
      <OID>1.3.6.1.4.1.40001.2.4.3.1.11.11.10.1-61</OID>
   </Community>
</SNMP>

<SNMP>UnregisteredCommunity 를 "Deny"로 설정하면 등록되지 않은 Community 요청은 차단한다.

  • <Community> Community를 설정한다.
    • Name Community 이름.
    • OID (기본: Allow) 하위 <OID> 태그의 값을 설정한다. 속성 값이 Allow 라면 하위 <OID> 목록만 접근 가능하다. 반대로 속성 값이 Deny 라면 하위 <OID>목록에는 접근이 불가능하다.

명시적인 OID(1.3.6.1.4.1.40001.2.4.4)와 범위OID(1.3.6.1.4.1.40001.2.4.3.1.11.11.10.1-61) 표현이 가능하다. OID를 허용/차단할 경우 하위 모든 OID에 대해 같은 규칙이 적용된다.

meta

OID = 1.3.6.1.4.1.40001.2.1

메타정보를 제공한다.

OID Name Type Description
.1 manufacture String "WineSOFT Inc."
.2 software String "STON Media Server"
.3 version String 버전
.4 hostname String 호스트 이름
.5 state String "Healthy" 또는 "Inactive" 또는 "Emergency"
.6 uptime Integer 실행시간 (초)
.7 admin String <Admin> ... </Admin>
.10 Conf OID Conf 확장

meta.conf

OID = 1.3.6.1.4.1.40001.2.1.10

[confIndex]<SNMP>ConfCount 속성에서 설정한다. [confIndex] 가 1인 경우는 항상 현재 적용된 설정 값을, 2인 경우는 이전 설정 값을 의미한다. 10 이라면 현재(1)로부터 9번째 이전의 설정을 의미한다.

OID Name Type Description
.1. [confIndex] ID Integer 설정 ID
.2. [confIndex] Time Integer 설정시간 (Unix 시간)
.3. [confIndex] Type Integer 설정형태 (0: Unknown, 1: 구동, 2: reload, 3: upload, 4: restore)
.4. [confIndex] Size Integer 설정파일 크기
.5. [confIndex] Hash String 설정파일 Hash문자열
.6. [confIndex] Path String 설정파일 저장경로
.7. [confIndex] Ver String 설정할 때의 STON 미디어 서버 버전

system

OID = 1.3.6.1.4.1.40001.2.2

STON 미디어 서버가 동작하는 시스템 정보를 제공한다. [sysMin] 변수는 0~60분까지의 값을 가지며 실시간 또는 원하는 시간만큼의 평균 값을 제공한다. SNMPWalk에서 [sysMin] 은 0으로 설정되며 현재 정보를 제공한다.

OID Name Type Description
.1. [sysMin] cpuTotal Integer 전체 CPU 사용률 (100%)
.2. [sysMin]     전체 CPU 사용률 (10000%)
.3. [sysMin] cpuKernel Integer CPU(Kernel) 사용률 (100%)
.4. [sysMin]     CPU(Kernel) 사용률 (10000%)
.5. [sysMin] cpuUser Integer CPU(User) 사용률 (100%)
.6. [sysMin]     CPU(User) 사용률 (10000%)
.7. [sysMin] cpuIdle Integer CPU(Idle) 사용률 (100%)
.8. [sysMin]     CPU(Idle) 사용률 (10000%)
.9 memTotal Integer 시스템 전체 메모리 (KB)
.10. [sysMin] memUse Integer 시스템 사용 메모리 (KB)
.11. [sysMin] memFree Integer 시스템 여유 메모리 (KB)
.12. [sysMin] memSTON Integer STON 미디어 서버 사용 메모리 (KB)
.13. [sysMin] memUseRatio Integer 시스템 메모리 사용률 (100%)
.14. [sysMin]     시스템 메모리 사용률 (10000%)
.15. [sysMin] memSTONRatio Integer STON 미디어 서버 메모리 사용률 (100%)
.16. [sysMin]     STON 미디어 서버 메모리 사용률 (10000%)
.17 diskCount Integer disk개수
.18.1 diskInfo OID diskInfo확장
.19.1 diskPerf OID diskPerf확장
.20. [sysMin] cpuProcKernel Integer STON 미디어 서버가 사용하는 CPU(Kernel) 사용률 (100%)
.21. [sysMin]     STON 미디어 서버가 사용하는 CPU(Kernel) 사용률 (10000%)
.22. [sysMin] cpuProcUser Integer STON 미디어 서버가 사용하는 CPU(User) 사용률 (100%)
.23. [sysMin]     STON 미디어 서버가 사용하는 CPU(User) 사용률 (10000%)
.24. [sysMin] sysLoadAverage Integer Load Average 1분 평균 (0.01)
.25. [sysMin]     Load Average 5분 평균 (0.01)
.26. [sysMin]     Load Average 15분 평균 (0.01)
.27. [sysMin] cpuNice Integer CPU(Nice) (100%)
.28. [sysMin]     CPU(Nice) (10000%)
.29. [sysMin] cpuIOWait Integer CPU(IOWait) (100%)
.30. [sysMin]     CPU(IOWait) (10000%)
.31. [sysMin] cpuIRQ Integer CPU(IRQ) (100%)
.32. [sysMin]     CPU(IRQ) (10000%)
.33. [sysMin] cpuSoftIRQ Integer CPU(SoftIRQ) (100%)
.34. [sysMin]     CPU(SoftIRQ) (10000%)
.35. [sysMin] cpuSteal Integer CPU(Steal) (100%)
.36. [sysMin] CPU(Steal) Integer (10000%)
.40. [sysMin] TCPSocket.Established. [globalMin] Integer Established상태의 TCP 연결개수
.41. [sysMin] TCPSocket.Timewait. [globalMin] Integer TIME_WAIT 상태의 TCP 연결개수
.42. [sysMin] TCPSocket.Orphan. [globalMin] Integer 아직 file handle에 attach되지 않은 TCP 연결
.43. [sysMin] TCPSocket.Alloc. [globalMin] Integer 할당된 TCP 연결
.44. [sysMin] TCPSocket.Mem. [globalMin] Integer undocumented

system.diskInfo

OID = 1.3.6.1.4.1.40001.2.2.18.1

디스크 정보를 제공한다.

OID Name Type Description
.2. [diskIndex] diskInfoPath String 디스크 경로
.3. [diskIndex] diskInfoTotalSize Integer 디스크 전체용량 (MB)
.4. [diskIndex] diskInfoUseSize Integer 디스크 사용량 (MB)
.5. [diskIndex] diskInfoFreeSize Integer 디스크 사용 가능량 (MB)
.6. [diskIndex] diskInfoUseRatio Integer 디스크 사용률 (100%)
.7. [diskIndex]     디스크 사용률 (10000%)
.8. [diskIndex] diskInfoStatus String "Normal" 또는 "Invalid" 또는 "Unmounted"

system.diskPerf

OID = 1.3.6.1.4.1.40001.2.2.19.1

디스크 성능상태를 제공한다.

OID Name Type Description
.2. [diskMin] . [diskIndex] diskPerfReadCount Integer 읽기 성공 횟수
.3. [diskMin] . [diskIndex] diskPerfReadMergedCount Integer 읽기가 병합된 횟수
.4. [diskMin] . [diskIndex] diskPerfReadSectorsCount Integer 읽은 섹터 수
.5. [diskMin] . [diskIndex] diskPerfReadTime Integer 읽기 소요시간(ms)
.6. [diskMin] . [diskIndex] diskPerfWriteCount Integer 쓰기 성공 횟수
.7. [diskMin] . [diskIndex] diskPerfWriteMergedCount Integer 쓰기가 병합된 횟수
.8. [diskMin] . [diskIndex] diskPerfWriteSectorsCount Integer 써진 섹터 수
.9. [diskMin] . [diskIndex] diskPerfWriteTime Integer 쓰기 소요시간(ms)
.10. [diskMin] . [diskIndex] diskPerfIOProgressCount Integer 진행 중인 IO개수
.11. [diskMin] . [diskIndex] diskPerfIOTime Integer IO 소요시간(ms)
.12. [diskMin] . [diskIndex] diskPerfIOTimeWeighted Integer IO 소요시간(ms, 가중치 적용)

global

OID = 1.3.6.1.4.1.40001.2.3

STON 미디어 서버의 모든 모듈이 공통적으로 사용하는 자원정보(소켓, 이벤트 등)를 제공한다.

  • ServerSocket

    클라이언트 ~ STON구간. STON이 클라이언트의 요청을 처리할 용도로 사용하는 소켓

  • ClientSocket

    STON ~ 원본서버구간. STON이 원본서버로 요청을 보내는 용도로 사용하는 소켓

OID Name Type Description
.5 EQ. [globalMin] Integer STON Framework에서 아직 처리되지 않은 Event개수
.6 RQ. [globalMin] Integer 최근 서비스된 컨텐츠 참조 큐에 저장된 Event 개수
.7 waitingFiles2Write. [globalMin] Integer 쓰기대기 중인 파일개수
.10 ServerSocket.Total. [globalMin] Integer 전체 서버소켓 수
.11 ServerSocket.Established. [globalMin] Integer 연결된 상태의 서버소켓 수
.12 ServerSocket.Accepted. [globalMin] Integer 새롭게 연결된 서버소켓 수
.13 ServerSocket.Closed. [globalMin] Integer 연결이 종료된 서버소켓 수
.20 ClientSocket.Total. [globalMin] Integer 전체 클라이언트소켓 수
.21 ClientSocket.Established. [globalMin] Integer 연결된 상태의 클라이언트소켓 수
.22 ClientSocket.Accepted. [globalMin] Integer 새롭게 연결된 클라이언트소켓 수
.23 ClientSocket.Closed. [globalMin] Integer 연결이 종료된 클라이언트소켓 수
.30 ServiceAccess.Allow. [globalMin] Integer ServiceAccess에 의해 허가(Allow)된 소켓 수
.31 ServiceAccess.Deny. [globalMin] Integer ServiceAccess에 의해 거부(Deny)된 소켓 수

cache

OID = 1.3.6.1.4.1.40001.2.4

캐시 서비스의 통계는 가상호스트별로 상세하게 수집/제공된다.

OID Name Type Description
.1 host OID 호스트 (확장)
.2 vhostCount Integer 가상호스트 개수
.3.1 vhost OID 가상호스트별 통계
.4 vhostIndexMax Integer [vhostIndex] 최대 값. SNMPWalk는 이 수치를 기준으로 동작한다.
.10 viewCount Integer View 개수
.11.1 view OID View별 통계
.12 viewIndexMax Integer [viewIndex] 최대 값. SNMPWalk는 이 수치를 기준으로 동작한다.

cache.host

OID = 1.3.6.1.4.1.40001.2.4.1

호스트(=모든 가상호스트)의 정보를 제공한다.

OID Name Type Description
.2 name String 호스트 이름
.3 status String "Healthy" 또는 "Inactive"
.4 uptime Integer STON 미디어 서버 실행시간 (초)
.10 contents OID 컨텐츠 정보 (확장)
.11 traffic OID 통계 (확장)

cache.host.contents

OID = 1.3.6.1.4.1.40001.2.4.1.10

호스트(=모든 가상호스트)가 서비스하는 컨텐츠 통계를 제공한다.

OID Name Type Description
.1 memory Integer 메모리 캐싱 크기(KB)
.2 filesTotalCount Integer 서비스 중인 파일개수
.3 filesTotalSize Integer 서비스 중인 전체 파일량(MB)
.10 filesCountU1KB Integer 1KB미만 파일개수
.11 filesCountU2KB Integer 2KB미만 파일개수
.12 filesCountU4KB Integer 4KB미만 파일개수
.13 filesCountU8KB Integer 8KB미만 파일개수
.14 filesCountU16KB Integer 16KB미만 파일개수
.15 filesCountU32KB Integer 32KB미만 파일개수
.16 filesCountU64KB Integer 64KB미만 파일개수
.17 filesCountU128KB Integer 128KB미만 파일개수
.18 filesCountU256KB Integer 256KB미만 파일개수
.19 filesCountU512KB Integer 512KB미만 파일개수
.20 filesCountU1MB Integer 1MB미만 파일개수
.21 filesCountU2MB Integer 2MB미만 파일개수
.22 filesCountU4MB Integer 4MB미만 파일개수
.23 filesCountU8MB Integer 8MB미만 파일개수
.24 filesCountU16MB Integer 16MB미만 파일개수
.25 filesCountU32MB Integer 32MB미만 파일개수
.26 filesCountU64MB Integer 64MB미만 파일개수
.27 filesCountU128MB Integer 128MB미만 파일개수
.28 filesCountU256MB Integer 256MB미만 파일개수
.29 filesCountU512MB Integer 512MB미만 파일개수
.30 filesCountU1GB Integer 1GB미만 파일개수
.31 filesCountU2GB Integer 2GB미만 파일개수
.32 filesCountU4GB Integer 4GB미만 파일개수
.33 filesCountU8GB Integer 8GB미만 파일개수
.34 filesCountU16GB Integer 16GB미만 파일개수
.35 filesCountO16GB Integer 16GB이상 파일개수

cache.host.traffic

OID = 1.3.6.1.4.1.40001.2.4.1.11

호스트(=모든 가상호스트)의 캐시 서비스와 트래픽 통계를 제공한다. traffic의 모든 통계는 최대 60분까지의 평균으로 제공한다. min은 '분'을 의미하며 최대 60까지의 값을 가진다. min이 생략되거나 0이라면 실시간정보를 제공한다.

OID Name Type Description
.1. [vhostMin] requestHitRatio Integer Request Hit Ratio(100%)
.2. [vhostMin]     Request Hit Ratio(10000%)
.3. [vhostMin] bytesHitRatio Integer Bytes Hit Ratio(100%)
.4. [vhostMin]     Bytes Hit Ratio(10000%)
.10 origin OID 원본 트래픽 정보 (확장)
.11 client OID 클라이언트 트래픽 정보 (확장)

cache.host.traffic.origin

OID = 1.3.6.1.4.1.40001.2.4.1.11.10

종합적인 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 원본서버로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] outbound Integer 원본서버로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 전체 원본서버 평균 세션수
.4. [vhostMin] activeSessionAverage Integer 전체 원본서버 세션수 중 전송 중인 평균 세션수
.10 http OID HTTP 트래픽 (확장)
.11 hls OID HLS 트래픽 (확장)
.12 mpegdash OID MPEG-DASH 트래픽 (확장)
.20 rtmp OID RTMP 트래픽 (확장)

cache.host.traffic.origin.http

OID = 1.3.6.1.4.1.40001.2.4.1.11.10.10

HTTP 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 원본서버로부터 받는 평균 HTTP 트래픽(Bytes)
.2. [vhostMin] outbound Integer 원본서버로 보내는 평균 HTTP 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 원본서버 평균 HTTP세션 수
.4. [vhostMin] activeSessionAverage Integer 원본서버 평균 HTTP세션 중 전송 중인 평균 세션수
.10. [vhostMin] reqHeaderSize Integer 원본서버로 보내는 평균 HTTP Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 원본서버로 보내는 평균 HTTP Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 원본서버로부터 받는 평균 HTTP Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 원본서버로부터 받는 평균 HTTP Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 원본서버로 보낸 평균 HTTP요청 개수
.15. [vhostMin] reqCount Integer 원본서버로 보낸 HTTP요청 개수
.20. [vhostMin] res2xxAverage Integer 원본서버가 보낸 평균 2xx응답 개수
.21. [vhostMin] res2xxCompleteAverage Integer 원본서버로부터 성공한 평균 2xx 트랜잭션 개수
.22. [vhostMin] res2xxTimeRes Integer 원본서버로부터 2xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.23. [vhostMin] res2xxTimeComplete Integer 원본서버로부터 2xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] res2xxCount Integer 원본서버가 보낸 2xx응답 개수
.25. [vhostMin] res2xxCompleteCount Integer 원본서버로부터 성공한 2xx 트랜잭션 개수
.30. [vhostMin] res3xxAverage Integer 원본서버가 보낸 평균 3xx응답 개수
.31. [vhostMin] res3xxCompleteAverage Integer 원본서버로부터 성공한 평균 3xx 트랜잭션 개수
.32. [vhostMin] res3xxTimeRes Integer 원본서버로부터 3xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.33. [vhostMin] res3xxTimeComplete Integer 원본서버로부터 3xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] res3xxCount Integer 원본서버가 보낸 3xx응답 개수
.35. [vhostMin] res3xxCompleteCount Integer 원본서버로부터 성공한 3xx 트랜잭션 개수
.40. [vhostMin] res4xxAverage Integer 원본서버가 보낸 평균 4xx응답 개수
.41. [vhostMin] res4xxCompleteAverage Integer 원본서버로부터 성공한 평균 4xx 트랜잭션 개수
.42. [vhostMin] res4xxTimeRes Integer 원본서버로부터 4xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.43. [vhostMin] res4xxTimeComplete Integer 원본서버로부터 4xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] res4xxCount Integer 원본서버가 보낸 4xx응답 개수
.45. [vhostMin] res4xxCompleteCount Integer 원본서버로부터 성공한 4xx 트랜잭션 개수
.50. [vhostMin] res5xxAverage Integer 원본서버가 보낸 평균 5xx응답 개수
.51. [vhostMin] res5xxCompleteAverage Integer 원본서버로부터 성공한 평균 5xx 트랜잭션 개수
.52. [vhostMin] res5xxTimeRes Integer 원본서버로부터 5xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.53. [vhostMin] res5xxTimeComplete Integer 원본서버로부터 5xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] res5xxCount Integer 원본서버가 보낸 5xx응답 개수
.55. [vhostMin] res5xxCompleteCount Integer 원본서버로부터 성공한 5xx 트랜잭션 개수
.80. [vhostMin] resTotalAverage Integer 원본서버가 보낸 전체 평균 HTTP응답 개수
.81. [vhostMin] resTotalCompleteAverage Integer 원본서버로부터 성공한 평균 HTTP트랜잭션 개수
.82. [vhostMin] resTotalTimeRes Integer 원본서버로부터 응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.83. [vhostMin] resTotalTimeComplete Integer 원본서버로부터 응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] resTotalCount Integer 원본서버가 보낸 전체 HTTP응답 개수
.85. [vhostMin] resTotalCompleteCount Integer 원본서버로부터 성공한 HTTP트랜잭션 개수
.90. [vhostMin] connectTimeoutAverage Integer 평균 원본서버 접속실패 횟수
.91. [vhostMin] receiveTimeoutAverage Integer 평균 원본서버 전송실패 횟수
.92. [vhostMin] connectAverage Integer 평균 원본서버 접속성공 횟수
.93. [vhostMin] dnsQueryTime Integer 원본서버 접속 시 평균 DNS쿼리 소요시간
.94. [vhostMin] connectTime Integer 원본서버 평균 접속 소요시간(0.01ms)
.95. [vhostMin] connectTimeoutCount Integer 원본서버 접속실패 횟수
.96. [vhostMin] receiveTimeoutCount Integer 원본서버 전송실패 횟수
.97. [vhostMin] connectCount Integer 원본서버 접속성공 횟수
.98. [vhostMin] closeAverage Integer 전송 중 원본서버에서 먼저 소켓을 종료한 평균 횟수
.99. [vhostMin] closeCount Integer 전송 중 원본서버에서 먼저 소켓을 종료한 횟수

cache.host.traffic.origin.hls

OID = 1.3.6.1.4.1.40001.2.4.1.11.10.11

HLS 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 원본서버로부터 받는 평균 HLS 트래픽(Bytes)
.2. [vhostMin] outbound Integer 원본서버로 보내는 평균 HLS 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 원본서버 평균 HLS세션 수
.4. [vhostMin] activeSessionAverage Integer 원본서버 평균 HLS세션 중 전송 중인 평균 세션수
.10. [vhostMin] reqHeaderSize Integer 원본서버로 보내는 평균 HLS Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 원본서버로 보내는 평균 HLS Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 원본서버로부터 받는 평균 HLS Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 원본서버로부터 받는 평균 HLS Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 원본서버로 보낸 평균 HLS요청 개수
.15. [vhostMin] reqCount Integer 원본서버로 보낸 HLS요청 개수
.20. [vhostMin] res2xxAverage Integer 원본서버가 보낸 평균 2xx응답 개수
.21. [vhostMin] res2xxCompleteAverage Integer 원본서버로부터 성공한 평균 2xx 트랜잭션 개수
.22. [vhostMin] res2xxTimeRes Integer 원본서버로부터 2xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.23. [vhostMin] res2xxTimeComplete Integer 원본서버로부터 2xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] res2xxCount Integer 원본서버가 보낸 2xx응답 개수
.25. [vhostMin] res2xxCompleteCount Integer 원본서버로부터 성공한 2xx 트랜잭션 개수
.30. [vhostMin] res3xxAverage Integer 원본서버가 보낸 평균 3xx응답 개수
.31. [vhostMin] res3xxCompleteAverage Integer 원본서버로부터 성공한 평균 3xx 트랜잭션 개수
.32. [vhostMin] res3xxTimeRes Integer 원본서버로부터 3xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.33. [vhostMin] res3xxTimeComplete Integer 원본서버로부터 3xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] res3xxCount Integer 원본서버가 보낸 3xx응답 개수
.35. [vhostMin] res3xxCompleteCount Integer 원본서버로부터 성공한 3xx 트랜잭션 개수
.40. [vhostMin] res4xxAverage Integer 원본서버가 보낸 평균 4xx응답 개수
.41. [vhostMin] res4xxCompleteAverage Integer 원본서버로부터 성공한 평균 4xx 트랜잭션 개수
.42. [vhostMin] res4xxTimeRes Integer 원본서버로부터 4xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.43. [vhostMin] res4xxTimeComplete Integer 원본서버로부터 4xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] res4xxCount Integer 원본서버가 보낸 4xx응답 개수
.45. [vhostMin] res4xxCompleteCount Integer 원본서버로부터 성공한 4xx 트랜잭션 개수
.50. [vhostMin] res5xxAverage Integer 원본서버가 보낸 평균 5xx응답 개수
.51. [vhostMin] res5xxCompleteAverage Integer 원본서버로부터 성공한 평균 5xx 트랜잭션 개수
.52. [vhostMin] res5xxTimeRes Integer 원본서버로부터 5xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.53. [vhostMin] res5xxTimeComplete Integer 원본서버로부터 5xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] res5xxCount Integer 원본서버가 보낸 5xx응답 개수
.55. [vhostMin] res5xxCompleteCount Integer 원본서버로부터 성공한 5xx 트랜잭션 개수
.80. [vhostMin] resTotalAverage Integer 원본서버가 보낸 전체 평균 HLS응답 개수
.81. [vhostMin] resTotalCompleteAverage Integer 원본서버로부터 성공한 평균 HLS트랜잭션 개수
.82. [vhostMin] resTotalTimeRes Integer 원본서버로부터 응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.83. [vhostMin] resTotalTimeComplete Integer 원본서버로부터 응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] resTotalCount Integer 원본서버가 보낸 전체 HLS응답 개수
.85. [vhostMin] resTotalCompleteCount Integer 원본서버로부터 성공한 HLS트랜잭션 개수
.90. [vhostMin] connectTimeoutAverage Integer 평균 원본서버 접속실패 횟수
.91. [vhostMin] receiveTimeoutAverage Integer 평균 원본서버 전송실패 횟수
.92. [vhostMin] connectAverage Integer 평균 원본서버 접속성공 횟수
.93. [vhostMin] dnsQueryTime Integer 원본서버 접속 시 평균 DNS쿼리 소요시간
.94. [vhostMin] connectTime Integer 원본서버 평균 접속 소요시간(0.01ms)
.95. [vhostMin] connectTimeoutCount Integer 원본서버 접속실패 횟수
.96. [vhostMin] receiveTimeoutCount Integer 원본서버 전송실패 횟수
.97. [vhostMin] connectCount Integer 원본서버 접속성공 횟수
.98. [vhostMin] closeAverage Integer 전송 중 원본서버에서 먼저 소켓을 종료한 평균 횟수
.99. [vhostMin] closeCount Integer 전송 중 원본서버에서 먼저 소켓을 종료한 횟수

cache.host.traffic.origin.mpegdash

OID = 1.3.6.1.4.1.40001.2.4.1.11.10.12

MPEG-DASH 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 원본서버로부터 받는 평균 MPEG-DASH 트래픽(Bytes)
.2. [vhostMin] outbound Integer 원본서버로 보내는 평균 MPEG-DASH 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 원본서버 평균 MPEG-DASH세션 수
.4. [vhostMin] activeSessionAverage Integer 원본서버 평균 MPEG-DASH세션 중 전송 중인 평균 세션수
.10. [vhostMin] reqHeaderSize Integer 원본서버로 보내는 평균 MPEG-DASH Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 원본서버로 보내는 평균 MPEG-DASH Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 원본서버로부터 받는 평균 MPEG-DASH Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 원본서버로부터 받는 평균 MPEG-DASH Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 원본서버로 보낸 평균 MPEG-DASH요청 개수
.15. [vhostMin] reqCount Integer 원본서버로 보낸 MPEG-DASH요청 개수
.20. [vhostMin] res2xxAverage Integer 원본서버가 보낸 평균 2xx응답 개수
.21. [vhostMin] res2xxCompleteAverage Integer 원본서버로부터 성공한 평균 2xx 트랜잭션 개수
.22. [vhostMin] res2xxTimeRes Integer 원본서버로부터 2xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.23. [vhostMin] res2xxTimeComplete Integer 원본서버로부터 2xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] res2xxCount Integer 원본서버가 보낸 2xx응답 개수
.25. [vhostMin] res2xxCompleteCount Integer 원본서버로부터 성공한 2xx 트랜잭션 개수
.30. [vhostMin] res3xxAverage Integer 원본서버가 보낸 평균 3xx응답 개수
.31. [vhostMin] res3xxCompleteAverage Integer 원본서버로부터 성공한 평균 3xx 트랜잭션 개수
.32. [vhostMin] res3xxTimeRes Integer 원본서버로부터 3xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.33. [vhostMin] res3xxTimeComplete Integer 원본서버로부터 3xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] res3xxCount Integer 원본서버가 보낸 3xx응답 개수
.35. [vhostMin] res3xxCompleteCount Integer 원본서버로부터 성공한 3xx 트랜잭션 개수
.40. [vhostMin] res4xxAverage Integer 원본서버가 보낸 평균 4xx응답 개수
.41. [vhostMin] res4xxCompleteAverage Integer 원본서버로부터 성공한 평균 4xx 트랜잭션 개수
.42. [vhostMin] res4xxTimeRes Integer 원본서버로부터 4xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.43. [vhostMin] res4xxTimeComplete Integer 원본서버로부터 4xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] res4xxCount Integer 원본서버가 보낸 4xx응답 개수
.45. [vhostMin] res4xxCompleteCount Integer 원본서버로부터 성공한 4xx 트랜잭션 개수
.50. [vhostMin] res5xxAverage Integer 원본서버가 보낸 평균 5xx응답 개수
.51. [vhostMin] res5xxCompleteAverage Integer 원본서버로부터 성공한 평균 5xx 트랜잭션 개수
.52. [vhostMin] res5xxTimeRes Integer 원본서버로부터 5xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.53. [vhostMin] res5xxTimeComplete Integer 원본서버로부터 5xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] res5xxCount Integer 원본서버가 보낸 5xx응답 개수
.55. [vhostMin] res5xxCompleteCount Integer 원본서버로부터 성공한 5xx 트랜잭션 개수
.80. [vhostMin] resTotalAverage Integer 원본서버가 보낸 전체 평균 MPEG-DASH응답 개수
.81. [vhostMin] resTotalCompleteAverage Integer 원본서버로부터 성공한 평균 MPEG-DASH트랜잭션 개수
.82. [vhostMin] resTotalTimeRes Integer 원본서버로부터 응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.83. [vhostMin] resTotalTimeComplete Integer 원본서버로부터 응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] resTotalCount Integer 원본서버가 보낸 전체 MPEG-DASH응답 개수
.85. [vhostMin] resTotalCompleteCount Integer 원본서버로부터 성공한 MPEG-DASH트랜잭션 개수
.90. [vhostMin] connectTimeoutAverage Integer 평균 원본서버 접속실패 횟수
.91. [vhostMin] receiveTimeoutAverage Integer 평균 원본서버 전송실패 횟수
.92. [vhostMin] connectAverage Integer 평균 원본서버 접속성공 횟수
.93. [vhostMin] dnsQueryTime Integer 원본서버 접속 시 평균 DNS쿼리 소요시간
.94. [vhostMin] connectTime Integer 원본서버 평균 접속 소요시간(0.01ms)
.95. [vhostMin] connectTimeoutCount Integer 원본서버 접속실패 횟수
.96. [vhostMin] receiveTimeoutCount Integer 원본서버 전송실패 횟수
.97. [vhostMin] connectCount Integer 원본서버 접속성공 횟수
.98. [vhostMin] closeAverage Integer 전송 중 원본서버에서 먼저 소켓을 종료한 평균 횟수
.99. [vhostMin] closeCount Integer 전송 중 원본서버에서 먼저 소켓을 종료한 횟수

cache.host.traffic.origin.rtmp

OID = 1.3.6.1.4.1.40001.2.4.1.11.10.20

(지원예정) RTMP 원본서버 트래픽 통계를 제공한다.

cache.host.traffic.client

OID = 1.3.6.1.4.1.40001.2.4.1.11.11

종합적인 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 전체 클라이언트 평균 세션수
.4. [vhostMin] activeSessionAverage Integer 전체 클라이언트 중 전송 중인 평균 세션수
.5 requestHitAverage OID 전체 평균 캐시 HIT결과
.5.1. [vhostMin] requestHitAverage.TCP_HIT Integer TCP_HIT
.5.2. [vhostMin] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.5.3. [vhostMin] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.5.4. [vhostMin] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.5.5. [vhostMin] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.5.6. [vhostMin] requestHitAverage.TCP_MISS Integer TCP_MISS
.5.7. [vhostMin] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.5.8. [vhostMin] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.5.9. [vhostMin] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.5.10. [vhostMin] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.5.11. [vhostMin] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.6 requestHitCount OID 캐시 HIT결과 개수
.6.1. [vhostMin] requestHitCount.TCP_HIT Integer TCP_HIT
.6.2. [vhostMin] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.6.3. [vhostMin] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.6.4. [vhostMin] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.6.5. [vhostMin] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.6.6. [vhostMin] requestHitCount.TCP_MISS Integer TCP_MISS
.6.7. [vhostMin] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.6.8. [vhostMin] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.6.9. [vhostMin] requestHitCount.TCP_DENIED Integer TCP_DENIED
.6.10. [vhostMin] requestHitCount.TCP_ERROR Integer TCP_ERROR
.6.11. [vhostMin] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10 http OID HTTP 트래픽 (확장)
.11 hls OID HLS 트래픽 (확장)
.12 mpegdash OID MPEG-DASH 트래픽 (확장)
.20 rtmp OID RTMP 트래픽 (확장)

cache.host.traffic.client.http

OID = 1.3.6.1.4.1.40001.2.4.1.11.11.10

HTTP 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] res2xxAverage Integer 클라이언트로 보낸 평균 2xx응답 개수
.21. [vhostMin] res2xxCompleteAverage Integer 클라이언트가 완료한 평균 2xx트랜잭션 개수
.22. [vhostMin] res2xxTimeRes Integer 클라이언트 2xx응답 평균 소요시간(0.01ms)
.23. [vhostMin] res2xxTimeComplete Integer 클라이언트 2xx응답 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] res2xxCount Integer 클라이언트로 보낸 2xx응답 개수
.25. [vhostMin] res2xxCompleteCount Integer 클라이언트가 완료한 2xx트랜잭션 개수
.30. [vhostMin] res3xxAverage Integer 클라이언트로 보낸 평균 3xx응답 개수
.31. [vhostMin] res3xxCompleteAverage Integer 클라이언트가 완료한 평균 3xx트랜잭션 개수
.32. [vhostMin] res3xxTimeRes Integer 클라이언트 3xx응답 평균 소요시간(0.01ms)
.33. [vhostMin] res3xxTimeComplete Integer 클라이언트 3xx응답 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] res3xxCount Integer 클라이언트로 보낸 3xx응답 개수
.35. [vhostMin] res3xxCompleteCount Integer 클라이언트가 완료한 3xx트랜잭션 개수
.40. [vhostMin] res4xxAverage Integer 클라이언트로 보낸 평균 4xx응답 개수
.41. [vhostMin] res4xxCompleteAverage Integer 클라이언트가 완료한 평균 4xx트랜잭션 개수
.42. [vhostMin] res4xxTimeRes Integer 클라이언트 4xx응답 평균 소요시간(0.01ms)
.43. [vhostMin] res4xxTimeComplete Integer 클라이언트 4xx응답 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] res4xxCount Integer 클라이언트로 보낸 4xx응답 개수
.45. [vhostMin] res4xxCompleteCount Integer 클라이언트가 완료한 4xx트랜잭션 개수
.50. [vhostMin] res5xxAverage Integer 클라이언트로 보낸 평균 5xx응답 개수
.51. [vhostMin] res5xxCompleteAverage Integer 클라이언트가 완료한 평균 5xx트랜잭션 개수
.52. [vhostMin] res5xxTimeRes Integer 클라이언트 5xx응답 평균 소요시간(0.01ms)
.53. [vhostMin] res5xxTimeComplete Integer 클라이언트 5xx응답 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] res5xxCount Integer 클라이언트로 보낸 5xx응답 개수
.55. [vhostMin] res5xxCompleteCount Integer 클라이언트가 완료한 5xx트랜잭션 개수
.80. [vhostMin] resTotalAverage Integer 클라이언트로 보낸 평균 전체응답 개수
.81. [vhostMin] resTotalCompleteAverage Integer 클라이언트가 완료한 평균 트랜잭션 개수
.82. [vhostMin] resTotalTimeRes Integer 클라이언트 응답 평균 소요시간(0.01ms)
.83. [vhostMin] resTotalTimeComplete Integer 클라이언트 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] resTotalCount Integer 클라이언트로 보낸 전체응답 개수
.85. [vhostMin] resTotalCompleteCount Integer 클라이언트가 완료한 트랜잭션 개수

cache.host.traffic.client.hls

OID = 1.3.6.1.4.1.40001.2.4.1.11.11.11

HLS 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] res2xxAverage Integer 클라이언트로 보낸 평균 2xx응답 개수
.21. [vhostMin] res2xxCompleteAverage Integer 클라이언트가 완료한 평균 2xx트랜잭션 개수
.22. [vhostMin] res2xxTimeRes Integer 클라이언트 2xx응답 평균 소요시간(0.01ms)
.23. [vhostMin] res2xxTimeComplete Integer 클라이언트 2xx응답 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] res2xxCount Integer 클라이언트로 보낸 2xx응답 개수
.25. [vhostMin] res2xxCompleteCount Integer 클라이언트가 완료한 2xx트랜잭션 개수
.30. [vhostMin] res3xxAverage Integer 클라이언트로 보낸 평균 3xx응답 개수
.31. [vhostMin] res3xxCompleteAverage Integer 클라이언트가 완료한 평균 3xx트랜잭션 개수
.32. [vhostMin] res3xxTimeRes Integer 클라이언트 3xx응답 평균 소요시간(0.01ms)
.33. [vhostMin] res3xxTimeComplete Integer 클라이언트 3xx응답 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] res3xxCount Integer 클라이언트로 보낸 3xx응답 개수
.35. [vhostMin] res3xxCompleteCount Integer 클라이언트가 완료한 3xx트랜잭션 개수
.40. [vhostMin] res4xxAverage Integer 클라이언트로 보낸 평균 4xx응답 개수
.41. [vhostMin] res4xxCompleteAverage Integer 클라이언트가 완료한 평균 4xx트랜잭션 개수
.42. [vhostMin] res4xxTimeRes Integer 클라이언트 4xx응답 평균 소요시간(0.01ms)
.43. [vhostMin] res4xxTimeComplete Integer 클라이언트 4xx응답 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] res4xxCount Integer 클라이언트로 보낸 4xx응답 개수
.45. [vhostMin] res4xxCompleteCount Integer 클라이언트가 완료한 4xx트랜잭션 개수
.50. [vhostMin] res5xxAverage Integer 클라이언트로 보낸 평균 5xx응답 개수
.51. [vhostMin] res5xxCompleteAverage Integer 클라이언트가 완료한 평균 5xx트랜잭션 개수
.52. [vhostMin] res5xxTimeRes Integer 클라이언트 5xx응답 평균 소요시간(0.01ms)
.53. [vhostMin] res5xxTimeComplete Integer 클라이언트 5xx응답 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] res5xxCount Integer 클라이언트로 보낸 5xx응답 개수
.55. [vhostMin] res5xxCompleteCount Integer 클라이언트가 완료한 5xx트랜잭션 개수
.80. [vhostMin] resTotalAverage Integer 클라이언트로 보낸 평균 전체응답 개수
.81. [vhostMin] resTotalCompleteAverage Integer 클라이언트가 완료한 평균 트랜잭션 개수
.82. [vhostMin] resTotalTimeRes Integer 클라이언트 응답 평균 소요시간(0.01ms)
.83. [vhostMin] resTotalTimeComplete Integer 클라이언트 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] resTotalCount Integer 클라이언트로 보낸 전체응답 개수
.85. [vhostMin] resTotalCompleteCount Integer 클라이언트가 완료한 트랜잭션 개수

cache.host.traffic.client.mpegdash

OID = 1.3.6.1.4.1.40001.2.4.1.11.11.12

MPEG-DASH 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] res2xxAverage Integer 클라이언트로 보낸 평균 2xx응답 개수
.21. [vhostMin] res2xxCompleteAverage Integer 클라이언트가 완료한 평균 2xx트랜잭션 개수
.22. [vhostMin] res2xxTimeRes Integer 클라이언트 2xx응답 평균 소요시간(0.01ms)
.23. [vhostMin] res2xxTimeComplete Integer 클라이언트 2xx응답 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] res2xxCount Integer 클라이언트로 보낸 2xx응답 개수
.25. [vhostMin] res2xxCompleteCount Integer 클라이언트가 완료한 2xx트랜잭션 개수
.30. [vhostMin] res3xxAverage Integer 클라이언트로 보낸 평균 3xx응답 개수
.31. [vhostMin] res3xxCompleteAverage Integer 클라이언트가 완료한 평균 3xx트랜잭션 개수
.32. [vhostMin] res3xxTimeRes Integer 클라이언트 3xx응답 평균 소요시간(0.01ms)
.33. [vhostMin] res3xxTimeComplete Integer 클라이언트 3xx응답 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] res3xxCount Integer 클라이언트로 보낸 3xx응답 개수
.35. [vhostMin] res3xxCompleteCount Integer 클라이언트가 완료한 3xx트랜잭션 개수
.40. [vhostMin] res4xxAverage Integer 클라이언트로 보낸 평균 4xx응답 개수
.41. [vhostMin] res4xxCompleteAverage Integer 클라이언트가 완료한 평균 4xx트랜잭션 개수
.42. [vhostMin] res4xxTimeRes Integer 클라이언트 4xx응답 평균 소요시간(0.01ms)
.43. [vhostMin] res4xxTimeComplete Integer 클라이언트 4xx응답 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] res4xxCount Integer 클라이언트로 보낸 4xx응답 개수
.45. [vhostMin] res4xxCompleteCount Integer 클라이언트가 완료한 4xx트랜잭션 개수
.50. [vhostMin] res5xxAverage Integer 클라이언트로 보낸 평균 5xx응답 개수
.51. [vhostMin] res5xxCompleteAverage Integer 클라이언트가 완료한 평균 5xx트랜잭션 개수
.52. [vhostMin] res5xxTimeRes Integer 클라이언트 5xx응답 평균 소요시간(0.01ms)
.53. [vhostMin] res5xxTimeComplete Integer 클라이언트 5xx응답 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] res5xxCount Integer 클라이언트로 보낸 5xx응답 개수
.55. [vhostMin] res5xxCompleteCount Integer 클라이언트가 완료한 5xx트랜잭션 개수
.80. [vhostMin] resTotalAverage Integer 클라이언트로 보낸 평균 전체응답 개수
.81. [vhostMin] resTotalCompleteAverage Integer 클라이언트가 완료한 평균 트랜잭션 개수
.82. [vhostMin] resTotalTimeRes Integer 클라이언트 응답 평균 소요시간(0.01ms)
.83. [vhostMin] resTotalTimeComplete Integer 클라이언트 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] resTotalCount Integer 클라이언트로 보낸 전체응답 개수
.85. [vhostMin] resTotalCompleteCount Integer 클라이언트가 완료한 트랜잭션 개수

cache.host.traffic.client.rtmp

OID = 1.3.6.1.4.1.40001.2.4.1.11.11.12

RTMP 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] NetConnection.Connect Integer NetConnection.Connect 응답통계
.20.1. [vhostMin] NetConnection.Connect.SuccessAverage Integer 성공응답 평균개수 (평균)
.20.2. [vhostMin] NetConnection.Connect.SuccessCount Integer 성공응답 평균개수
.20.3. [vhostMin] NetConnection.Connect.FailAverage Integer 실패응답 평균개수 (평균)
.20.4. [vhostMin] NetConnection.Connect.FailCount Integer 실패응답 평균개수
.20.5. [vhostMin] NetConnection.Connect.TimeRes Integer 응답 평균 소요시간(0.01ms)
.21. [vhostMin] NetConnection.CreateStream Integer NetConnection.CreateStream 응답통계
.21.1. [vhostMin] NetConnection.CreateStream.SuccessAverage Integer 성공응답 평균개수 (평균)
.21.2. [vhostMin] NetConnection.CreateStream.SuccessCount Integer 성공응답 평균개수
.21.3. [vhostMin] NetConnection.CreateStream.FailAverage Integer 실패응답 평균개수 (평균)
.21.4. [vhostMin] NetConnection.CreateStream.FailCount Integer 실패응답 평균개수
.21.5. [vhostMin] NetConnection.CreateStream.TimeRes Integer 응답 평균 소요시간(0.01ms)
.30. [vhostMin] NetStream.Play Integer NetStream.Play 응답통계
.30.1. [vhostMin] NetStream.Play.SuccessAverage Integer 성공응답 평균개수 (평균)
.30.2. [vhostMin] NetStream.Play.SuccessCount Integer 성공응답 평균개수
.30.3. [vhostMin] NetStream.Play.FailAverage Integer 실패응답 평균개수 (평균)
.30.4. [vhostMin] NetStream.Play.FailCount Integer 실패응답 평균개수
.30.5. [vhostMin] NetStream.Play.TimeRes Integer 응답 평균 소요시간(0.01ms)
.31. [vhostMin] NetStream.Close Integer NetStream.Close 응답통계
.31.1. [vhostMin] NetStream.Close.SuccessAverage Integer 성공응답 평균개수 (평균)
.31.2. [vhostMin] NetStream.Close.SuccessCount Integer 성공응답 평균개수
.31.3. [vhostMin] NetStream.Close.FailAverage Integer 실패응답 평균개수 (평균)
.31.4. [vhostMin] NetStream.Close.FailCount Integer 실패응답 평균개수
.31.5. [vhostMin] NetStream.Close.TimeRes Integer 응답 평균 소요시간(0.01ms)
.32. [vhostMin] NetStream.Delete Integer NetStream.Delete 응답통계
.32.1. [vhostMin] NetStream.Delete.SuccessAverage Integer 성공응답 평균개수 (평균)
.32.2. [vhostMin] NetStream.Delete.SuccessCount Integer 성공응답 평균개수
.32.3. [vhostMin] NetStream.Delete.FailAverage Integer 실패응답 평균개수 (평균)
.32.4. [vhostMin] NetStream.Delete.FailCount Integer 실패응답 평균개수
.32.5. [vhostMin] NetStream.Delete.TimeRes Integer 응답 평균 소요시간(0.01ms)
.33. [vhostMin] NetStream.Seek Integer NetStream.Seek 응답통계
.33.1. [vhostMin] NetStream.Seek.SuccessAverage Integer 성공응답 평균개수 (평균)
.33.2. [vhostMin] NetStream.Seek.SuccessCount Integer 성공응답 평균개수
.33.3. [vhostMin] NetStream.Seek.FailAverage Integer 실패응답 평균개수 (평균)
.33.4. [vhostMin] NetStream.Seek.FailCount Integer 실패응답 평균개수
.33.5. [vhostMin] NetStream.Seek.TimeRes Integer 응답 평균 소요시간(0.01ms)
.34. [vhostMin] NetStream.Pause Integer NetStream.Pause 응답통계
.34.1. [vhostMin] NetStream.Pause.SuccessAverage Integer 성공응답 평균개수 (평균)
.34.2. [vhostMin] NetStream.Pause.SuccessCount Integer 성공응답 평균개수
.34.3. [vhostMin] NetStream.Pause.FailAverage Integer 실패응답 평균개수 (평균)
.34.4. [vhostMin] NetStream.Pause.FailCount Integer 실패응답 평균개수
.34.5. [vhostMin] NetStream.Pause.TimeRes Integer 응답 평균 소요시간(0.01ms)

cache.vhost

OID = 1.3.6.1.4.1.40001.2.4.3.1

가상호스트의 정보를 제공한다. [vhostIndex] 는 1부터 가상호스트 개수의 범위를 가진다.

OID Name Type Description
.2. [vhostIndex] name String 가상호스트 이름
.3. [vhostIndex] status String "Healthy" 또는 "Inactive" 또는 "Emergency"
.4. [vhostIndex] uptime Integer 가상호스트 실행시간 (초)
.10 contents OID 컨텐츠 정보 (확장)
.11 traffic OID 통계 (확장)

cache.vhost.contents

OID = 1.3.6.1.4.1.40001.2.4.3.1.10

가상호스트가 서비스하는 컨텐츠 통계를 제공한다.

OID Name Type Description
.1. [vhostIndex] memory Integer 메모리 캐싱 크기(KB)
.2. [vhostIndex] filesTotalCount Integer 서비스 중인 파일개수
.3. [vhostIndex] filesTotalSize Integer 서비스 중인 전체 파일량(MB)
.10. [vhostIndex] filesCountU1KB Integer 1KB미만 파일개수
.11. [vhostIndex] filesCountU2KB Integer 2KB미만 파일개수
.12. [vhostIndex] filesCountU4KB Integer 4KB미만 파일개수
.13. [vhostIndex] filesCountU8KB Integer 8KB미만 파일개수
.14. [vhostIndex] filesCountU16KB Integer 16KB미만 파일개수
.15. [vhostIndex] filesCountU32KB Integer 32KB미만 파일개수
.16. [vhostIndex] filesCountU64KB Integer 64KB미만 파일개수
.17. [vhostIndex] filesCountU128KB Integer 128KB미만 파일개수
.18. [vhostIndex] filesCountU256KB Integer 256KB미만 파일개수
.19. [vhostIndex] filesCountU512KB Integer 512KB미만 파일개수
.20. [vhostIndex] filesCountU1MB Integer 1MB미만 파일개수
.21. [vhostIndex] filesCountU2MB Integer 2MB미만 파일개수
.22. [vhostIndex] filesCountU4MB Integer 4MB미만 파일개수
.23. [vhostIndex] filesCountU8MB Integer 8MB미만 파일개수
.24. [vhostIndex] filesCountU16MB Integer 16MB미만 파일개수
.25. [vhostIndex] filesCountU32MB Integer 32MB미만 파일개수
.26. [vhostIndex] filesCountU64MB Integer 64MB미만 파일개수
.27. [vhostIndex] filesCountU128MB Integer 128MB미만 파일개수
.28. [vhostIndex] filesCountU256MB Integer 256MB미만 파일개수
.29. [vhostIndex] filesCountU512MB Integer 512MB미만 파일개수
.30. [vhostIndex] filesCountU1GB Integer 1GB미만 파일개수
.31. [vhostIndex] filesCountU2GB Integer 2GB미만 파일개수
.32. [vhostIndex] filesCountU4GB Integer 4GB미만 파일개수
.33. [vhostIndex] filesCountU8GB Integer 8GB미만 파일개수
.34. [vhostIndex] filesCountU16GB Integer 16GB미만 파일개수
.35. [vhostIndex] filesCountO16GB Integer 16GB이상 파일개수

cache.vhost.traffic

OID = 1.3.6.1.4.1.40001.2.4.3.1.11

가상호스트의 캐시 서비스와 트래픽 통계를 제공한다. traffic의 모든 통계는 최대 60분까지의 평균으로 제공된다. min은 '분'을 의미하며 최대 60까지의 값을 가진다. min이 생략되거나 0이라면 실시간정보를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] requestHitRatio Integer Request Hit Ratio(100%)
.2. [vhostMin] . [vhostIndex]     Request Hit Ratio(10000%)
.3. [vhostMin] . [vhostIndex] bytesHitRatio Integer Bytes Hit Ratio(100%)
.4. [vhostMin] . [vhostIndex]     Bytes Hit Ratio(10000%)
.10 origin OID 원본 트래픽 정보 (확장)
.11 client OID 클라이언트 트래픽 정보 (확장)

cache.vhost.traffic.origin

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.10

종합적인 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 원본서버로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 원본서버로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 전체 원본서버 평균 세션수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 전체 원본서버 세션수 중 전송 중인 평균 세션수
.10 http OID HTTP 트래픽 (cache.vhost.traffic.origin.http)
.11 hls OID HLS 트래픽 (cache.vhost.traffic.origin.hls)
.12 mpegdash OID MPEG-DASH 트래픽 (cache.vhost.traffic.origin.mpegdash)
.20 rtmp OID RTMP 트래픽 (cache.vhost.traffic.origin.rtmp)

cache.vhost.traffic.origin.http

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.10.10

HTTP 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 원본서버로부터 받는 평균 HTTP 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 원본서버로 보내는 평균 HTTP 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 원본서버 평균 HTTP세션 수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 원본서버 평균 HTTP세션 중 전송 중인 평균 세션수
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 원본서버로 보내는 평균 HTTP Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 원본서버로 보내는 평균 HTTP Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 원본서버로부터 받는 평균 HTTP Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 원본서버로부터 받는 평균 HTTP Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 원본서버로 보낸 평균 HTTP요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 원본서버로 보낸 HTTP요청 개수
.20. [vhostMin] . [vhostIndex] res2xxAverage Integer 원본서버가 보낸 평균 2xx응답 개수
.21. [vhostMin] . [vhostIndex] res2xxCompleteAverage Integer 원본서버로부터 성공한 평균 2xx 트랜잭션 개수
.22. [vhostMin] . [vhostIndex] res2xxTimeRes Integer 원본서버로부터 2xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.23. [vhostMin] . [vhostIndex] res2xxTimeComplete Integer 원본서버로부터 2xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] . [vhostIndex] res2xxCount Integer 원본서버가 보낸 2xx응답 개수
.25. [vhostMin] . [vhostIndex] res2xxCompleteCount Integer 원본서버로부터 성공한 2xx 트랜잭션 개수
.30. [vhostMin] . [vhostIndex] res3xxAverage Integer 원본서버가 보낸 평균 3xx응답 개수
.31. [vhostMin] . [vhostIndex] res3xxCompleteAverage Integer 원본서버로부터 성공한 평균 3xx 트랜잭션 개수
.32. [vhostMin] . [vhostIndex] res3xxTimeRes Integer 원본서버로부터 3xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] res3xxTimeComplete Integer 원본서버로부터 3xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] . [vhostIndex] res3xxCount Integer 원본서버가 보낸 3xx응답 개수
.35. [vhostMin] . [vhostIndex] res3xxCompleteCount Integer 원본서버로부터 성공한 3xx 트랜잭션 개수
.40. [vhostMin] . [vhostIndex] res4xxAverage Integer 원본서버가 보낸 평균 4xx응답 개수
.41. [vhostMin] . [vhostIndex] res4xxCompleteAverage Integer 원본서버로부터 성공한 평균 4xx 트랜잭션 개수
.42. [vhostMin] . [vhostIndex] res4xxTimeRes Integer 원본서버로부터 4xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.43. [vhostMin] . [vhostIndex] res4xxTimeComplete Integer 원본서버로부터 4xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] . [vhostIndex] res4xxCount Integer 원본서버가 보낸 4xx응답 개수
.45. [vhostMin] . [vhostIndex] res4xxCompleteCount Integer 원본서버로부터 성공한 4xx 트랜잭션 개수
.50. [vhostMin] . [vhostIndex] res5xxAverage Integer 원본서버가 보낸 평균 5xx응답 개수
.51. [vhostMin] . [vhostIndex] res5xxCompleteAverage Integer 원본서버로부터 성공한 평균 5xx 트랜잭션 개수
.52. [vhostMin] . [vhostIndex] res5xxTimeRes Integer 원본서버로부터 5xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.53. [vhostMin] . [vhostIndex] res5xxTimeComplete Integer 원본서버로부터 5xx응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] . [vhostIndex] res5xxCount Integer 원본서버가 보낸 5xx응답 개수
.55. [vhostMin] . [vhostIndex] res5xxCompleteCount Integer 원본서버로부터 성공한 5xx 트랜잭션 개수
.80. [vhostMin] . [vhostIndex] resTotalAverage Integer 원본서버가 보낸 전체 평균 HTTP응답 개수
.81. [vhostMin] . [vhostIndex] resTotalCompleteAverage Integer 원본서버로부터 성공한 평균 HTTP트랜잭션 개수
.82. [vhostMin] . [vhostIndex] resTotalTimeRes Integer 원본서버로부터 응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.83. [vhostMin] . [vhostIndex] resTotalTimeComplete Integer 원본서버로부터 응답 HTTP 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] . [vhostIndex] resTotalCount Integer 원본서버가 보낸 전체 HTTP응답 개수
.85. [vhostMin] . [vhostIndex] resTotalCompleteCount Integer 원본서버로부터 성공한 HTTP트랜잭션 개수
.90. [vhostMin] . [vhostIndex] connectTimeoutAverage Integer 평균 원본서버 접속실패 횟수
.91. [vhostMin] . [vhostIndex] receiveTimeoutAverage Integer 평균 원본서버 전송실패 횟수
.92. [vhostMin] . [vhostIndex] connectAverage Integer 평균 원본서버 접속성공 횟수
.93. [vhostMin] . [vhostIndex] dnsQueryTime Integer 원본서버 접속 시 평균 DNS쿼리 소요시간
.94. [vhostMin] . [vhostIndex] connectTime Integer 원본서버 평균 접속 소요시간(0.01ms)
.95. [vhostMin] . [vhostIndex] connectTimeoutCount Integer 원본서버 접속실패 횟수
.96. [vhostMin] . [vhostIndex] receiveTimeoutCount Integer 원본서버 전송실패 횟수
.97. [vhostMin] . [vhostIndex] connectCount Integer 원본서버 접속성공 횟수
.98. [vhostMin] . [vhostIndex] closeAverage Integer 전송 중 원본서버에서 먼저 소켓을 종료한 평균 횟수
.99. [vhostMin] . [vhostIndex] closeCount Integer 전송 중 원본서버에서 먼저 소켓을 종료한 횟수

cache.vhost.traffic.origin.hls

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.10.11

HLS 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 원본서버로부터 받는 평균 HLS 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 원본서버로 보내는 평균 HLS 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 원본서버 평균 HLS세션 수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 원본서버 평균 HLS세션 중 전송 중인 평균 세션수
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 원본서버로 보내는 평균 HLS Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 원본서버로 보내는 평균 HLS Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 원본서버로부터 받는 평균 HLS Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 원본서버로부터 받는 평균 HLS Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 원본서버로 보낸 평균 HLS요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 원본서버로 보낸 HLS요청 개수
.20. [vhostMin] . [vhostIndex] res2xxAverage Integer 원본서버가 보낸 평균 2xx응답 개수
.21. [vhostMin] . [vhostIndex] res2xxCompleteAverage Integer 원본서버로부터 성공한 평균 2xx 트랜잭션 개수
.22. [vhostMin] . [vhostIndex] res2xxTimeRes Integer 원본서버로부터 2xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.23. [vhostMin] . [vhostIndex] res2xxTimeComplete Integer 원본서버로부터 2xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] . [vhostIndex] res2xxCount Integer 원본서버가 보낸 2xx응답 개수
.25. [vhostMin] . [vhostIndex] res2xxCompleteCount Integer 원본서버로부터 성공한 2xx 트랜잭션 개수
.30. [vhostMin] . [vhostIndex] res3xxAverage Integer 원본서버가 보낸 평균 3xx응답 개수
.31. [vhostMin] . [vhostIndex] res3xxCompleteAverage Integer 원본서버로부터 성공한 평균 3xx 트랜잭션 개수
.32. [vhostMin] . [vhostIndex] res3xxTimeRes Integer 원본서버로부터 3xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] res3xxTimeComplete Integer 원본서버로부터 3xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] . [vhostIndex] res3xxCount Integer 원본서버가 보낸 3xx응답 개수
.35. [vhostMin] . [vhostIndex] res3xxCompleteCount Integer 원본서버로부터 성공한 3xx 트랜잭션 개수
.40. [vhostMin] . [vhostIndex] res4xxAverage Integer 원본서버가 보낸 평균 4xx응답 개수
.41. [vhostMin] . [vhostIndex] res4xxCompleteAverage Integer 원본서버로부터 성공한 평균 4xx 트랜잭션 개수
.42. [vhostMin] . [vhostIndex] res4xxTimeRes Integer 원본서버로부터 4xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.43. [vhostMin] . [vhostIndex] res4xxTimeComplete Integer 원본서버로부터 4xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] . [vhostIndex] res4xxCount Integer 원본서버가 보낸 4xx응답 개수
.45. [vhostMin] . [vhostIndex] res4xxCompleteCount Integer 원본서버로부터 성공한 4xx 트랜잭션 개수
.50. [vhostMin] . [vhostIndex] res5xxAverage Integer 원본서버가 보낸 평균 5xx응답 개수
.51. [vhostMin] . [vhostIndex] res5xxCompleteAverage Integer 원본서버로부터 성공한 평균 5xx 트랜잭션 개수
.52. [vhostMin] . [vhostIndex] res5xxTimeRes Integer 원본서버로부터 5xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.53. [vhostMin] . [vhostIndex] res5xxTimeComplete Integer 원본서버로부터 5xx응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] . [vhostIndex] res5xxCount Integer 원본서버가 보낸 5xx응답 개수
.55. [vhostMin] . [vhostIndex] res5xxCompleteCount Integer 원본서버로부터 성공한 5xx 트랜잭션 개수
.80. [vhostMin] . [vhostIndex] resTotalAverage Integer 원본서버가 보낸 전체 평균 HLS응답 개수
.81. [vhostMin] . [vhostIndex] resTotalCompleteAverage Integer 원본서버로부터 성공한 평균 HLS트랜잭션 개수
.82. [vhostMin] . [vhostIndex] resTotalTimeRes Integer 원본서버로부터 응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.83. [vhostMin] . [vhostIndex] resTotalTimeComplete Integer 원본서버로부터 응답 HLS 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] . [vhostIndex] resTotalCount Integer 원본서버가 보낸 전체 HLS응답 개수
.85. [vhostMin] . [vhostIndex] resTotalCompleteCount Integer 원본서버로부터 성공한 HLS트랜잭션 개수
.90. [vhostMin] . [vhostIndex] connectTimeoutAverage Integer 평균 원본서버 접속실패 횟수
.91. [vhostMin] . [vhostIndex] receiveTimeoutAverage Integer 평균 원본서버 전송실패 횟수
.92. [vhostMin] . [vhostIndex] connectAverage Integer 평균 원본서버 접속성공 횟수
.93. [vhostMin] . [vhostIndex] dnsQueryTime Integer 원본서버 접속 시 평균 DNS쿼리 소요시간
.94. [vhostMin] . [vhostIndex] connectTime Integer 원본서버 평균 접속 소요시간(0.01ms)
.95. [vhostMin] . [vhostIndex] connectTimeoutCount Integer 원본서버 접속실패 횟수
.96. [vhostMin] . [vhostIndex] receiveTimeoutCount Integer 원본서버 전송실패 횟수
.97. [vhostMin] . [vhostIndex] connectCount Integer 원본서버 접속성공 횟수
.98. [vhostMin] . [vhostIndex] closeAverage Integer 전송 중 원본서버에서 먼저 소켓을 종료한 평균 횟수
.99. [vhostMin] . [vhostIndex] closeCount Integer 전송 중 원본서버에서 먼저 소켓을 종료한 횟수

cache.vhost.traffic.origin.mpegdash

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.10.12

MPEG-DASH 원본서버 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 원본서버로부터 받는 평균 MPEG-DASH 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 원본서버로 보내는 평균 MPEG-DASH 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 원본서버 평균 MPEG-DASH세션 수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 원본서버 평균 MPEG-DASH세션 중 전송 중인 평균 세션수
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 원본서버로 보내는 평균 MPEG-DASH Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 원본서버로 보내는 평균 MPEG-DASH Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 원본서버로부터 받는 평균 MPEG-DASH Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 원본서버로부터 받는 평균 MPEG-DASH Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 원본서버로 보낸 평균 MPEG-DASH요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 원본서버로 보낸 MPEG-DASH요청 개수
.20. [vhostMin] . [vhostIndex] res2xxAverage Integer 원본서버가 보낸 평균 2xx응답 개수
.21. [vhostMin] . [vhostIndex] res2xxCompleteAverage Integer 원본서버로부터 성공한 평균 2xx 트랜잭션 개수
.22. [vhostMin] . [vhostIndex] res2xxTimeRes Integer 원본서버로부터 2xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.23. [vhostMin] . [vhostIndex] res2xxTimeComplete Integer 원본서버로부터 2xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] . [vhostIndex] res2xxCount Integer 원본서버가 보낸 2xx응답 개수
.25. [vhostMin] . [vhostIndex] res2xxCompleteCount Integer 원본서버로부터 성공한 2xx 트랜잭션 개수
.30. [vhostMin] . [vhostIndex] res3xxAverage Integer 원본서버가 보낸 평균 3xx응답 개수
.31. [vhostMin] . [vhostIndex] res3xxCompleteAverage Integer 원본서버로부터 성공한 평균 3xx 트랜잭션 개수
.32. [vhostMin] . [vhostIndex] res3xxTimeRes Integer 원본서버로부터 3xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] res3xxTimeComplete Integer 원본서버로부터 3xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] . [vhostIndex] res3xxCount Integer 원본서버가 보낸 3xx응답 개수
.35. [vhostMin] . [vhostIndex] res3xxCompleteCount Integer 원본서버로부터 성공한 3xx 트랜잭션 개수
.40. [vhostMin] . [vhostIndex] res4xxAverage Integer 원본서버가 보낸 평균 4xx응답 개수
.41. [vhostMin] . [vhostIndex] res4xxCompleteAverage Integer 원본서버로부터 성공한 평균 4xx 트랜잭션 개수
.42. [vhostMin] . [vhostIndex] res4xxTimeRes Integer 원본서버로부터 4xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.43. [vhostMin] . [vhostIndex] res4xxTimeComplete Integer 원본서버로부터 4xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] . [vhostIndex] res4xxCount Integer 원본서버가 보낸 4xx응답 개수
.45. [vhostMin] . [vhostIndex] res4xxCompleteCount Integer 원본서버로부터 성공한 4xx 트랜잭션 개수
.50. [vhostMin] . [vhostIndex] res5xxAverage Integer 원본서버가 보낸 평균 5xx응답 개수
.51. [vhostMin] . [vhostIndex] res5xxCompleteAverage Integer 원본서버로부터 성공한 평균 5xx 트랜잭션 개수
.52. [vhostMin] . [vhostIndex] res5xxTimeRes Integer 원본서버로부터 5xx응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.53. [vhostMin] . [vhostIndex] res5xxTimeComplete Integer 원본서버로부터 5xx응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] . [vhostIndex] res5xxCount Integer 원본서버가 보낸 5xx응답 개수
.55. [vhostMin] . [vhostIndex] res5xxCompleteCount Integer 원본서버로부터 성공한 5xx 트랜잭션 개수
.80. [vhostMin] . [vhostIndex] resTotalAverage Integer 원본서버가 보낸 전체 평균 MPEG-DASH응답 개수
.81. [vhostMin] . [vhostIndex] resTotalCompleteAverage Integer 원본서버로부터 성공한 평균 MPEG-DASH트랜잭션 개수
.82. [vhostMin] . [vhostIndex] resTotalTimeRes Integer 원본서버로부터 응답 헤더를 받을때까지 평균 소요시간(0.01ms)
.83. [vhostMin] . [vhostIndex] resTotalTimeComplete Integer 원본서버로부터 응답 MPEG-DASH 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] . [vhostIndex] resTotalCount Integer 원본서버가 보낸 전체 MPEG-DASH응답 개수
.85. [vhostMin] . [vhostIndex] resTotalCompleteCount Integer 원본서버로부터 성공한 MPEG-DASH트랜잭션 개수
.90. [vhostMin] . [vhostIndex] connectTimeoutAverage Integer 평균 원본서버 접속실패 횟수
.91. [vhostMin] . [vhostIndex] receiveTimeoutAverage Integer 평균 원본서버 전송실패 횟수
.92. [vhostMin] . [vhostIndex] connectAverage Integer 평균 원본서버 접속성공 횟수
.93. [vhostMin] . [vhostIndex] dnsQueryTime Integer 원본서버 접속 시 평균 DNS쿼리 소요시간
.94. [vhostMin] . [vhostIndex] connectTime Integer 원본서버 평균 접속 소요시간(0.01ms)
.95. [vhostMin] . [vhostIndex] connectTimeoutCount Integer 원본서버 접속실패 횟수
.96. [vhostMin] . [vhostIndex] receiveTimeoutCount Integer 원본서버 전송실패 횟수
.97. [vhostMin] . [vhostIndex] connectCount Integer 원본서버 접속성공 횟수
.98. [vhostMin] . [vhostIndex] closeAverage Integer 전송 중 원본서버에서 먼저 소켓을 종료한 평균 횟수
.99. [vhostMin] . [vhostIndex] closeCount Integer 전송 중 원본서버에서 먼저 소켓을 종료한 횟수

cache.vhost.traffic.origin.rtmp

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.10.20

(지원예정) RTMP 원본서버 트래픽 통계를 제공한다.

cache.vhost.traffic.client

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.11

종합적인 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 전체 클라이언트 평균 세션수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 전체 클라이언트 중 전송 중인 평균 세션수
.5 requestHitAverage OID 전체 평균 캐시 HIT결과
.5.1. [vhostMin] . [vhostIndex] requestHitAverage.TCP_HIT Integer TCP_HIT
.5.2. [vhostMin] . [vhostIndex] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.5.3. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.5.4. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.5.5. [vhostMin] . [vhostIndex] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.5.6. [vhostMin] . [vhostIndex] requestHitAverage.TCP_MISS Integer TCP_MISS
.5.7. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.5.8. [vhostMin] . [vhostIndex] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.5.9. [vhostMin] . [vhostIndex] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.5.10. [vhostMin] . [vhostIndex] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.5.11. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.6 requestHitCount OID 캐시 HIT결과 개수
.6.1. [vhostMin] . [vhostIndex] requestHitCount.TCP_HIT Integer TCP_HIT
.6.2. [vhostMin] . [vhostIndex] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.6.3. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.6.4. [vhostMin] . [vhostIndex] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.6.5. [vhostMin] . [vhostIndex] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.6.6. [vhostMin] . [vhostIndex] requestHitCount.TCP_MISS Integer TCP_MISS
.6.7. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.6.8. [vhostMin] . [vhostIndex] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.6.9. [vhostMin] . [vhostIndex] requestHitCount.TCP_DENIED Integer TCP_DENIED
.6.10. [vhostMin] . [vhostIndex] requestHitCount.TCP_ERROR Integer TCP_ERROR
.6.11. [vhostMin] . [vhostIndex] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10 http OID HTTP 트래픽 (cache.vhost.traffic.client.http)
.11 hls OID HLS 트래픽 (cache.vhost.traffic.client.hls)
.12 mpegdash OID MPEG-DASH 트래픽 (cache.vhost.traffic.client.mpegdash)
.20 rtmp OID RTMP 트래픽 (cache.vhost.traffic.client.rtmp)

cache.vhost.traffic.client.http

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.11.10

HTTP 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] . [vhostIndex] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin] . [vhostIndex]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] . [vhostIndex] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] . [vhostIndex] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] . [vhostIndex] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] . [vhostIndex] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] . [vhostIndex] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] . [vhostIndex] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] . [vhostIndex] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] . [vhostIndex] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] . [vhostIndex] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] . [vhostIndex] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] . [vhostIndex] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] . [vhostIndex] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] . [vhostIndex] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] . [vhostIndex] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] . [vhostIndex] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] . [vhostIndex] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] . [vhostIndex] res2xxAverage Integer 클라이언트로 보낸 평균 2xx응답 개수
.21. [vhostMin] . [vhostIndex] res2xxCompleteAverage Integer 클라이언트가 완료한 평균 2xx트랜잭션 개수
.22. [vhostMin] . [vhostIndex] res2xxTimeRes Integer 클라이언트 2xx응답 평균 소요시간(0.01ms)
.23. [vhostMin] . [vhostIndex] res2xxTimeComplete Integer 클라이언트 2xx응답 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] . [vhostIndex] res2xxCount Integer 클라이언트로 보낸 2xx응답 개수
.25. [vhostMin] . [vhostIndex] res2xxCompleteCount Integer 클라이언트가 완료한 2xx트랜잭션 개수
.30. [vhostMin] . [vhostIndex] res3xxAverage Integer 클라이언트로 보낸 평균 3xx응답 개수
.31. [vhostMin] . [vhostIndex] res3xxCompleteAverage Integer 클라이언트가 완료한 평균 3xx트랜잭션 개수
.32. [vhostMin] . [vhostIndex] res3xxTimeRes Integer 클라이언트 3xx응답 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] res3xxTimeComplete Integer 클라이언트 3xx응답 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] . [vhostIndex] res3xxCount Integer 클라이언트로 보낸 3xx응답 개수
.35. [vhostMin] . [vhostIndex] res3xxCompleteCount Integer 클라이언트가 완료한 3xx트랜잭션 개수
.40. [vhostMin] . [vhostIndex] res4xxAverage Integer 클라이언트로 보낸 평균 4xx응답 개수
.41. [vhostMin] . [vhostIndex] res4xxCompleteAverage Integer 클라이언트가 완료한 평균 4xx트랜잭션 개수
.42. [vhostMin] . [vhostIndex] res4xxTimeRes Integer 클라이언트 4xx응답 평균 소요시간(0.01ms)
.43. [vhostMin] . [vhostIndex] res4xxTimeComplete Integer 클라이언트 4xx응답 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] . [vhostIndex] res4xxCount Integer 클라이언트로 보낸 4xx응답 개수
.45. [vhostMin] . [vhostIndex] res4xxCompleteCount Integer 클라이언트가 완료한 4xx트랜잭션 개수
.50. [vhostMin] . [vhostIndex] res5xxAverage Integer 클라이언트로 보낸 평균 5xx응답 개수
.51. [vhostMin] . [vhostIndex] res5xxCompleteAverage Integer 클라이언트가 완료한 평균 5xx트랜잭션 개수
.52. [vhostMin] . [vhostIndex] res5xxTimeRes Integer 클라이언트 5xx응답 평균 소요시간(0.01ms)
.53. [vhostMin] . [vhostIndex] res5xxTimeComplete Integer 클라이언트 5xx응답 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] . [vhostIndex] res5xxCount Integer 클라이언트로 보낸 5xx응답 개수
.55. [vhostMin] . [vhostIndex] res5xxCompleteCount Integer 클라이언트가 완료한 5xx트랜잭션 개수
.80. [vhostMin] . [vhostIndex] resTotalAverage Integer 클라이언트로 보낸 평균 전체응답 개수
.81. [vhostMin] . [vhostIndex] resTotalCompleteAverage Integer 클라이언트가 완료한 평균 트랜잭션 개수
.82. [vhostMin] . [vhostIndex] resTotalTimeRes Integer 클라이언트 응답 평균 소요시간(0.01ms)
.83. [vhostMin] . [vhostIndex] resTotalTimeComplete Integer 클라이언트 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] . [vhostIndex] resTotalCount Integer 클라이언트로 보낸 전체응답 개수
.85. [vhostMin] . [vhostIndex] resTotalCompleteCount Integer 클라이언트가 완료한 트랜잭션 개수

cache.vhost.traffic.client.hls

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.11.11

HLS 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] . [vhostIndex] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin] . [vhostIndex]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] . [vhostIndex] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] . [vhostIndex] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] . [vhostIndex] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] . [vhostIndex] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] . [vhostIndex] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] . [vhostIndex] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] . [vhostIndex] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] . [vhostIndex] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] . [vhostIndex] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] . [vhostIndex] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] . [vhostIndex] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] . [vhostIndex] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] . [vhostIndex] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] . [vhostIndex] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] . [vhostIndex] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] . [vhostIndex] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] . [vhostIndex] res2xxAverage Integer 클라이언트로 보낸 평균 2xx응답 개수
.21. [vhostMin] . [vhostIndex] res2xxCompleteAverage Integer 클라이언트가 완료한 평균 2xx트랜잭션 개수
.22. [vhostMin] . [vhostIndex] res2xxTimeRes Integer 클라이언트 2xx응답 평균 소요시간(0.01ms)
.23. [vhostMin] . [vhostIndex] res2xxTimeComplete Integer 클라이언트 2xx응답 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] . [vhostIndex] res2xxCount Integer 클라이언트로 보낸 2xx응답 개수
.25. [vhostMin] . [vhostIndex] res2xxCompleteCount Integer 클라이언트가 완료한 2xx트랜잭션 개수
.30. [vhostMin] . [vhostIndex] res3xxAverage Integer 클라이언트로 보낸 평균 3xx응답 개수
.31. [vhostMin] . [vhostIndex] res3xxCompleteAverage Integer 클라이언트가 완료한 평균 3xx트랜잭션 개수
.32. [vhostMin] . [vhostIndex] res3xxTimeRes Integer 클라이언트 3xx응답 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] res3xxTimeComplete Integer 클라이언트 3xx응답 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] . [vhostIndex] res3xxCount Integer 클라이언트로 보낸 3xx응답 개수
.35. [vhostMin] . [vhostIndex] res3xxCompleteCount Integer 클라이언트가 완료한 3xx트랜잭션 개수
.40. [vhostMin] . [vhostIndex] res4xxAverage Integer 클라이언트로 보낸 평균 4xx응답 개수
.41. [vhostMin] . [vhostIndex] res4xxCompleteAverage Integer 클라이언트가 완료한 평균 4xx트랜잭션 개수
.42. [vhostMin] . [vhostIndex] res4xxTimeRes Integer 클라이언트 4xx응답 평균 소요시간(0.01ms)
.43. [vhostMin] . [vhostIndex] res4xxTimeComplete Integer 클라이언트 4xx응답 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] . [vhostIndex] res4xxCount Integer 클라이언트로 보낸 4xx응답 개수
.45. [vhostMin] . [vhostIndex] res4xxCompleteCount Integer 클라이언트가 완료한 4xx트랜잭션 개수
.50. [vhostMin] . [vhostIndex] res5xxAverage Integer 클라이언트로 보낸 평균 5xx응답 개수
.51. [vhostMin] . [vhostIndex] res5xxCompleteAverage Integer 클라이언트가 완료한 평균 5xx트랜잭션 개수
.52. [vhostMin] . [vhostIndex] res5xxTimeRes Integer 클라이언트 5xx응답 평균 소요시간(0.01ms)
.53. [vhostMin] . [vhostIndex] res5xxTimeComplete Integer 클라이언트 5xx응답 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] . [vhostIndex] res5xxCount Integer 클라이언트로 보낸 5xx응답 개수
.55. [vhostMin] . [vhostIndex] res5xxCompleteCount Integer 클라이언트가 완료한 5xx트랜잭션 개수
.80. [vhostMin] . [vhostIndex] resTotalAverage Integer 클라이언트로 보낸 평균 전체응답 개수
.81. [vhostMin] . [vhostIndex] resTotalCompleteAverage Integer 클라이언트가 완료한 평균 트랜잭션 개수
.82. [vhostMin] . [vhostIndex] resTotalTimeRes Integer 클라이언트 응답 평균 소요시간(0.01ms)
.83. [vhostMin] . [vhostIndex] resTotalTimeComplete Integer 클라이언트 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] . [vhostIndex] resTotalCount Integer 클라이언트로 보낸 전체응답 개수
.85. [vhostMin] . [vhostIndex] resTotalCompleteCount Integer 클라이언트가 완료한 트랜잭션 개수

cache.vhost.traffic.client.mpegdash

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.11.12

MPEG-DASH 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] . [vhostIndex] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin] . [vhostIndex]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] . [vhostIndex] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] . [vhostIndex] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] . [vhostIndex] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] . [vhostIndex] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] . [vhostIndex] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] . [vhostIndex] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] . [vhostIndex] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] . [vhostIndex] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] . [vhostIndex] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] . [vhostIndex] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] . [vhostIndex] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] . [vhostIndex] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] . [vhostIndex] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] . [vhostIndex] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] . [vhostIndex] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] . [vhostIndex] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] . [vhostIndex] res2xxAverage Integer 클라이언트로 보낸 평균 2xx응답 개수
.21. [vhostMin] . [vhostIndex] res2xxCompleteAverage Integer 클라이언트가 완료한 평균 2xx트랜잭션 개수
.22. [vhostMin] . [vhostIndex] res2xxTimeRes Integer 클라이언트 2xx응답 평균 소요시간(0.01ms)
.23. [vhostMin] . [vhostIndex] res2xxTimeComplete Integer 클라이언트 2xx응답 트랜잭션 평균 완료시간(0.01ms)
.24. [vhostMin] . [vhostIndex] res2xxCount Integer 클라이언트로 보낸 2xx응답 개수
.25. [vhostMin] . [vhostIndex] res2xxCompleteCount Integer 클라이언트가 완료한 2xx트랜잭션 개수
.30. [vhostMin] . [vhostIndex] res3xxAverage Integer 클라이언트로 보낸 평균 3xx응답 개수
.31. [vhostMin] . [vhostIndex] res3xxCompleteAverage Integer 클라이언트가 완료한 평균 3xx트랜잭션 개수
.32. [vhostMin] . [vhostIndex] res3xxTimeRes Integer 클라이언트 3xx응답 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] res3xxTimeComplete Integer 클라이언트 3xx응답 트랜잭션 평균 완료시간(0.01ms)
.34. [vhostMin] . [vhostIndex] res3xxCount Integer 클라이언트로 보낸 3xx응답 개수
.35. [vhostMin] . [vhostIndex] res3xxCompleteCount Integer 클라이언트가 완료한 3xx트랜잭션 개수
.40. [vhostMin] . [vhostIndex] res4xxAverage Integer 클라이언트로 보낸 평균 4xx응답 개수
.41. [vhostMin] . [vhostIndex] res4xxCompleteAverage Integer 클라이언트가 완료한 평균 4xx트랜잭션 개수
.42. [vhostMin] . [vhostIndex] res4xxTimeRes Integer 클라이언트 4xx응답 평균 소요시간(0.01ms)
.43. [vhostMin] . [vhostIndex] res4xxTimeComplete Integer 클라이언트 4xx응답 트랜잭션 평균 완료시간(0.01ms)
.44. [vhostMin] . [vhostIndex] res4xxCount Integer 클라이언트로 보낸 4xx응답 개수
.45. [vhostMin] . [vhostIndex] res4xxCompleteCount Integer 클라이언트가 완료한 4xx트랜잭션 개수
.50. [vhostMin] . [vhostIndex] res5xxAverage Integer 클라이언트로 보낸 평균 5xx응답 개수
.51. [vhostMin] . [vhostIndex] res5xxCompleteAverage Integer 클라이언트가 완료한 평균 5xx트랜잭션 개수
.52. [vhostMin] . [vhostIndex] res5xxTimeRes Integer 클라이언트 5xx응답 평균 소요시간(0.01ms)
.53. [vhostMin] . [vhostIndex] res5xxTimeComplete Integer 클라이언트 5xx응답 트랜잭션 평균 완료시간(0.01ms)
.54. [vhostMin] . [vhostIndex] res5xxCount Integer 클라이언트로 보낸 5xx응답 개수
.55. [vhostMin] . [vhostIndex] res5xxCompleteCount Integer 클라이언트가 완료한 5xx트랜잭션 개수
.80. [vhostMin] . [vhostIndex] resTotalAverage Integer 클라이언트로 보낸 평균 전체응답 개수
.81. [vhostMin] . [vhostIndex] resTotalCompleteAverage Integer 클라이언트가 완료한 평균 트랜잭션 개수
.82. [vhostMin] . [vhostIndex] resTotalTimeRes Integer 클라이언트 응답 평균 소요시간(0.01ms)
.83. [vhostMin] . [vhostIndex] resTotalTimeComplete Integer 클라이언트 트랜잭션 평균 완료시간(0.01ms)
.84. [vhostMin] . [vhostIndex] resTotalCount Integer 클라이언트로 보낸 전체응답 개수
.85. [vhostMin] . [vhostIndex] resTotalCompleteCount Integer 클라이언트가 완료한 트랜잭션 개수

cache.vhost.traffic.client.rtmp

OID = 1.3.6.1.4.1.40001.2.4.3.1.11.11.20

RTMP 클라이언트 트래픽 통계를 제공한다.

OID Name Type Description
.1. [vhostMin] . [vhostIndex] inbound Integer 클라이언트로부터 받는 평균 트래픽(Bytes)
.2. [vhostMin] . [vhostIndex] outbound Integer 클라이언트로 보내는 평균 트래픽(Bytes)
.3. [vhostMin] . [vhostIndex] allSessionAverage Integer 클라이언트 평균 세션수
.4. [vhostMin] . [vhostIndex] activeSessionAverage Integer 클라이언트 중 전송 중인 평균 세션수
.5. [vhostMin] . [vhostIndex] requestHitRatio Integer Request Hit Ratio(100%)
.6. [vhostMin] . [vhostIndex]     Request Hit Ratio(10000%)
.7 requestHitAverage OID 평균 캐시 HIT결과
.7.1. [vhostMin] . [vhostIndex] requestHitAverage.TCP_HIT Integer TCP_HIT
.7.2. [vhostMin] . [vhostIndex] requestHitAverage.TCP_IMS_HIT Integer TCP_IMS_HIT
.7.3. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.7.4. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.7.5. [vhostMin] . [vhostIndex] requestHitAverage.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.7.6. [vhostMin] . [vhostIndex] requestHitAverage.TCP_MISS Integer TCP_MISS
.7.7. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.7.8. [vhostMin] . [vhostIndex] requestHitAverage.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.7.9. [vhostMin] . [vhostIndex] requestHitAverage.TCP_DENIED Integer TCP_DENIED
.7.10. [vhostMin] . [vhostIndex] requestHitAverage.TCP_ERROR Integer TCP_ERROR
.7.11. [vhostMin] . [vhostIndex] requestHitAverage.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.8 requestHitCount OID 캐시 HIT결과 개수
.8.1. [vhostMin] . [vhostIndex] requestHitCount.TCP_HIT Integer TCP_HIT
.8.2. [vhostMin] . [vhostIndex] requestHitCount.TCP_IMS_HIT Integer TCP_IMS_HIT
.8.3. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_HIT Integer TCP_REFRESH_HIT
.8.4. [vhostMin] . [vhostIndex] requestHitCount.TCP_REF_FAIL_HIT Integer TCP_REF_FAIL_HIT
.8.5. [vhostMin] . [vhostIndex] requestHitCount.TCP_NEGATIVE_HIT Integer TCP_NEGATIVE_HIT
.8.6. [vhostMin] . [vhostIndex] requestHitCount.TCP_MISS Integer TCP_MISS
.8.7. [vhostMin] . [vhostIndex] requestHitCount.TCP_REFRESH_MISS Integer TCP_REFRESH_MISS
.8.8. [vhostMin] . [vhostIndex] requestHitCount.TCP_CLIENT_REFRESH_MISS Integer TCP_CLIENT_REFRESH_MISS
.8.9. [vhostMin] . [vhostIndex] requestHitCount.TCP_DENIED Integer TCP_DENIED
.8.10. [vhostMin] . [vhostIndex] requestHitCount.TCP_ERROR Integer TCP_ERROR
.8.11. [vhostMin] . [vhostIndex] requestHitCount.TCP_REDIRECT_HIT Integer TCP_REDIRECT_HIT
.10. [vhostMin] . [vhostIndex] reqHeaderSize Integer 클라이언트로부터 받는 평균 Header 트래픽(Bytes)
.11. [vhostMin] . [vhostIndex] reqBodySize Integer 클라이언트로부터 받는 평균 Body 트래픽(Bytes)
.12. [vhostMin] . [vhostIndex] resHeaderSize Integer 클라이언트로 보내는 평균 Header트래픽(Bytes)
.13. [vhostMin] . [vhostIndex] resBodySize Integer 클라이언트로 보내는 평균 Body트래픽(Bytes)
.14. [vhostMin] . [vhostIndex] reqAverage Integer 클라이언트로부터 받은 평균요청 개수
.15. [vhostMin] . [vhostIndex] reqCount Integer 클라이언트로부터 받은 누적요청 개수
.20. [vhostMin] . [vhostIndex] NetConnection.Connect Integer NetConnection.Connect 응답통계
.20.1. [vhostMin] . [vhostIndex] NetConnection.Connect.SuccessAverage Integer 성공응답 평균개수 (평균)
.20.2. [vhostMin] . [vhostIndex] NetConnection.Connect.SuccessCount Integer 성공응답 평균개수
.20.3. [vhostMin] . [vhostIndex] NetConnection.Connect.FailAverage Integer 실패응답 평균개수 (평균)
.20.4. [vhostMin] . [vhostIndex] NetConnection.Connect.FailCount Integer 실패응답 평균개수
.20.5. [vhostMin] . [vhostIndex] NetConnection.Connect.TimeRes Integer 응답 평균 소요시간(0.01ms)
.21. [vhostMin] . [vhostIndex] NetConnection.CreateStream Integer NetConnection.CreateStream 응답통계
.21.1. [vhostMin] . [vhostIndex] NetConnection.CreateStream.SuccessAverage Integer 성공응답 평균개수 (평균)
.21.2. [vhostMin] . [vhostIndex] NetConnection.CreateStream.SuccessCount Integer 성공응답 평균개수
.21.3. [vhostMin] . [vhostIndex] NetConnection.CreateStream.FailAverage Integer 실패응답 평균개수 (평균)
.21.4. [vhostMin] . [vhostIndex] NetConnection.CreateStream.FailCount Integer 실패응답 평균개수
.21.5. [vhostMin] . [vhostIndex] NetConnection.CreateStream.TimeRes Integer 응답 평균 소요시간(0.01ms)
.30. [vhostMin] . [vhostIndex] NetStream.Play Integer NetStream.Play 응답통계
.30.1. [vhostMin] . [vhostIndex] NetStream.Play.SuccessAverage Integer 성공응답 평균개수 (평균)
.30.2. [vhostMin] . [vhostIndex] NetStream.Play.SuccessCount Integer 성공응답 평균개수
.30.3. [vhostMin] . [vhostIndex] NetStream.Play.FailAverage Integer 실패응답 평균개수 (평균)
.30.4. [vhostMin] . [vhostIndex] NetStream.Play.FailCount Integer 실패응답 평균개수
.30.5. [vhostMin] . [vhostIndex] NetStream.Play.TimeRes Integer 응답 평균 소요시간(0.01ms)
.31. [vhostMin] . [vhostIndex] NetStream.Close Integer NetStream.Close 응답통계
.31.1. [vhostMin] . [vhostIndex] NetStream.Close.SuccessAverage Integer 성공응답 평균개수 (평균)
.31.2. [vhostMin] . [vhostIndex] NetStream.Close.SuccessCount Integer 성공응답 평균개수
.31.3. [vhostMin] . [vhostIndex] NetStream.Close.FailAverage Integer 실패응답 평균개수 (평균)
.31.4. [vhostMin] . [vhostIndex] NetStream.Close.FailCount Integer 실패응답 평균개수
.31.5. [vhostMin] . [vhostIndex] NetStream.Close.TimeRes Integer 응답 평균 소요시간(0.01ms)
.32. [vhostMin] . [vhostIndex] NetStream.Delete Integer NetStream.Delete 응답통계
.32.1. [vhostMin] . [vhostIndex] NetStream.Delete.SuccessAverage Integer 성공응답 평균개수 (평균)
.32.2. [vhostMin] . [vhostIndex] NetStream.Delete.SuccessCount Integer 성공응답 평균개수
.32.3. [vhostMin] . [vhostIndex] NetStream.Delete.FailAverage Integer 실패응답 평균개수 (평균)
.32.4. [vhostMin] . [vhostIndex] NetStream.Delete.FailCount Integer 실패응답 평균개수
.32.5. [vhostMin] . [vhostIndex] NetStream.Delete.TimeRes Integer 응답 평균 소요시간(0.01ms)
.33. [vhostMin] . [vhostIndex] NetStream.Seek Integer NetStream.Seek 응답통계
.33.1. [vhostMin] . [vhostIndex] NetStream.Seek.SuccessAverage Integer 성공응답 평균개수 (평균)
.33.2. [vhostMin] . [vhostIndex] NetStream.Seek.SuccessCount Integer 성공응답 평균개수
.33.3. [vhostMin] . [vhostIndex] NetStream.Seek.FailAverage Integer 실패응답 평균개수 (평균)
.33.4. [vhostMin] . [vhostIndex] NetStream.Seek.FailCount Integer 실패응답 평균개수
.33.5. [vhostMin] . [vhostIndex] NetStream.Seek.TimeRes Integer 응답 평균 소요시간(0.01ms)
.34. [vhostMin] . [vhostIndex] NetStream.Pause Integer NetStream.Pause 응답통계
.34.1. [vhostMin] . [vhostIndex] NetStream.Pause.SuccessAverage Integer 성공응답 개수 (평균)
.34.2. [vhostMin] . [vhostIndex] NetStream.Pause.SuccessCount Integer 성공응답 개수
.34.3. [vhostMin] . [vhostIndex] NetStream.Pause.FailAverage Integer 실패응답 개수 (평균)
.34.4. [vhostMin] . [vhostIndex] NetStream.Pause.FailCount Integer 실패응답 개수
.34.5. [vhostMin] . [vhostIndex] NetStream.Pause.TimeRes Integer 응답 평균 소요시간(0.01ms)

11장. 로그

이 장에서는 로그를 다룬다. 서비스는 로그로 시작해서 로그로 끝난다. 로그는 금이며, 법이며, 분쟁지역의 평화유지군이다.

로그는 전역과 가상호스트로 구분된다. 모든 로그는 기록여부를 설정할 수 있으며, 공통속성을 가진다.

<XXX Type="time" Unit="1440" Retention="10" Compression="OFF">ON</XXX>
  • Type (기본: time) , Unit (기본: 1440분) 로그 롤링조건을 설정한다.
    • time 설정된 unit 시간(단위: 분)마다 로그 파일을 롤링한다.
    • size 설정된 unit 크기(단위: MB)마다 로그 파일을 롤링한다.
    • both 콤마(,)로 구분하여 시간과 크기를 동시에 설정한다. 예를 들어 Unit="1440, 100"인 경우 시간이 24시간(1440분) 또는 100MB 인 경우 로그 파일을 롤링한다.
  • Retention (기본: 10개) 단위 로그파일을 최대 n개 유지한다.
  • Compression (기본: OFF) 로그가 롤링될 때 압축을 진행한다. 예를 들어 access_20140715_0000.log파일이 롤링되면 access_20140715_0000.log.gz로 압축되어 저장된다.

Type 이 "time" , Unit 이 10이면 로그는 매 10분에 롤링된다. 예를 들어 서비스를 2:18분에 시작해도 로그는 매 10분인 2:20, 2:30, 2:40에 롤링된다. 마찬가지로 하루에 한번 매일 0시 0분에 롤링하려면 1440(60분 X 24시)으로 Unit 값으로 설정한다. time 설정에서 로그는 하루에 한번 무조건 롤링되므로 Unit 의 최대값은 1440을 넘을 수 없다.

_images/sms_log_rolling3.png

최대 값인 24시간(Unit=1440)시간마다 로그가 롤링되도록 설정했다면 다음 그림과 같이 로그가 기록된다.

_images/sms_log_rolling4.png

Install 로그

설치/업데이트 시 모든 내용이 install.log에 기록된다. 이 로그는 별도의 설정이 없다.

#Target: STON Media Server 1.0.0
#Date: 2017.02.24 15:09:19
Prepare for STON Media Server 1.0.0 install process
#Target: STON Media Server 1.0.0
#Date: 2017.02.24 15:10:41
Prepare for STON Media Server 1.0.0 install process
[Copying files]
`./start-stop-daemon' -> `/usr/sbin/start-stop-daemon'
`./libtbbmalloc_proxy.so' -> `/usr/local/StonMediaServer/libtbbmalloc_proxy.so'
`./libtbbmalloc_proxy.so.2' -> `/usr/local/StonMediaServer/libtbbmalloc_proxy.so.2'
`./libtbbmalloc.so' -> `/usr/local/StonMediaServer/libtbbmalloc.so'
`./libtbbmalloc.so.2' -> `/usr/local/StonMediaServer/libtbbmalloc.so.2'
`./libtbb.so' -> `/usr/local/StonMediaServer/libtbb.so'
`./libtbb.so.2' -> `/usr/local/StonMediaServer/libtbb.so.2'
`./stonmd' -> `/usr/local/StonMediaServer/stonmd'
`./stonmx' -> `/usr/local/StonMediaServer/stonmx'
`./stonmr' -> `/usr/local/StonMediaServer/stonmr'
`./stonmu' -> `/usr/local/StonMediaServer/stonmu'
`./stonmp' -> `/usr/local/StonMediaServer/stonmp'
`./stonmc' -> `/usr/local/StonMediaServer/stonmc'
`./stonmapi' -> `/usr/local/StonMediaServer/stonmapi'
`./server.xml.default' -> `/usr/local/StonMediaServer/server.xml.default'
`./vhosts.xml.default' -> `/usr/local/StonMediaServer/vhosts.xml.default'
`./stonm_format.sh' -> `/usr/local/StonMediaServer/stonm_format.sh'
`./stonm_diskinfo.sh' -> `/usr/local/StonMediaServer/stonm_diskinfo.sh'
`./stonm_cacheclear.sh' -> `/usr/local/StonMediaServer/stonm_cacheclear.sh'
`./wm.sh' -> `/usr/local/StonMediaServer/wm.sh'
`./LICENSE-3RD-PARTY.txt' -> `/usr/local/StonMediaServer/LICENSE-3RD-PARTY.txt'
[Exporting config files]
#Export so directory
/usr/local/StonMediaServer/ to ld.so.conf
#Export sysctl to /etc/sysctl.conf
vm.swappiness=0
vm.min_free_kbytes=524288
#Export sudoers for WM
Defaults    !requiretty
stonmedia ALL=NOPASSWD: /etc/init.d/stonm stop, /etc/init.d/stonm start, /bin/ps -ef
[Configuring STON Media Server daemon script]
STON Media Server deamon activate in run-level 2345.
[Installing sub-packages]
curl installed.
rrdtool installed.
[Installing WM]
Stopping WM...
WM stopped
`./wm.server_default.xml' -> `/usr/local/StonMediaServer/wm/tmp/conf/server_default.xml'
`./wm.vhost_default.xml' -> `/usr/local/StonMediaServer/wm/tmp/conf/vhost_default.xml'
Uncompress WM and PHP module
WM installation almost complete. Changing WM privileges.
Installation successfully complete

Info 로그

Info로그는 전역설정(server.xml)에 설정한다.

# server.xml - <Server><Cache>

<InfoLog Type="size" Unit="1" Retention="5">ON</InfoLog>
  • <InfoLog> (기본: ON, Type: size, Unit: 1) STON 미디어 서버의 동작과 설정변경에 대해 기록한다.

Deny 로그

Deny로그는 전역설정(server.xml)에 설정한다.

# server.xml - <Server><Cache>

<DenyLog Type="size" Unit="1" Retention="5">ON</DenyLog>
  • <DenyLog> (기본: ON, Type: size, Unit: 1)

    서버 접근제어 에 의해 접근차단된 IP를 기록한다.

    #Fields: date time c-ip deny
    2017.11.15 07:06:10 1.1.1.1 AP
    2017.11.15 07:06:26 2.2.2.2 GIN
    2017.11.15 07:06:30 3.3.3.3 3.3.3.1-255
    

    모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

    • date 날짜
    • time 시간
    • c-ip 클라이언트 IP
    • deny 차단조건

OriginError 로그

OriginError로그는 전역설정(server.xml)에 설정한다.

# server.xml - <Server><Cache>

<OriginErrorLog Type="size" Unit="5" Retention="5" Warning="OFF">ON</OriginErrorLog>
  • <OriginErrorLog> (기본: OFF, Type: size, Unit: 5, Warning: OFF)

    모든 가상호스트의 원본서버에서 발생한 장애만을 기록한다. 장애는 접속장애와 전송장애를 의미하며 원본서버 배제/복구 결과가 기록된다.

    #Fields: date time vhostname level s-domain s-ip cs-method cs-uri time-taken sc-error sc-resinfo
    2017.11.15 07:06:10 [example.com] [ERROR] 192.168.0.13 192.168.0.13 GET /Upload/trip.mp4 20110 Connect-Timeout -
    2017.11.15 07:06:26 [example.com] [ERROR] 192.168.0.13 192.168.0.13 GET /Upload/trip.mp4 20110 Connect-Timeout -
    2017.11.15 07:06:30 [example.com] [ERROR] 192.168.0.13 192.168.0.13 GET /Upload/trip.mp4 20110 Connect-Timeout -
    #2017.11.15 07:06:30 [example.com] 192.168.0.13 excluded from service
    #2017.11.15 07:06:31 [example.com] Origin server list: 192.168.0.14
    #2017.11.15 07:11:11 [example.com] 192.168.0.13 recovered back in service
    #2017.11.15 07:11:12 [example.com] Origin server list: 192.168.0.13
    

    모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

    • date 장애발생 날짜
    • time 장애발생 시간
    • vhostname [가상호스트]
    • level [장애레벨(Error 또는 Warning)]
    • s-domain 원본서버 도메인
    • s-ip 원본서버 IP
    • cs-method STON이 원본서버에게 보낸 HTTP Method
    • cs-uri STON이 원본서버에게 보낸 URI
    • time-taken 장애가 발생 할때 까지 소요된 시간
    • sc-error 장애의 종류
    • sc-resinfo 장애발생시 서버 응답 정보(","문자로 구분)

    Warning 속성이 ON 이라면 다음 예제처럼 잘못된 HTTP통신이 발생한 경우에 기록한다.

    2017.11.15 07:09:03 [example.com] [WARNING] 10.10.10.10 121.189.63.219 GET /trip.mp4 20110 PartialResponseOnNormalRequest Res=206,Len=2635
    2017.11.15 07:09:03 [example.com] [WARNING] 10.10.10.10 121.189.63.219 GET /trip.mp4 20110 ClosedWithoutResponse -
    

    잘못된 HTTP통신의 경우는 다음과 같다.

    • ClosedWithoutResponse 원본서버에 의한 연결종료. HTTP 응답을 받지 못했다.
    • ClosedWhenDownloading 원본서버에 의한 연결종료. Content-Length 만큼 다운로드하지 못했다.
    • NotPartialResponseOnRangeRequest Range요청을 했으나 응답코드가 206이 아니다.
    • DifferentContentLengthOnRangeRequest 요청한 Range와 Content-Length가 다르다.
    • PartialResponseOnNormalRequest Range요청이 아닌데 응답코드가 206이다.

SysLog 전송

syslog 프로토콜을 사용하여 로그를 UDP로 실시간 포워딩한다. 전역 로그에 대하여 syslog로 전송되도록 설정할 수 있다.

# server.xml - <Server><Cache>

<InfoLog SysLog="OFF">ON</InfoLog>
<DenyLog SysLog="OFF">ON</DenyLog>
<OriginErrorLog SysLog="OFF">ON</OriginErrorLog>
  • SysLog
    • OFF (기본) syslog를 사용하지 않는다.
    • ON 이 태그 하위에 설정된 <SysLog> 로 로그를 전송한다.

다음은 <OriginErrorLog> 가 기록될 때 syslog를 설정하는 예제이다.

# server.xml - <Server><Cache>

<OriginErrorLog SysLog="ON">
   <SysLog Priority="local3.info" Dest="192.168.0.1:514" />
   <SysLog Priority="user.alert" Dest="192.168.0.2" />
   <SysLog Priority="mail.debug" Dest="log.example.com" />
</OriginErrorLog>
  1. <OriginErrorLog>SysLog 속성을 ON 으로 설정한다.
  2. <OriginErrorLog> 의 하위에 <SysLog> 태그를 생성한다. n대의 서버로 동시에 전송가능하다.
  3. <SysLog>Priority 속성을 설정한다. 이 표현은 syslog의 Facility LevelsSeverity levels 의 조합으로 구성한다.
  4. <SysLog>Dest 속성을 설정한다. syslog수신서버를 의미하며 수신포트가 514인 경우 생략가능하다.

위 설정으로 기록된 sys로그 예제는 다음과 같다. syslog의 tag는 STON/{로그명}으로 기록된다.

Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: 2017-03-12 14:09:20 [ERROR] [example.com] - 192.168.0.14 GET /trip.mp4 1996 Connect-Timeout -
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: 2017-03-12 14:09:22 [ERROR] [example.com] - 192.168.0.14 GET /trip2.mp4 1995 Connect-Timeout -
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: 2017-03-12 14:09:24 [ERROR] [example.com] - 192.168.0.14 GET /sample.mp4 2020 Connect-Timeout -
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: #2017 .03.12 14:09:24 [example.com] 192.168.0.14:102 excluded from service
Mar 12 11:24:24 192.168.0.1 STON/ORIGINERROR: #2017 .03.12 14:09:24 [example.com] Origin server list:

가상호스트별 로그저장

가상호스트별로 로그는 별도로 기록된다. 로그가 OFF 로 설정되어 있어도 로컬파일에만 써지지 않을 뿐이므로 api-monitoring-logtrace 는 정상동작한다.

# server.xml - <Server><VHostDefault>
# vhosts.xml - <Vhosts><Vhost>

<Log Dir="/stonm_log">
   ... (생략) ...
</Log>
  • <Log> Dir 속성으로 로그가 기록될 디렉토리를 설정한다. 로그는 설정한 디렉토리 하위의 가상호스트 디렉토리에 생성된다.

DNS 로그

원본서버 주소가 Domain으로 설정되었다면 Resolving결과를 기록한다.

# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>

<Dns Type="size" Unit="10" Retention="10" SysLog="OFF" Compression="OFF">ON</Dns>
#Fields: date time domain ttl ip-list ip-count time-taken result
2017-07-30 12:10:33 example.com 157 173.194.127.15,173.194.127.23,173.194.127.24,173.194.127.31 4 5007 success
2017-07-30 12:10:38 example.com 152 173.194.127.23,173.194.127.24,173.194.127.31,173.194.127.15 4 9 success
2017-07-30 12:11:03 example.com 127 173.194.127.31,173.194.127.15,173.194.127.23,173.194.127.24 4 15007 success
2017-07-30 12:12:53 example.com 17 173.194.127.15,173.194.127.23,173.194.127.24,173.194.127.31 4 6 success
2017-07-30 12:23:16 test.com 0 - 0 10008 fail
2017-07-30 12:23:21 test.com 0 - 0 5007 fail
2017-07-30 12:23:26 test.com 0 - 0 5011 fail
2017-07-30 12:24:38 example.com 152 173.194.127.23,173.194.127.24,173.194.127.31,173.194.127.15 4 9 success
2017-07-30 12:25:03 example.com 127 173.194.127.31,173.194.127.15,173.194.127.23,173.194.127.24 4 15007 success

모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

  • date 날짜
  • time 시간
  • domain 대상 Domain
  • ttl 레코드 유효시간(Time To Live)
  • ip-list IP 리스트
  • ip-count IP 개수
  • time-taken 수행시간
  • result success 또는 fail

Access 로그

클라이언트 트랜잭션을 로그로 기록한다.

# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>

<Access>
    <Http> ... </Http>
    <Rtmp> ... </Rtmp>
</Access>

프로토콜에 따라 로그파일이 별도로 생성되며 필드와 의미가 다를 수 있다.

HTTP Access 로그

HTTP 클라이언트 통신내용을 기록한다.

주석

HTTP 기반 프로토콜(HLS, MPEG-DASH)도 모두 HTTP 클라이언트의 범주에 포함되어 같은 파일에 기록된다.

기록 시점은 HTTP 트랜잭션이 완료되는 시점이다. HTTP 트랜잭션은 클라이언트에게 응답을 완료하거나 전송이 중단된 시점을 의미한다.

# server.xml - <Server><VHostDefault><Log><Access>
# vhosts.xml - <Vhosts><Vhost><Log><Access>

<Http Type="time" Unit="1440" Retention="10" XFF="on" Form="ston" Local="Off">ON</Http>
  • XFF
    • ON (기본) HTTP 클라이언트가 보낸 XFF(X-Forwarded-For)헤더 값과 클라이언트 IP를 같이 기록한다. 없다면 OFF 와 같다.
    • OFF 클라이언트 IP를 기록한다.
    • TrimCIP XFF헤더가 없을 경우 클라이언트 IP를, 있는 경우 (클라이언트 IP를 제외한) XFF헤더만을 기록한다.
  • Form
    • ston (기본) W3C표준 + 확장필드
    • custom admin-log-access-custom
  • Local
    • OFF (기본) 로컬통신(Loopback)은 기록하지 않는다.
    • ON 로컬통신(Loopback)도 기록한다.
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-bytes time-taken cs-referer sc-resinfo cs-range sc-cachehit cs-acceptencoding session-id sc-content-length
2017-03-08 16:52:24 220.134.10.5 GET /trip.mp4 - 80 - 61.50.7.9 Chrome/19.0.1084.56 200 98141 5 - Bypass+gzip+SSL3 - TCP_HIT gzip+deflate 7 1273735
2017-03-08 16:52:26 220.134.10.5 GET /voice.mp3 - 80 - 61.50.7.9 Chrome/19.0.1084.56 200 949 2 - - - TCP_HIT gzip+deflate 35 14875
2017-03-08 17:00:06 220.168.0.13 GET /video/clips.mp4 - 80 - 61.168.0.102  Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/536.11+(KHTML,+like+Gecko)+Chrome/20.0.1132.57+Safari/536.11 206 20971800 7008 - - 398458880-419430399 TCP_HIT - 41 89764358

모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

  • date HTTP 트랜잭션이 완료된 날짜
  • time HTTP 트랜잭션이 완료된 시간
  • s-ip 서버 IP
  • cs-method HTTP 클라이언트가 보낸 HTTP Method
  • cs-uri-stem HTTP 클라이언트가 보낸 URL중 QueryString을 제외한 부분
  • cs-uri-query HTTP 클라이언트가 보낸 URL중 QueryString
  • s-port 서버 포트
  • cs-username HTTP 클라이언트 username
  • c-ip HTTP 클라이언트 IP. XFF설정이 "ON"이라면 X-Forwarded-For헤더 값과 클라이언트 IP를 기록한다.
  • cs(User-Agent) HTTP 클라이언트가 보낸 User-Agent 헤더
  • sc-status 서버 응답코드
  • sc-bytes 서버가 보낸 Bytes (헤더 + 컨텐츠)
  • time-taken HTTP 트랜잭션이 완료될 때까지 소요된 전체시간(밀리세컨드)
  • cs-referer HTTP 클라이언트가 보낸 Referer헤더
  • sc-resinfo 부가 정보. "+"문자로 구분된다. 압축된 컨텐츠를 서비스했다면 압축옵션(gzip 또는 deflate)이 명시된다. 보안통신이라면 SSL 프로토콜 버전(SSL3, TLS1, TLS1.1, TLS1.2)이 명시된다. 바이패스한 통신이라면 "Bypass"가 명시된다.
  • cs-range HTTP 클라이언트가 보낸 Range헤더
  • sc-cachehit 캐시 HIT결과
  • cs-acceptencoding HTTP 클라이언트가 보낸 Accept-Encoding헤더
  • session-id HTTP 클라이언트 세션 ID (unsigned int64)
  • sc-content-length 서버 응답 Content-Length 헤더 값

HTTP Access로그는 전송 성공/실패 여부에 상관없이 모든 HTTP 트랜잭션을 기록한다. HTTP 트랜잭션은 HTTP 클라이언트가 요청(Request)을 보낼 때 시작된다. STON 미디어 서버가 클라이언트에게 응답을 보내기 전에 HTTP연결이 종료된다면 HTTP 트랜잭션도 중단된다. 이 때 로그에는 sc-statussc-bytes 가 0으로 기록된다. STON 미디어 서버가 원본서버로부터 응답을 받기 전에 클라이언트가 연결을 종료하는 경우 이런 로그가 기록된다.

HTTP 사용자정의 Access 로그

HTTP Access 로그를 사용자가 정의하도록 설정한다.

# server.xml - <Server><VHostDefault><Log><Access>
# vhosts.xml - <Vhosts><Vhost><Log><Access>

<Http Form="custom">
    <CustomFormat>%a %A %b id=%{userid}C %f %h %H "%{user-agent}i" %m %P "%r" %s %t %T %X %I %O %R %e %S %K</CustomFormat>
</Http>
  • <Http>Form 속성을 custom 으로 설정한다.
  • <CustomFormat> 사용자정의 로그 형식.

위 예제의 경우 다음과 같이 HTTP Access로그가 기록된다. (#Fields는 기록하지 않는다.)

192.168.0.88 192.168.0.12 163276 id=winesoft; trip.mp4 example.com HTTP "STON" GET 80 "GET /ston/trip.mp4 HTTP/1.1" 200 2017-04-03 21:21:54 1 C 204 163276 1 2571978 TCP_MISS HTTP/1.1
192.168.0.88 192.168.0.12 63276 id=winesoft; vod.mp4 example.com HTTP "STON" POST 80 "GET /ston/vod.mp4?start=10 HTTP/1.1" 200 2017-04-03 21:21:54 12 C 304 363276 2 2571979 TCP_REFRESH_HIT HTTP/1.1
192.168.0.88 192.168.0.12 626 id=winesoft; hls.m4u8 example.com HTTP "STON" GET 80 "GET /hls.m4u8 HTTP/1.1" 200 2017-04-03 21:21:54 2 X 124 6312333276 2 2571983 TCP_REFRESH_HIT HTTP/1.1

Apache로그 형식 을 기반으로 개발되었으며 일부 확장필드가 있다. 각 필드의 구분자에는 제한이 없지만 Space를 사용할 경우, User-Agent처럼 Space가 포함될 수 있는 필드는 따옴표("...")로 묶어서 설정한다.

  • %...a 클라이언트 IP

    192.168.0.66
    
  • %...A 서버IP 주소

    192.168.0.14
    
  • %...b HTTP헤더를 제외한 전송 바이트수

    1024
    
  • %...{foobar}C 서버가 수신한 요청의 Foobar 쿠키의 내용

    %{id=}c  입력하면 Cookie 에서 id= 해당하는 값을 기록
    
  • %...D 요청을 처리하는데 걸린 시간(MS)

    3000
    
  • %...f 파일명

    /mp4/iu.mp4 라면 iu.mp4를 기록
    
  • %...h HostName

    example.com
    
  • %...H 요청 프로토콜

    http 또는 https
    
  • %...{foobar}i 서버가 수신한 요청에서 foobar: 헤더의 내용

    %{User-Agent}i  입력  경우 User-Agent의 값을 기록
    
  • %...m 요청 Method

    GET 또는 POST 또는 HEAD
    
  • %...P Server PORT

    80
    
  • %...q QueryString

    Id=10&value=20
    
  • %...r 요청의 첫번째 줄(Request Line)

    GET /trip.mp4 HTTP/1.1
    
  • %...s 응답코드

    200
    
  • %...t STON 미디어 서버 기본 시간형식

    2017-01-01 15:27:02
    
  • %...{format}t Format에 정의된 날짜 형식

    %{%Y-%m-%d %H:%M:%S}T  입력하면 2017-08-07 06:12:23으로 기록.
    
  • %...T TimeTaken(초단위)

    10
    
  • %...U ShortURI

    /video/trip.mp4
    
  • %...u FullURI

    /video/trip.mp4?session=1232&id=37
    
  • %...X 트랜잭션이 완료되었을 때의 상태

    • X 응답이 완료되기 전에 종료
    • C 응답이 완료 되었음
    C
    
  • %...I 요청헤더를 포함한 수신바이트

    2048
    
  • %...O 응답헤더를 포함한 송신바이트

    2048
    
  • %...R 응답시간(MS)

    2
    
  • %...e Session-ID

    1
    
  • %...S 캐싱 HIT 결과

    TCP_HIT
    
  • %...K 요청 HTTP 버전

    HTTP/1.1
    
  • %...y 요청 HTTP 헤더 크기

    488
    
  • %...z 응답 HTTP 헤더 크기

    362
    

설정한 필드의 값이 존재하지 않으면 - 로 표기한다. 형식이 잘못되었다면 STON 기본 포맷(Form="ston")으로 동작한다.

위 표에서 각 필드의 ...에는 (e.g. “%h %U %r %b) 아무것도 명시하지 않거나, 기록 조건을 명시할 수 있다(조건을 만족하지 않으면 - 로 기록). 조건은 HTTP 상태코드 목록으로 설정하거나 !로 NOT 조건을 설정할 수 있다.

다음 예제는 400(Bad Request) 오류 또는 501(Not Implemented) 오류 일 때만 User-agent를 기록한다.

"%400,501{User-agent}i"

다음 예제는 정상적인 상태가 아닌 모든 요청에 대해 Referer를 로그에 남긴다.

"%!200,304,302{Referer}i"

RTMP Access 로그

RTMP 클라이언트 통신내용을 기록한다. 기록 시점은 RTMP 명령(connec, createStream, play, disconnect 등)이 처리될 때이다.

# server.xml - <Server><VHostDefault><Log><Access>
# vhosts.xml - <Vhosts><Vhost><Log><Access>

<Rtmp Type="time" Unit="1440" Retention="10" Form="ston" Local="Off">ON</Rtmp>
  • Form
    • ston (기본) W3C표준 + 확장필드
    • custom admin-log-access-custom
  • Local
    • OFF (기본) 로컬통신(Loopback)은 기록하지 않는다.
    • ON 로컬통신(Loopback)도 기록한다.
#Fields: date time x-message-type c-ip s-ip s-port x-app cs-uri-stem cs-uri-query cs(Referrer) cs(User-Agent) x-page-url cs-bytes sc-bytes sc-status time-duration time-response time-taken x-sc-cachehit x-file-size x-file-length x-stream-pos x-stream-bytes x-session-id x-message-status x-sc-resinfo
2017-03-08 12:14:21 connect 192.168.0.120 192.168.0.172 1935 /vod - - - LNX+9,0,124,2 - 3284 3073 200 11 0 0 - 0 0 0 0 184537 c -
2017-03-08 12:14:21 createStream 192.168.0.120 192.168.0.172 1935 /vod - - - LNX+9,0,124,2 - 3333 3325 200 52 0 0 - 0 0 0 0 184537 c -
2017-03-08 12:14:21 play 192.168.0.120 192.168.0.172 1935 /vod /mp4/knockknock.mp4 - - LNX+9,0,124,2 - 3461 3366 200 92 0 41 - 123069989 239 0 0 184537 x -
2017-03-08 12:18:32 disconnect 192.168.0.120 192.168.0.172 1935 /vod /mp4/knockknock.mp4 - - LNX+9,0,124,2 - 3861 123015677 200 250752 0 0 - 123069989 239 0 122871027 184537 c -

모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

  • date RTMP 트랜잭션이 완료된 날짜
  • time RTMP 트랜잭션이 완료된 시간
  • x-message-type RTMP 메시지 이름 (Connect, Play, Seek 등)
  • c-ip RTMP 클라이언트 IP
  • s-ip 서버 IP
  • s-port 서버 포트
  • x-app 가상호스트 Name 중 디렉토리. 없는 경우 - 로 기록
  • cs-uri-stem RTMP 클라이언트가 보낸 URL중 QueryString을 제외한 부분
  • cs-uri-query RTMP 클라이언트가 보낸 URL중 QueryString
  • cs(Referrer) RTMP 클라이언트가 보낸 RTMP Referer
  • cs(User-Agent) RTMP 클라이언트가 보낸 RTMP User-Agent
  • x-page-url Connection.connect 메쏘드의 pageUrl 파라미터
  • cs-bytes (단위: Bytes) RTMP 클라이언트가 보낸 요청량
  • sc-bytes (단위: Bytes) 서버가 보낸 응답량 (헤더 + 컨텐츠)
  • sc-status 서버 응답코드
  • time-duration (단위: ms) RTMP 세션이 접속한 시간(0)을 기준으로 로그를 기록할 때까지의 진행시간
  • time-response (단위: ms) RTMP 메시지 요청으로부터 응답하기까지 소요된 시간
  • time-taken (단위: ms) RTMP 메시지 요청으로부터 응답이 완료될 때까지 소요된 시간
  • x-sc-cachehit TCP_HIT 등의 캐시히트 정보
  • x-file-size (단위: Bytes) 영상의 크기
  • x-file-length (단위: 초) 영상의 전체시간
  • x-stream-pos (단위: ms) RTMP 클라이언트가 요청한 영상의 위치
  • x-stream-bytes (단위: Bytes) RTMP헤더를 제외한 전송된 영상크기
  • x-session-id 고유한 세션 ID
  • x-message-status 메시지 전송이 완료된 세션인 경우 c, 완료되지 않고 세션이 종료되면 x
  • x-sc-resinfo 부가정보를 기록하기 위한 예약필드

HTTP 트랜잭션은 Payload의 전송의 완료/중단을 의미하지만 RTMP 트랜잭션은 Payload와 상관이 없다.

Origin 로그

STON 미디어 서버와 원본서버가 진행한 트랜잭션을 로그로 기록한다.

# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>

<Origin>
    <Http> ... </Http>
</Origin>

프로토콜에 따라 로그파일이 별도로 생성되며 필드와 의미가 다를 수 있다.

HTTP Origin 로그

HTTP 원본서버와 진행된 모든 HTTP 트랜잭션을 기록한다.

주석

HTTP 기반 프로토콜(HLS, MPEG-DASH)도 모두 같은 파일에 기록된다.

기록 시점은 HTTP 트랜잭션이 완료되는 시점이며 전송완료 또는 전송중단 시점을 의미한다.

# server.xml - <Server><VHostDefault><Log><Origin>
# vhosts.xml - <Vhosts><Vhost><Log><Origin>

<Http Type="time" Unit="1440" Retention="10" Local="Off">ON</Http>
#Fields: date time cs-sid cs-tcount c-ip cs-method s-domain cs-uri s-ip sc-status cs-range sc-sock-error sc-http-error sc-content-length cs-requestsize sc-responsesize sc-bytes time-taken time-dns time-connect time-firstbyte time-complete cs-reqinfo cs-acceptencoding sc-cachecontrol s-port sc-contentencoding session-id session-type
2017.06.27 17:40:00 357 899 192.168.0.13 GET i.example.com /trip.mp4 115.71.9.136 200 - - - 3874 197 271 3874 20 0 0 17 3 - gzip+deflate - 80 gzip 7 cache
2017.06.27 17:40:00 357 900 192.168.0.13 GET i.example.com /video/sample.mp4 115.71.9.136 200 - - - 5673 223 272 5673 24 0 0 21 3 - - - 80 - 8 cache
#[ERROR:01] 2017.06.27 17:40:01 220.73.216.5 220.73.216.5 GET /web/logo.mp4 1824 Connect-Timeout - 11 cache
2017.06.27 17:40:00 357 901 192.168.0.13 GET i.example.com /clips.mp3 115.71.9.136 200 - - - 8150 189 273 8150 13 0 0 9 4 - max-age=3600 80 - 12 cache

원본서버에 장애가 발생했다면 #[ERROR:xx]로 시작하는 에러 로그가 기록된다. 모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

_images/time_taken.jpg

원본 시간측정 구간

  • date HTTP 트랜잭션이 완료된 날짜
  • time HTTP 트랜잭션이 완료된 시간
  • cs-sid 세션의 고유ID. 같은 세션을 통해 처리된(재사용된) HTTP 트랜잭션은 같은 값을 가진다.
  • cs-tcount 트랜잭션 카운트. 이 HTTP 트랜잭션이 현재 세션에서 몇 번째로 처리된 트랜잭션인지 기록한다. 같은 cs-sid 값을 가지는 트랜잭션이라면 이 값은 중복될 수 없다.
  • c-ip STON의 IP
  • cs-method 원본서버에게 보낸 HTTP Method
  • s-domain 원본서버 도메인
  • cs-uri 원본서버에게 보낸 URI
  • s-ip 원본서버 IP
  • sc-status 원본서버 HTTP 응답코드
  • cs-range 원본서버에게 보낸 Range요청 값
  • sc-sock-error 소켓 에러코드(1=전송실패, 2=전송지연, 3=연결종료)
  • sc-http-error 원본서버가 4xx 또는 5xx응답을 줬을 때 응답코드를 기록
  • sc-content-length 원본서버가 보낸 Content Length
  • cs-requestsize (단위: Bytes) 원본서버로 보낸 HTTP 요청 헤더 크기
  • sc-responsesize (단위: Bytes) 원본서버가 응답한 HTTP 헤더 크기
  • sc-bytes (단위: Bytes) 수신한 컨텐츠 크기(헤더 제외)
  • time-taken (단위: ms) HTTP 트랜잭션이 완료될 때까지 소요된 전체시간. 세션 재사용이 아니라면 소켓 접속시간까지 포함한다.
  • time-dns (단위: ms) DNS쿼리에 소요된 시간
  • time-connect (단위: ms) 원본서버와 소켓 Established까지 소요된 시간
  • time-firstbyte (단위: ms) 요청을 보내고 응답이 올때까지 소요된 시간
  • time-complete (단위: ms) 첫 응답부터 완료될 때까지 소요된 시간
  • cs-reqinfo 부가 정보. "+"문자로 구분한다. 바이패스한 통신이라면 "Bypass", Private바이패스라면 "PrivateBypass"로 기록된다.
  • cs-acceptencoding 원본서버에 압축된 컨텐츠를 요청하면 "gzip+deflate"로 기록된다.
  • sc-cachecontrol 원본서버가 보낸 cache-control헤더
  • s-port 원본서버 포트
  • sc-contentencoding 원본서버가 보낸 Content-Encoding헤더
  • session-id 원본서버 요청을 발생시킨 HTTP 클라이언트 세션 ID (unsigned int64)
  • session-type 원본서버에 요청한 세션 타입
    • cache 캐싱용도로 사용된 세션
    • recovery origin_exclusion_and_recovery 에서 복구용도로 사용된 세션
    • healthcheck origin-health-checker 가 사용한 세션

Monitoring 로그

5분 평균 통계를 기록한다.

# server.xml - <Server><VHostDefault><Log>
# vhosts.xml - <Vhosts><Vhost><Log>

<Monitoring Type="size" Unit="10" Retention="10" Form="json">ON</Monitoring>
  • Form 로그형식을 지정한다. ( json 또는 xml )

12장. WM (Web Management)

이 장에서는 Web Management(이하 WM)를 소개한다. WM은 Web Interface로 동작하는 STON 미디어 서버 관리 도구이다. 사용자는 WM을 통하여 직관적으로 서비스를 구성할 수 있을 뿐만 아니라 클러스터를 구성하여 많은 수의 STON 미디어 서버를 통합관리 할 수 있다.

STON 미디어 서버를 설치하면 다음 경로에 WM이 설치된다.

/usr/local/StonMediaServer/wm

WM은 Apache 2.2.24 + PHP 5.3.24으로 구현되었다. Apache를 사용하므로 httpd.conf 파일을 편집하여 원하는 구성(예를 들어 HTTPS)으로 변경이 가능하다.

/usr/local/StonMediaServer/wm/conf/httpd.conf

WM과 STON 미디어 서버는 느슨하게 결합되어 있다. 다음 그림처럼 WM은 STON 미디어 서버의 설정파일과 API만을 사용하여 STON 미디어 서버의 동작을 구성한다.

_images/sms_wm_basic.png

WM은 STON 미디어 서버의 설정파일과 API를 사용한다.

우리는 이와 유사한 방식으로 WM을 능가하는 더 나은 관리기법이 존재할 것이라 생각한다.

접속

WM은 9500 포트를 사용한다. 설치된 STON 미디어 서버의 IP가 192.168.0.100이라면 WM접근 주소는 http://192.168.0.100:9500이 된다. 앞서 언급한 대로 httpd.conf 파일을 변경하면 다른 포트로 변경할 수 있다.

_images/sms_wm_login.png

WM 접속초기화면

계정

기본 계정은 [아이디: admin , 비밀번호: ston ] 이다. 로그인에 성공하면 STON 미디어 서버의 전반적인 상태를 확인할 수 있는 대쉬보드 페이지가 나타난다.

_images/sms_wm_main.png

WM 대쉬보드

최신버전 업데이트

최신버전이 릴리스되면 탑 메뉴 우측에 "새로운 업데이트가 있습니다" 메시지가 표시된다.

_images/sms_wm_update_full.png

메시지를 클릭하시면 최신버전으로 업데이트할 수 있는 페이지가 표시된다. 현재 서비스 상태에 따라 업데이트 안전도 여부가 표시된다.

_images/sms_wm_update1.png

WM 업데이트하면 안전합니다.

업데이트가 완료되면 모든 서비스가 자동으로 재시작 된다.

메뉴 구성

메뉴는 Mouse-Click에 따라 확장/축소가 되는 Drop Down메뉴로 구성된다.

_images/sms_wm_menu.png

WM 메뉴

  1. 전역설정

    전역설정(server.xml)에서 가상호스트 기본설정을 제외한 모든 기능을 설정한다.

  2. 가상호스트 관리

    가상호스트의 추가/중지/삭제를 할 수 있으며 서비스 중인 모든 가상호스트 상태를 한눈에 볼 수 있다.

  3. 클러스터

    클러스터를 구성/관리/파괴할 수 있으며 같은 클러스터의 모든 서비스를 서버별, 서비스별로 볼 수 있다.

  4. 컨텐츠제어

    Purge와 같이 서비스 중인 컨텐츠에 대하여 제어할 수 있다.

  5. 서버 상태

    시스템 상태와 같은 전역자원을 모니터링 한다. 모든 Graph는 전역자원 Graph를 사용한다.

  6. 서비스 상태

    가상호스트의 서비스 상태를 모니터링 한다. 모든 Graph는 가상호스트 Graph를 사용한다.

전역설정

전역설정(server.xml)에서 가상호스트 기본설정을 제외한 모든 기능을 설정한다.

_images/sms_wm_globalconf.png

WM 전역설정 - 일반

가상호스트 관리

가상호스트를 추가/삭제/수정할 수 있다. 모든 가상호스트는 따로 명시적으로 설정을 변경하지 않는 이상 Default 가상호스트 의 설정을 사용한다.

신규

새롭게 서비스할 가상호스트를 생성한다. 클러스터가 설정되어 있는 경우 모든 서버에 가상호스트를 동시생성 할 수 있다.

모든 가상호스트는 Default 가상호스트 를 상속받으므로 가상호스트명과 원본서버 주소만 설정하면 곧바로 서비스 투입이 가능하다. 여러 개의 하위 설정이 있으며 펼쳐보기 버튼을 눌러 상세 설정으로 확장할 수 있다.

_images/sms_wm_vhost_new.png

WM 가상호스트 관리 - 신규

목록

서비스 중인 모든 가상호스트 상태를 모니터링할 수 있다. 가상호스트별로 시작/중지가 가능하다. 클러스터가 설정되어 있다면 모든 서버의 가상호스트를 동시에 제어할 수 있다. 또한 기본가상호스트를 선택할 수 있다.

_images/wm_vhost_list.png

WM 가상호스트 관리 - 목록

상세설정

기본 가상호스트(VHostDefault)와 개별 가상호스트에 대해 설정한다. 좌측상단의 콤보박스를 선택하여 가상호스트를 선택할 수 있다. Default 가상호스트 는 모든 가상호스트가 상속받는 기본 설정이다. 그러므로 별도로 재정의(Overriding)하지 않은 설정의 경우 Default 가상호스트 의 설정이 반영된다.

_images/sms_wm_vhost_menu.png

WM 가상호스트 설정 - 상단메뉴

위 그림처럼 가상호스트에서 설정할 수 있는 세부메뉴가 제공되며 현재 선택된 세부메뉴가 붉은 색으로 표시된다. 모든 설정은 "적용" 또는 "Cluster전체적용" 버튼을 눌러야 반영된다.

_images/sms_wm_vhost_conf_origin.png

WM 가상호스트 설정 - 원본서버

여기서 설정하는 거의 모든 항목은 재정의될 수 있는 설정이므로 이에 대한 명확한 이해가 필요하다. ( 가상호스트 기본설정 예제 참조)

WM에서는 색으로 재정의를 구분한다. 기본 가상호스트의 설정을 그대로 사용하는 경우 흰색 배경으로 표시된다. 재정의된 값은 살구색 으로 표시되어 기본값과 구분된다. 모든 재정의 설정의 우측에는 X 버튼이 제공된다. 이 버튼을 클릭하여 재정의를 해지한다.

서비스 상태

모든 서비스 상태에 대해서는 RRD 그래프가 제공된다. ( Appendix A: Graph 참조 )

_images/sms_wm_service_stats3.png

모든 그래프는 일, 주, 월, 년 단위로 그래프가 제공된다.

_images/wm_vstat3.png

클러스터

여러 대의 STON 미디어 서버를 하나의 클러스터로 통합하여 일괄적으로 관리/운영할 수 있다. 모든 STON 미디어 서버는 동등한 관계로 설정되기 때문에 클러스터에 포함된 어떤 STON 미디어 서버로 로그인 하여도 클러스터 전체를 관리할 수 있다.

구성

클러스터를 생성하거나 이미 존재하는 클러스터에 다른 서버를 추가할 수 있다. 클러스터 추가에는 WM계정의 인증절차가 필요하다. 만약 같은 계정(아이디와 비밀번호)으로 WM이 구성되어 있다면 인증절차는 생략된다.

_images/sms_wm_cluster_port1.png

신규 클러스터 생성

_images/sms_wm_cluster_list.png

클러스터 목록

클러스터가 구성되면 가상호스트 관리시 "Cluster전체적용" 버튼으로 일괄설정이 가능하다. 또한 클러스터에 소속된 서버끼리 간편하게 모든 설정을 복제할 수 있다. 특정 서버를 다른 클러스터에 참여시키고 싶으면 탈퇴 후 재구성해야 한다.

전용 포트분리

최초 설치시 WM과 클러스터 포트가 같은 포트를 사용한다. 이 방식은 WM계정만으로 클러스터링 구성이 가능하다는 장점이 있지만 접근 IP를 제한하는 환경에서는 문제가 될 수 있다.

  • 보안상의 이유로 WM을 일부 IP에서만 접근되도록 제한한다.
  • 클러스터링을 위해서는 모든 서버들이 서로 다른 서버들의 IP를 허가해주어야 한다.
  • (CDN 처럼) 서버 수가 매우 많거나 서버들의 IP가 유동적인 경우 IP목록을 작성할 수 없다.

클러스터 포트를 분리하여 이 문제를 해결할 수 있다. 서버들끼리 신원은 WM 계정이 아닌 라이선스를 통해 확인된다. 같은 라이선스를 가진 서버들끼리만 클러스터가 가능해져 보안성이 높아진다.

1. [Apache 서버] httpd.conf 멀티 Port설정

(기본 설치라면) /usr/local/StonMediaServer/wm/conf/httpd.conf 파일을 열어 다음과 같이 포트를 추가한다.

_images/sms_wm_cluster_port3.png

저장 후 반영을 위해 Apache서버를 재시작한다.

2. [WM] 클러스터 구성

정상적으로 멀티포트 구성이 되었다면 다음과 같이 "클러스터 포트 분리" 버튼이 생성된다.

_images/sms_wm_cluster_port2.png

버튼을 클릭한다.

3. [WM] 클러스터 포트선택

분리할 수 있는 포트 목록을 보여준다. 포트를 선택해 구성한다.

_images/sms_wm_cluster_port4.png

클러스터링에 포함되는 모든 서버는 반드시 같은 포트를 사용해야 한다.

서버 상태

클러스터에 소속된 모든 STON 미디어 서버의 상태와 서비스 현황을 확인할 수 있다. 서버 목록을 구성하는 각 항목을 클릭하면 보다 상세한 정보를 확인할 수 있다.

_images/wm_cluseter3_2.png

서버별 상태

가상호스트 상태

클러스터에서 서비스하는 모든 가상호스트의 MRTG를 종합하여 확인할 수 있다. 클러스터의 모든 가상호스트를 동시에 시작/중지할 수 있다. 가상호스트 목록을 구성하는 각 항목을 클릭하면 보다 상세한 정보를 확인할 수 있다.

_images/wm_cluseter4.png

가상호스트 서비스별 상태

컨텐츠 제어

서비스 중인 컨텐츠를 열람/제어하거나 클린업을 수행할 수 있다. 클러스터 구성이 되어있다면 모든 STON 미디어 서버의 컨텐츠를 동시에 열람하거나 제어할 수 있다.

_images/sms_wm_fileinfo1.png

Caching상태 확인

_images/sms_wm_purge1.png

Purge등 API호출

시스템 정보

가동 중인 서버의 시스템 정보를 조회한다.

_images/sms_wm_hwinfo1.png

4부. 고급기능

13장. 미디어 가공

이 장에서는 미디어를 동적으로 가공하여 서비스하는 방법에 대해 설명한다. 미디어는 클라이언트 환경과 서비스 형태에 따라 다양한 형태로 가공된다. 때문에 같은 콘텐츠이지만 여러 형태로 원본서버에 존재하게 된다. 이런 방식은 처리시간과 저장공간의 낭비로 이어질 뿐만 아니라 관리하기도 매우 어렵다.

Trimming

시간 값을 기준으로 영상에서 원하는 구간을 추출한다. Trimming은 전송단계에서만 발생할 뿐 원본의 형태를 변경하지 않는다. 별도의 저장공간을 사용하지 않는다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<ContentTransform>
    <MP4Trimming StartParam="start" EndParam="end" AllTracks="off">OFF</MP4Trimming>
</ContentTransform>
  • <MP4Trimming>
    • OFF (기본) 아무 것도 하지 않는다.
    • ON 확장자(.mp4, .m4a)가 일치하면 원하는 구간만큼 서비스하도록 Trimming한다. Trimming구간은 StartParam 속성과 EndParam 으로 설정한다.
    • AllTracks 속성
      • OFF (기본) Audio/Video 트랙만 Trimming한다. (Mod-H264 방식)
      • ON 모든 트랙을 Trimming한다. 사용 전 반드시 플레이어 호환성을 확인해야 한다.

파라미터는 클라이언트 QueryString을 통해 입력받는다. 예를 들어 10분 분량의 동영상(/trip.mp4)을 특정 구간만 Trimming하고 싶다면 QueryString에 원하는 시점(단위: 초)을 명시한다.

// HTTP Pseudo-Streaming
http://www.example.com/bar/mp4:trip.mp4                // 10분 : 전체 동영상
http://www.example.com/bar/mp4:trip.mp4?end=60         // 1분 : 처음부터 60초까지
http://www.example.com/bar/mp4:trip.mp4?start=120      // 8분 : 2분(120초)부터 끝까지
http://www.example.com/bar/mp4:trip.mp4?start=3&end=13 // 10초 : 3초부터 13초까지

// Apple iOS device (Cupertino/Apple HTTP Live Streaming)
http://www.example.com/bar/mp4:trip.mp4/playlist.m3u8?start=3&end=13

// Adobe Flash Player (RTMP)
Server: rtmp://www.example.com/bar
Stream: mp4:trip.mp4?start=3&end=13

StartParam 값이 EndParam 값보다 클 경우 구간이 지정되지 않은 것으로 판단한다.

이 기능은 파일을 단순히 자르기만 하는 것이 아니라 올바르게 재생될 수 있도록 키프레임등 미디어 파일을 분석하여 구간을 추출한다. 클라이언트에게 전달되는 파일은 다음 그림처럼 MP4헤더가 재생성된 완전한 형태의 MP4파일이다.

_images/sms_transform_trimming1.png

완전한 형태의 파일이 제공된다.

추출된 구간은 별도의 파일로 인식되기 때문에 200 OK로 응답된다. 그러므로 다음과 같이 Range헤더가 명시된 경우 추출된 파일로부터 Range를 계산하여 206 Particial Content 로 응답한다.

_images/sms_transform_trimming_range1.png

일반적인 Range요청처럼 처리된다.

구간추출 파라미터가 QueryString 표현을 사용하기 때문에 자칫 QueryString 구분 과 헷갈릴 수 있다. <ApplyQueryString> 설정이 ON 인 경우 클라이언트가 요청한 URL의 QueryString이 모두 인식되지만 StartParamEndParam 은 제거된다.

GET /bar/mp4:trip.mp4?start=30&end=100
GET /bar/mp4:trip.mp4?tag=3277&start=30&end=100&date=20130726

예를 들어 위와 같이 StartParamstartEndParamend 로 입력된 경우 이 값들은 구간을 추출하는데 쓰일 뿐 Caching-Key를 생성하거나 원본서버로 요청을 보낼 때는 제거된다. 각각 다음과 같이 인식된다.

GET /bar/mp4:trip.mp4
GET /bar/mp4:trip.mp4?tag=3277&date=20130726

Multi-Trimming

시간 값을 기준으로 복수로 지정된 구간을 하나의 영상으로 추출한다.

_images/conf_media_multitrimming.png

/mp4:trip.mp4?trimming=0-30,210-270,525-555

구간 지정방법만 다를뿐 동작방식은 Trimming 과 동일하다.

# server.xml - <Server><VHostDefault><ContentTransform>
# vhosts.xml - <Vhosts><Vhost><ContentTransform>

<MP4Trimming MultiParam="trimming" MaxRatio="50">OFF</MP4Trimming>
  • <MP4Trimming>
    • MultiParam (기본: "trimming") 설정된 이름을 QueryString Key로 사용하여 추출 구간을 지정한다. 하나의 구간은 "시작시간 - 종료시간" 으로 표기하며 각 구간은 콤마(,)로 연결한다.
    • MaxRatio (기본: 50%) Multi-Trimming된 영상은 원본보다 MaxRatio (최대 100%) 비율만큼까지 커질 수 있다. MaxRatio 를 넘어가는 구간은 무시된다.

예를 들어 다음과 같이 호출하면 3분짜리 영상이 생성된다.

// HTTP Pseudo-Streaming
http://www.example.com/bar/mp4:trip.mp4?trimming=10-70,560-620,1245-1305

// Apple iOS device (Cupertino/Apple HTTP Live Streaming)
http://www.example.com/bar/mp4:trip.mp4/playlist.m3u8?trimming=10-70,560-620,1245-1305

// Adobe Flash Player (RTMP)
Server: rtmp://www.example.com/bar
Stream: mp4:trip.mp4?trimming=10-70,560-620,1245-1305

같은 영상을 반복하거나 앞 뒤가 바뀐 영상을 만들 수도 있다.

// HTTP Pseudo-Streaming
http://www.example.com/mp4:trip.mp4?trimming=17-20,17-20,17-20,17-20
http://www.example.com/mp4:trip.mp4?trimming=1000-1200,500-623,1900-2000
http://www.example.com/mp4:trip.mp4?trimming=600-,400-600

구간 값을 지정하지 않은 경우 맨 앞 또는 맨 뒤를 의미한다.

주석

Multi-TrimmingTrimming 보다 우선한다. QueryString에 Multi-Trimming 키가 명시되어 있다면 Trimming 키는 무시된다.

14장. 가상호스트 고급기법

이 장에서는 가상호스트를 활용하여 서비스를 유연하게 구성하는 여러 기법에 대해 설명한다.

가상호스트는 보통 원본(Domain 또는 IP목록)과 1:1로 구성되는 것이 기본이다. 하지만 상황에 따라 대표 가상호스트를 여러 하위 가상호스트로 분기하거나, 반대로 독립적인 여러 가상호스트를 하나의 서비스로 포장해야 하는 경우도 발생한다. 각 기능에 따라 monitoring_stats_vhost_client / admin-log-access 의 정책이 다를 수 있음을 유의해야 한다.

Facade 가상호스트

<Alias> 는 가상호스트의 별명만을 추가하는 것이므로 통계와 로그가 분리되지 않는다. 가상호스트는 공유하지만 도메인에 따라 monitoring_stats_vhost_clientadmin-log-access 를 분리하고 싶은 경우 Facade가상호스트를 설정한다.

_images/sms_adv_vhost_facade1.png

Facade는 통계와 로그만 수집한다.

# vhosts.xml - <Vhosts>

<Vhost Name="example.com">
   ...
</Vhost>

<Vhost Name="another.com" Status="facade:example.com">
   ...
</Vhost>

Status 속성의 값을 facade: + 가상호스트 로 설정한다. 예제의 경우 monitoring_stats_vhost_clientadmin-log-access 는 example.com이 아닌 클라이언트가 요청한 도메인인 another.com으로 수집된다.

Sub-Path 지정

한 가상호스트에서 경로에 따라 다른 가상호스트가 처리하도록 설정할 수 있다.

_images/sms_adv_vhost_subpath1.png

통계/로그는 요청을 최종처리한 각각의 가상호스트에 기록된다.

# vhosts.xml - <Vhosts>

<Vhost Name="sports.com">
  <Sub Status="Active">
    <Path Vhost="baseball.com">/baseball/<Path>
    <Path Vhost="football.com">/football/<Path>
  </Sub>
</Vhost>

<Vhost Name="baseball.com" />
<Vhost Name="football.com" />
  • <Sub> 경로나 패턴이 일치하면 해당 요청을 다른 가상호스트로 보낸다. 일치하지 않는 경우만 현재 가상호스트가 처리한다.
    • Status (기본: Active) Inactive인 경우 무시한다.
    • <Path> 클라이언트가 요청한 URI와 경로가 일치하면 Vhost 로 해당 요청을 보낸다. 값은 경로 또는 패턴만 가능하다.

예를 들어 클라이언트가 다음과 같이 요청했다면 해당 요청은 가상호스트 football.com이 처리한다.

GET /football/top10.mp4 HTTP/1.1
Host: sports.com

HTTP Redirect 추적

원본서버에서 Redirect계열(301, 302, 303, 307)로 응답하는 경우 Location헤더를 추적하여 콘텐츠를 요청한다.

_images/sms_adv_vhost_redirectiontrace1.png

클라이언트는 Redirect여부를 모른다.

# server.xml - <Server><VHostDefault><OriginOptions><Http>
# vhosts.xml - <Vhosts><Vhost><OriginOptions><Http>

<RedirectionTrace>OFF</RedirectionTrace>
  • <RedirectionTrace>
    • OFF (기본) 3xx 응답으로 저장된다.
    • ON Location헤더에 명시된 주소에서 콘텐츠를 다운로드 한다. 형식에 맞지 않거나 Location헤더가 없는 경우에는 동작하지 않는다. 무한히 Redirect되는 경우를 방지하기 위하여 1회만 추적한다.

대역폭 제한

가상호스트의 최대 Outbound 대역폭을 제한한다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<TrafficCap>0</TrafficCap>
  • <TrafficCap> (기본: 0) 가상호스트의 최대 Bandwidth를 Mbps단위로 설정한다. 0으로 설정하면 Bandwidth을 제한하지 않는다.

STON 미디어 서버와 모든 클라이언트 사이에 발생하는 대역폭의 총합은 <TrafficCap> 을 넘을 수 없다. <TrafficCap> 을 50 (Mbps)로 설정했다면 50Mbps NIC를 설치한 것과 같은 효과를 낸다.

15장. 접근제어

이 장에서는 원치않는 클라이언트 접근을 차단하는 방법에 대해 설명한다. 접근차단은 보통 ACL(Access Control List)에 차단목록(Black-list)을 작성하지만 설정편의상 허용목록(White-list)을 작성하기도 한다.

접근제어는 접속단계에서 수행하는 서버 접근제어와 가상호스트마다 설정하는 가상호스트 접근제어로 나뉜다. 수준별로 시점과 판단기준이 다르므로 효과적인 차단시점을 결정해야 한다. 접근제어의 동작은 모두 로그에 기록된다.

서버 접근제어

클라이언트가 서버에 접속하는 순간 IP정보를 통해 차단여부를 결정한다. 접속단계에서 처리되기 때문에 가장 확실하며 빠르다. 전역설정(server.xml)에 설정하며 가장 높은 우선순위를 가진다.

# server.xml - <Server><Host>

<ServiceAccess Default="Allow">
   <Deny>192.168.7.9-255</Deny>
   <Deny>192.168.8.10/255.255.255.0</Deny>
</ServiceAccess>
  • <ServiceAccess> IP기반의 ACL을 설정한다. IP, IP Range, Bitmask, Subnet 이상 네 가지 형식을 지원한다. 순서를 인식하며 상위에 설정된 표현이 우선한다. Default (기본: Allow) 속성은 일치하는 조건이 없을 때 처리방법이다. 이 속성을 Deny 로 설정하면 하위에 <Allow> 로 허가할 조건들을 명시해주어야 한다.

차단된 IP는 admin-log-deny 에 기록된다.

GeoIP

GeoIP를 사용하여 국가별로 접근을 차단할 수 있다. GeoIP Databases 중 Binary Databases를 GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE 로 링크하여 실시간으로 변경내용을 반영한다.

# server.xml - <Server><Host>

<ServiceAccess GeoIP="/var/ston/geoip/">
   <Deny>AP</Deny>
   <Deny>GIN</Deny>
</ServiceAccess>

<ServiceAccess>GeoIP 속성에 GeoIP Databases 경로를 설정한다. 국가코드는 ISO 3166-1 alpha-2ISO 3166-1 alpha-3 를 지원한다.

주석

GeoIP는 파일명이 예약되어 있으므로 반드시 저장된 로컬경로를 입력하도록 설정한다. 또한 자동으로 변경이 반영되기 때문에 별도로 설정을 Reload하지 않아도 된다.

GeoIP가 설정되어 있다면 해당 디렉토리에 저장된 파일목록을 조회한다. 설정되어 있지 않다면 404 NOT FOUND로 응답한다.

http://127.0.0.1:10040/monitoring/geoiplist

결과는 JSON형식으로 제공된다.

{
    "version": "2.0.0",
    "method": "geoiplist",
    "status": "OK",
    "result":
    {
        "path" : "/usr/ston/geoip/",
        "files" :
        [
            {
                "file" : "GeoIP.dat",
                "size" : 766255
            },
            {
                "file" : "GeoLiteCity.dat",
                "size" : 12826936
            }
        ]
    }
}

가상호스트 접근제어

가상호스트별로 서비스 허용/차단/redirect를 설정한다.

# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>

<AccessControl Default="Allow" DenialCode="401">OFF</AccessControl>
  • <AccessControl>
    • OFF (기본) ACL이 활성화되지 않는다. 모든 클라이언트 요청을 허가한다.
    • ON ACL이 활성화된다. 차단된 요청에 대해서는 DenialCode 속성에 설정된 응답코드로 응답한다. Default (기본: Allow) 속성이 Allow 라면 ACL은 거부목록이 된다. 반대로 Deny 라면 ACL은 허가목록이 된다.

구체적인 접근제어 목록은 /svc/{가상호스트 이름}/acl.txt에 설정한다.

허용/거부

모든 클라이언트 HTTP요청에 대하여 허용/거부 여부를 설정한다. Deny된 요청은 admin-log-access 에 TCP_DENY로 기록된다.

각 조건마다 별도로 응답코드를 설정할 수도 있다.

# /svc/www.example.com/acl.txt
# 구분자는 콤마(,)이며 {조건},{allow 또는 deny} 순서로 표기한다.
# deny일 경우 키워드 뒤에 응답코드를 명시할 수 있다.
# 명시하지 않으면 ``<AccessControl>`` 의 ``DenialCode`` 를 사용한다.
# n 개의 조건을 결합(AND)하기 위해서는 &를 사용한다.

$IP[192.168.1.1], allow
$IP[192.168.2.1-255]
$IP[192.168.3.0/24], deny
$IP[192.168.4.0/255.255.255.0]
$IP[AP] & !HEADER[referer], allow
$HEADER[cookie: *ILLEGAL*], deny, 404
$HEADER[via: Apache]
$HEADER[x-custom-header]
!HEADER[referer] & !HEADER[user-agent] & !HEADER[host], deny
$URL[/source/public.zip], allow
$URL[/source/*]
/profile.zip, deny, 500
/secure/*.dat

허용/차단 조건은 IP, GeoIP, Header, URL 4가지로 설정이 가능하다.

  • IP

    $IP[...]로 표기하며 IP, IP Range, Bitmask, Subnet 네 가지 형식을 지원한다.

  • GEOIP

    $IP[...]로 표기하며 반드시 GeoIP설정이 되어 있어야 동작한다.

  • HEADER

    $HEADER[Key : Value]로 표기한다. Value는 명확한 표현과 패턴을 인식한다. $HEADER[Key:]처럼 구분자는 있지만 Value가 빈 문자열이라면 요청 헤더의 값이 비어 있는 경우를 의미한다. $HEADER[Key]처럼 구분자 없이 Key만 명시되어 있다면 Key에 해당하는 헤더의 존재유무를 조건으로 판단한다.

  • URL

    $URL[...]로 표기하며 생략이 가능하다. 명확한 표현과 패턴을 인식한다.

$는 "조건에 맞다면 ~ 한다"를 의미하지만 !는 "조건에 맞지 않는다면 ~ 한다"를 의미한다. 다음과 같이 부정조건으로 지원한다.

# 국가가 KOR이 아니라면 deny한다.
!IP[KOR], deny

# referer헤더가 존재하지 않는다면 deny한다.
!HEADER[referer], deny

# /secure/ 경로 하위가 아니라면 allow한다.
!URL[/secure/*], allow

Redirect

모든 클라이언트 HTTP요청에 대하여 Redirect 여부를 설정한다. Redirect된 요청에 대해서는 302 Moved temporarily 로 응답한다.

# /svc/www.example.com/acl.txt
# 구분자는 콤마(,)이며 {조건},{redirect} 순서로 표기한다.
# redirect일 경우 키워드 뒤에 이동시킬 URL을 명시한다. (Location헤더의 값으로 명시)

$IP[GIN], redirect, /page/illegal_access.html
$HEADER[referer:], redirect, http://another-site.com
!HEADER[referer], redirect, http://example.com#URL

Redirect 할 때 클라이언트가 요청한 URL이 필요할 수 있다. 이런 경우 #URL 키워드를 사용한다.

HTTPS만을 지원하는 서비스의 경우 HTTP 요청에 대해 다음과 같이 $PROTOCOL[HTTP] 조건으로 HTTPS로 강제하도록 redirect시킬 수 있다.

$PROTOCOL[HTTP], redirect, https://example.com#URL

16장. 최적화와 그 밖의 것들

이 장에서는 최적화와 그 밖의 잡다하지만 깊이 있는 주제에 대해 다룬다. 최적화는 고성능(High Performance)을 위한 방법이며 이는 우리가 추구하는 가장 큰 가치다. 엔터프라이즈 환경에서의 고성능은 주어진 하드웨어 자원을 최대한 활용하는 것을 의미하기도 한다.

그 중 메모리는 모든 설계 및 정책을 결정하는 가장 중요한 자원이다. 특히 인덱싱(요청된 URL을 빠르게 찾는 것)에 대해서는 반드시 이해해야 한다. 왜냐하면 서비스 품질을 결정짓는 것은 인덱싱이기 때문이다. 앞으로 설명할 모든 내용은 다음 표 "물리 메모리 크기에 따른 기본설정"와 관련이 있다.

Physical RAM System Free Contents Caching Count Sockets
1GB 409.60MB 188.37MB 219,469 5,000
2GB 819.20MB 446.74MB 520,494 10,000
4GB 1.60GB 963.49MB 1,122,544 20,000
8GB 3.20GB 2.05GB 2,440,422 20,000
16GB 6.40GB 4.45GB 5,303,733 20,000
32GB 12.80GB 9.25GB 11,030,356 20,000
64GB 25.60GB 18.85GB 22,483,603 20,000
128GB 51.20GB 38.05GB 45,390,095 20,000

Memory-Only 모드

Memory-Only 모드란 디스크를 이용하지 않고 컨텐츠를 메모리에만 적재하는 방식을 말한다. Storage 구성 을 하지 않으면 자동으로 Memory-Only모드로 동작한다.

# server.xml - <Server><Cache>

<Storage />

이 모드는 컨텐츠 크기가 제한된 LIVE 방송처럼 TTL (Time To Live) 이 짧고 컨텐츠 크기가 크지않은 경우 유용하다. 반대로 컨텐츠 크기가 GB단위로 크거나 TTL (Time To Live) 이 긴 서비스에서는 부적합하다.

주석

동적으로 변경이 불가능하다. 설정변경 후 반드시 서비스를 재가동해야 한다.

메모리 조절

STON 미디어 서버는 구동될 때 물리 메모리 크기에 기반하여 캐싱 메모리 사용량을 결정한다.

# server.xml - <Server><Cache>

<SystemMemoryRatio>100</SystemMemoryRatio>
  • <SystemMemoryRatio> (기본: 100) 물리메모리를 기준으로 사용할 메모리 비율을 설정한다.

예를 들어 8GB장비에서 <SystemMemoryRatio> 를 50으로 설정하면 물리 메모리가 4GB인 것처럼 동작한다. 이는 메모리를 점유하는 다른 프로세스와 같이 구동될 때 유용하게 사용될 수 있다.

좀 더 구체적으로 서비스 형식에 따라 메모리에 적재되는 데이터 비율을 조절하면 효과적이다.

# server.xml - <Server><Cache>

<ContentMemoryRatio>50</ContentMemoryRatio>
  • <ContentMemoryRatio> (기본: 50) STON이 사용하는 전체 메모리 중 서비스 데이터 메모리 적재비율을 설정한다.

예를 들어 4K UHD 영상처럼 파일개수는 적지만 컨텐츠 크기가 클 경우엔 이 수치를 늘리면 파일 I/O가 감소된다. 반대로 아주 작은 샘플 영상만 많은 경우는 반대로 줄이는 설정이 유용할 수 있다.

시스템 Free 메모리

OS(Operating System)가 느리면 어떠한 프로그램도 제 성능을 내지 못한다. STON 미디어 서버는 OS를 위해 일부 메모리를 사용하지 않는다. OS의 성능을 극대화하기 위해서이며 이를 시스템 Free메모리라 부른다.

주석

이에 대해 권위있는 설명을 제시하고 싶으나 아쉽게도 찾지 못하였다. 구글링을 통해 가장 많이 인용된 글 을 제시한다.

Physical RAM System Free
1GB 409.6MB
2GB 819.2MB
4GB 1.6GB
8GB 3.2GB
16GB 6.4GB
32GB 12.8GB
64GB 25.6GB
128GB 51.2GB

고급 사용자의 경우 서비스 형태에 맞추어 Free메모리 비율을 줄일 수 있다. Free메모리가 줄어들면 더 많은 Contents를 메모리에 적재할 수 있다.

# server.xml - <Server><Cache>

<SystemFreeMemoryRatio>40</SystemFreeMemoryRatio>
  • <SystemFreeMemoryRatio> (기본: 40, 최대: 40) 물리 메모리를 기준으로 설정된 비율만큼을 Free메모리로 남겨둔다.

TCP Segmentation Offload

중요

10G NIC를 사용한다면 TSO(TCP Segmentation Offload)를 OFF로 설정하길 권장한다.

TCP는 전송시 패킷을 분할(Segmentation)하는데, 이 작업을 CPU가 아닌 NIC가 수행하도록 설정하는 것이 TSO이다. (기본 값은 ON이다.) 하지만 10G NIC 서비스 환경에서 우리는 이와 관련된 많은 장애를 겪었다.

  • TCP 패킷 유실 및 지연
  • TCP 연결 종료
  • Load Average의 비정상적인 증가

결론적으로 TSO는 모두의 기대만큼 높은 성능을 내지 못하는 것으로 추정된다. (NIC만 1G로 바꿔도 이런 문제는 발생하지 않았다.) 결론적으로 TSO를 OFF로 설정함으로써 서비스는 정상화되었다. 이에 따른 CPU 사용량은 우려할 수준이 아니며 서비스 규모와 비례하는 정직한 지표를 보여 준다.

TSO 설정은 다음과 같이 설정/확인할 수 있다. (K의 대/소문자에 유의한다.)

# ethtool -K ethX tso off        // TSO OFF 설정
# ethtool -k ethX                // 설정 열람
...
tcp segmentation offload: on
...

클라이언트 접속 제한

제한없이 클라이언트 요청을 모두 허용하면 시스템에 지나친 부하가 발생할 수 있다. 시스템 과부하는 사실상 장애이다. 적절한 수치에서 클라이언트 요청을 거부하여 시스템을 보호한다.

# server.xml - <Server><Cache>

<MaxSockets Reopen="75">80000</MaxSockets>
  • <MaxSockets> (기본: 80000, 최대: 100000) 연결을 허용할 최대 클라이언트 소켓 수. 이 수치를 넘으면 신규 클라이언트 접속을 즉시 닫는다. <MaxSockets>Reopen (기본: 75%) 비율만큼 소켓 수가 감소하면 다시 접속을 허용한다.
_images/maxsockets.png

(기본 설정에서) 전체 클라이언트 소켓 수가 8만을 넘으면 신규 클라이언트 접속은 즉시 종료된다. 전체 클라이언트 소켓 수가 6만(8만의 75%)이 되면 다시 접근을 허용한다.

예를 들어 3만개의 클라이언트 세션을 처리할 때 원본 서버들이 모두 한계에 도달하면 이 수치를 3~4만 정도로 설정하는 것이 좋다. 이로 인해 얻을 수 있는 효과는 다음과 같다.

  • 별다른 Network 구성(e.g. L4 세션조절 등)이 필요 없다.
  • 불필요한(원본 부하로 처리될 수 없는) 클라이언트 요청을 방지한다.
  • 서비스의 신뢰성을 높인다. 서비스 Burst 이후 재시작 등 점검 작업이 필요 없다.

클라이언트 세션풀

클라이언트 연결을 처리하기 위한 초기/증설 세션 수를 설정한다. HLS/MPEG-DASH등 HTTP기반 프로토콜은 HTTP 클라이언트 세션 설정에 포함된다.

# server.xml - <Server><Cache>

<HttpClientSession>
   <Init>10000</Init>
   <TopUp>3000</TopUp>
</HttpClientSession>

<RtmpClientSession>
   <Init>10000</Init>
   <TopUp>3000</TopUp>
</RtmpClientSession>
  • <Init> STON 미디어 서버 시작 시 미리 생성해놓는 소켓 수
  • <TopUp> 생성해놓은 소켓 수를 초과했을 때 추가로 생성할 소켓 수

별도로 설정하지 않을 경우 물리 메모리 크기에 따라 자동으로 설정된다.

물리메모리 <Init>, <TopUp>
1GB 5천, 1천
2GB 1만, 2천
4GB 2만, 4천
8GB 이상 2만, 6천

제한적인 환경에서 적은 수의 소켓만으로도 서비스가 가능할 때 소켓 수를 줄이면 메모리를 절약할 수 있다.

Request hit ratio

먼저 클라이언트의 HTTP요청이 어떻게 처리되는지 이해해야 한다. 캐시처리 결과는 Squid와 동일하게 TCP_*로 명명되며 각 표현마다 캐시서버가 처리한 방식을 의미한다.

  • TCP_HIT 요청된 리소스(만료되지 않음)가 캐싱되어 있어 즉시 응답함.
  • TCP_IMS_HIT IMS(If-Modified-Since)헤더와 함께 요청된 리소스가 만료되지 않은 상태로 캐싱되어 있어 304 NOT MODIFIED로 응답함. TTLExtensionBy4xx, TTLExtensionBy5xx설정에 해당하는 경우에도 이에 해당함.
  • TCP_REFRESH_HIT 요청된 리소스가 만료되어 원본서버 확인(원본 미변경, 304 NOT MODIFIED) 후 응답함. 리소스 만료시간 연장됨.
  • TCP_REF_FAIL_HIT TCP_REFRESH_HIT과정 중 원본서버에서 확인이 실패(접속실패, 전송지연)한 경우 만료된 컨텐츠로 응답함.
  • TCP_NEGATIVE_HIT 요청된 리소스가 비정상적인 상태(원본서버 접속/전송 실패, 4xx응답, 5xx응답)로 캐싱되어 있고 해당상태를 응답함.
  • TCP_REDIRECT_HIT 서비스 허용/거부/Redirect 조건에 의해 Redirect를 응답함.
  • TCP_MISS 요청된 리소스가 캐싱되어 있지 않음(=최초 요청). 원본서버에서 가져온 결과를 응답함.
  • TCP_REF_MISS 요청된 리소스가 만료되어 원본서버 확인(원본 변경, 200 OK) 후 응답함. 새로운 리소스가 캐싱됨.
  • TCP_CLIENT_REFRESH_MISS 요청을 원본서버로 바이패스.
  • TCP_ERROR 요청된 리소스가 캐싱되어 있지 않음(=최초 요청). 원본서버 장애(접속실패, 전송지연, 원본배제)로 인해 리소스를 캐싱하지 못함. 클라이언트에게 500 Internal Error로 응답함.
  • TCP_DENIED 요청이 거부되었음.

이상을 종합하여 Request hit ratio계산 공식은 다음과 같다.

TCP_HIT + TCP_IMS_HIT + TCP_REFRESH_HIT + TCP_REF_FAIL_HIT + TCP_NEGATIVE_HIT + TCP_REDIRECT_HIT
------------------------------------------------------------------------------------------------
                                         SUM(TCP_*)

Byte hit ratio

클라이언트에게 전송한 트래픽(Client Outbound)대비 원본서버로부터 전송받은 트래픽(Origin Inbound)의 비율을 나타낸다. 원본서버 트래픽이 클라이언트 트래픽보다 높은 경우 음수가 나올 수 있다.

Client Outbound - Origin Inbound
--------------------------------
        Client Outbound

원본서버 장애상황 정책

고객이 언제든지 원본서버를 점검 할 수 있도록 하는 것이 개발팀의 목표다. 원본서버의 장애가 감지되면 해당 서버는 자동으로 배제되어 복구모드로 전환된다. 장애서버가 재가동되었더라도 정상 서비스 상태를 확인해야만 다시 투입한다.

만약 모든 원본서버의 장애를 감지한 경우 현재 캐싱된 컨텐츠로 서비스를 진행한다. TTL이 만료된 컨텐츠는 원본서버가 복구될 때까지 자동으로 연장된다. 심지어 Purge된 컨텐츠의 경우에도 원본서버에서 캐싱할 수 없다면 복구시켜 서비스에 문제가 없도록 동작한다. 최대한 클라이언트에게 장애상황을 노출해선 안된다는 정책이다. 완전 장애상황에서 신규 컨텐츠 요청이 들어오면 다음과 같은 에러 페이지와 이유가 명시된다.

_images/faq_stonerror.jpg

왠만하면 이런 화면은 보여주기 싫다.

시간단위 표현과 범위

기준 시간이 "초"인 항목에 대하여 문자열로 시간표현이 가능하다. 다음은 지원되는 시간표현 목록과 환산된 초(sec) 다.

표현 환산
year(s) 31536000 초 (=365 days)
month(s) 2592000 초 (=30 days)
week(s) 604800 초 (=7 days)
day(s) 86400 초 (=24 hours)
hour(s) 3600 초 (=60 mins)
minute(s), min(s) 60 초
second(s), sec(s), (생략) 1 초

다음과 같이 조합된 시간표현이 가능하다.

1year 3months 2weeks 4days 7hours 10mins 36secs

현재 지원대상은 다음과 같다.

  • Custom TTL의 시간표현
  • TTL의 Ratio를 제외한 모두
  • ClientKeepAliveSec
  • ConnectTimeout
  • ReceiveTimeout
  • BypassConnectTimeout
  • BypassReceiveTimeout
  • ReuseTimeout
  • Recovery의 Cycle속성
  • Bandwidth Throttling

디스크 Hot-Swap

서비스 중단없이 디스크를 교체한다. 파라미터는 반드시 <Disk> 설정과 같아야 한다.

http://127.0.0.1:20040/command/unmount?disk=...
http://127.0.0.1:20040/command/umount?disk=...

배제된 디스크는 즉시 사용되지 않으며 해당 디스크에 저장되었던 모든 컨텐츠는 무효화된다. 관리자에 의해 배제된 디스크의 상태는 "Unmounted"로 설정된다.

디스크를 서비스에 재투입하려면 다음과 같이 호출한다.

http://127.0.0.1:20040/command/mount?disk=...

재투입된 디스크의 모든 콘텐츠는 무효화된다.

SyncStale

(인덱싱시점과 성능상의 이유로) 비정상 서비스 종료시 관리자가 api-cmd-purge , api-cmd-expire , api-cmd-hardpurge 한 컨텐츠가 인덱싱에서 누락될 수 있다. 이를 보완하기 위해 API호출을 로그로 기록하여 서비스 재가동시 반영한다.

# server.xml - <Server><Cache>

<SyncStale>ON</SyncStale>
  • <SyncStale>
    • ON  (기본) 구동될 때 동기화한다.
    • OFF 무시한다.

로그는 ./stale.log에 기록되며 정상종료 또는 정기 인덱싱 시점에 초기화된다.

5부. 부록

Appendix A: Graph

모든 MRTG통계는 PNG포맷 그래프로 제공된다. 호출 규칙은 자원 뒤에 단위가 붙는 형식이다.

# 5가지의 CPU 그래프 (dash, day, week, month, year)
http://127.0.0.1:20040/graph/cpu_dash.png
http://127.0.0.1:20040/graph/cpu_day.png
http://127.0.0.1:20040/graph/cpu_week.png
http://127.0.0.1:20040/graph/cpu_month.png
http://127.0.0.1:20040/graph/cpu_year.png

모든 그래프는 5가지 타입으로 제공된다.

타입 크기 시간단위 기간
dash 205 X 175 5분 12시간
day 580 X 203 5분 2일 (48시간)
week 580 X 203 30분 2주 (14일)
month 580 X 203 2시간 7주
year 580 X 203 1일 18개월

한 그래프에는 최소 1개에서 최대 3개의 선이 그려진다. Main 라인은 녹색, Sub 라인은 파란색으로 그려진다. 또한 "Week" 그래프 이상부터는 Peak 라인이 제공된다. Peak 라인은 이전 단위에서 가장 큰 수치를 핑크색으로 그린다.

전역자원

전역자원 그래프는 시스템 상태 또는 STON 미디어 서버와 관련된 자원들에 대해 서비스한다. 아래 목록에서 *는 타입(dash, day, week, month, year) 중 한 가지를 의미한다.

CPU

/graph/cpu_*.png
  • Main Kernel + User
  • Sub Kernel

STON 미디어 서버 CPU

/graph/ston_media_server_cpu_*.png
  • Main Kernel + User
  • Sub Kernel

메모리

/graph/mem_*.png
  • Main 전체 사용량
  • Sub STON 미디어 서버 사용량

IO Wait

/graph/iowait_*.png
  • Main IO Wait

Load Average

/graph/loadavg_*.png
  • Main Load Average

서버소켓 이벤트

/graph/ssockevent_*.png

클라이언트와 STON 미디어 서버의 소켓연결 이벤트를 의미한다.

  • Main Accepted
  • Sub Closed

서버소켓 사용량

/graph/ssockusage_*.png

클라이언트와 STON 미디어 서버의 연결 수를 의미한다.

  • Main 전체
  • Sub Established

클라이언트소켓 이벤트

/graph/csockevent_*.png

STON 미디어 서버와 원본서버의 소켓연결 이벤트를 의미한다.

  • Main Connected
  • Sub Closed

클라이언트소켓 사용량

/graph/csockusage_*.png

STON 미디어 서버와 원본서버의 연결 수를 의미한다.

  • Main 전체
  • Sub Established

차단된 IP접근

/graph/acldenied_*.png
  • Main 차단된 클라이언트

이벤트 큐

/graph/eq_*.png
  • Main 이벤트 큐 길이

TCP소켓

/graph/tcpsocket_*.png
_images/graph_tcpsocket_detail.png

가상호스트

가상호스트 그래프는 전체 또는 개별 가상호스트의 상태에 대해 서비스한다. vhost파라미터를 이용하여 특정 가상호스트를 지정할 수 있으며, 생략된 경우 전체 가상호스트의 합을 제공한다.

http://127.0.0.1:20040/graph/vhost/mem_day.png?vhost=www.example.com

원본/클라이언트 트래픽의 경우 프로토콜별 그래프가 제공된다. 프로토콜 변수는 protocol 로 지정한다.

http://127.0.0.1:20040/graph/vhost/client_traffic_*.png?vhost=www.example.com&protocol=all

protocol 의 값은 all (기본) , rtmp , http , hls , mpegdash 중 선택할 수 있다. 프로토콜별 그래프를 지원하는 경우 소제목 옆에 지원 프로토콜을 을 명시한다.

아래 목록에서 *는 타입(dash, day, week, month, year) 중 한 가지를 의미한다.

콘텐츠개수

/graph/vhost/filecount_*.png
_images/graph_filecount_detail.png

콘텐츠 메모리

/graph/vhost/mem_*.png
  • Main 메모리에 적재된 콘텐츠 데이터량

히트율 all rtmp http hls mpegdash

/graph/vhost/hitratio_*.png
  • Main Request Hit Ratio
  • Sub Byte Hit Ratio

클라이언트 세션 all rtmp http hls mpegdash

/graph/vhost/client_session_*.png
  • Main 전체 클라이언트 세션
  • Sub 전송 진행 중인 클라이언트 세션

클라이언트 트래픽 all rtmp http hls mpegdash

/graph/vhost/client_traffic_*.png
  • Main Inbound
  • Sub Outbound

클라이언트 응답 all rtmp http hls mpegdash

/graph/vhost/client_res_*.png
  • Main 클라이언트 응답횟수
  • Sub 클라이언트 요청횟수

클라이언트 트랜잭션 http hls mpegdash

/graph/vhost/client_res_complete_*.png
  • Main 완료된 클라이언트 응답횟수
  • Sub 클라이언트 요청횟수

클라이언트 응답시간 all rtmp http hls mpegdash

/graph/vhost/client_res_time_*.png
  • Main 클라이언트 요청에 대한 응답시간

클라이언트 완료시간 http hls mpegdash

/graph/vhost/client_res_complete_time_*.png
  • Main 클라이언트 요청에 대한 트랜잭션 완료시간

클라이언트 캐싱응답 all rtmp http hls mpegdash

/graph/vhost/client_res_hit_*.png
_images/graph_filehit.png

클라이언트 상세응답 rtmp http hls mpegdash

/graph/vhost/client_http_res_detail_*.png
/graph/vhost/client_hls_res_detail_*.png
/graph/vhost/client_mpegdash_res_detail_*.png
_images/graph_rescode_detail.png
/graph/vhost/client_rtmp_res_detail_*.png
_images/sms_rtmp_graph_detail.png

원본서버 세션 all http hls mpegdash

/graph/vhost/origin_session_*.png
  • Main 전체 원본 세션
  • Sub 전송 진행 중인 원본 세션

원본서버 트래픽 all http hls mpegdash

/graph/vhost/origin_traffic_*.png
  • Main Inbound
  • Sub Outbound

원본서버 응답 all http hls mpegdash

/graph/vhost/origin_res_*.png
  • Main 원본 응답횟수
  • Sub 원본 요청횟수

원본서버 트랜잭션 http hls mpegdash

/graph/vhost/origin_res_complete_*.png
  • Main 완료된 원본서버 응답횟수
  • Sub 원본서버 요청횟수

원본서버 응답시간 http hls mpegdash

/graph/vhost/origin_res_time_*.png
  • Main 원본서버에 보낸 요청에 대한 응답시간

원본서버 완료시간 http hls mpegdash

/graph/vhost/origin_res_complete_time_*.png
  • Main 원본서버에 보낸 요청에 대한 트랜잭션 완료시간

원본서버 상세응답 http hls mpegdash

/graph/vhost/origin_http_res_detail_*.png
/graph/vhost/origin_hls_res_detail_*.png
/graph/vhost/origin_mpegdash_res_detail_*.png
_images/graph_rescode_detail.png

Appendix B: 릴리스 노트

v20

v20.03.0 (2020.03.04)

v20.01.0 (2020.01.21)

버그수정

  • Apple HLS - Audio가 아주 작은 영상을 TS로 변환 할 경우 비정상 종료 되는 문제 수정

v17

v17.11.0 (2017.11.13)

기능개선/정책변경

  • AAC 확장자 지원

버그수정

v17.10.0 (2017.10.24)

  • HTTP OPTIONS Method 지원

버그수정

  • 설정이 정상적으로 백업되지 않을 때 SNMP 관련 설정이 반영되지 않던 문제 수정
  • Packetizing - 캐싱된 MP3 콘텐츠가 갱신될 경우 비정상 종료되는 문제 수정

v17.09.0 (2017.9.11)

v17.07.0 (2017.7.31)

v17.04.0 (2017.4.17)

기능개선/정책변경

버그수정

  • 낮은 확률로 로그 정리 시 비정상 종료 되는 증상
  • 낮은 확률로 404응답이 메모리에서 Swap 될 때 비정상 종료 되는 문제
  • 로그 압축 기능 사용시 로그가 일부 누락 될 수 있는 문제
  • 시스템 시간 변경 시 5분 통계가 1시간 동안 누락되는 문제
  • 12장. WM (Web Management)
    – User-Agent 값을 STON Media Server가 아니라 STON으로 기록하던 문제 – HTTP Listen을 OFF로 설정 할 경우 적용 되지 않는 문제

v17.02.0 (2017.2.24)

  • STON 미디어 서버 공식 릴리스