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 성능 테스트 리포트이다.
![]()
저화질(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 캐싱엔진을 통해 재활용되어 성능이 극대화된다.
![]()
단 1번만 Packetizing된다.
가상호스트를 통해 VOD와 LIVE 서비스를 통합하여 운영/모니터링할 수 있다.
![]()
캐싱을 통해 전송능력이 극대화된다.
2장. 서버구성과 설치¶
이 장에서는 시스템 구성/설치 그리고 예제 가상호스트까지 구성해본다 텍스트 편집기만 있으면 누구나 할 수 있다.
STON 미디어 서버는 표준 Linux 서버에서 동작하도록 개발되었다. 개발 단계부터 HW뿐만 아니라 OS, 파일시스템 등 종속성을 가질 수 있는 요소는 최대한 배제하였다. 고객이 합리적인 장비를 선택할 수 있도록 돕는 것은 매우 중요하다. 왜냐하면 서비스의 특성과 규모에 따라 적절한 서버를 구성하는 것이 서비스의 시작이기 때문이다.
서버 구성¶
CPU, 메모리, 디스크 자원에 대해 고려해야 한다.
CPU
코어가 많을수록 더 많은 미디어에 대한 동시처리가 가능하다. 8코어 이상을 추천한다.
메모리
메모리-인덱싱 방식을 사용하므로 8GB이상을 권장한다. 자주 요청되는 파일은 항상 메모리에 상주하지만 그렇지 않은 파일은 디스크에서 로딩한다. 따라서 파일이 많고 집중도가 낮다면(Long-tail) 디스크 부하 증가로 성능이 저하될 수 있다. 파일 크기가 커서 디스크 I/O 부하가 높다면 메모리를 증설하거나 SSD를 선택하는 것이 좋은 옵션이 될 수 있다.
디스크
OS를 포함하여 최소 3개 이상을 권장한다. 디스크 역시 많으면 많을수록 많은 파일을 캐싱할 수 있을뿐만 아니라 I/O부하도 분산된다.
항상 OS와 STON은 콘텐츠와 별도의 디스크로 구성한다.
일반적으로 OS가 설치된 디스크에 STON을 설치한다. 로그 역시 같은 디스크에 구성하는 것이 일반적이다. 로그는 서비스 상황을 실시간으로 기록하기 때문에 항상 Write부하가 발생한다.
STON 미디어 서버는 디스크를 RAID 0처럼 사용한다. 성능과 RAID의 상관여부는 고객 서비스 특성에 따라 달라진다. 하지만 파일 변경이 빈번하지 않고 콘텐츠의 크기가 물리적 메모리 크기보다 훨씬 큰 경우 RAID를 통한 Read속도 향상이 효과적일 수 있다.
OS 구성¶
가장 기본적인 형태로 설치한다. 표준 64bit Linux 배포판(Cent 6.2이상, Ubuntu 10.04이상) 이라면 정상동작한다. 패키지 의존성을 가지지 않는다.
설치¶
최신버전의 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]
압축을 해지한다.
[root@localhost ~]# tar -zxf STONMediaServer.1.0.0.rhel.2.6.32.x64.tar.gz
설치 스크립트를 실행한다.
[root@localhost ~]# ./STONMediaServer.1.0.0.rhel.2.6.32.x64.sh
설치과정은 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@winesoft.co.kr 로 전송
- 확인절차 후 발급
라이선스 파일(license.xml)이 반드시 설치경로에 존재해야 STON 미디어 서버가 정상적으로 구동된다.
업데이트¶
최신버전이 배포되면 stonu명령어로 업데이트할 수 있다.
./stonmu 1.1.0
또는 12장. WM (Web Management) 의 최신버전 업데이트 를 통해 간편하게 업데이트를 진행할 수 있다.
실행하기¶
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)로 나뉜다.
![]()
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
속성이 적용된다.Admin
모든 API호출이 가능하다.User
api_monitoring , Appendix A: Graph API만 호출할 수 있다.Looker
Appendix A: Graph API만 호출할 수 있다.
기타 다음과 같은 자잘한 관리목적의 속성을 가진다.
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하여 서비스 품질을 향상시킨다. 서비스 형태에 따라 이 비율을 조절하여 품질을 최적화한다.
ContentMemoryRatio를 통해 메모리비율을 설정한다.
예를 들어 4K 고화질 영상처럼 파일 Contents크기가 큰 서비스의 경우 File I/O 부하가 부담스럽다. 이런 경우
<ContentMemoryRatio>
를 높여서 보다 많은 Contents데이터가 메모리에 상주할 수 있도록 설정하면 서비스 품질을 높일 수 있다.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보다 큰 경우, 일정 기간동안 한번도 접근되지 않은 콘텐츠를 삭제한다. 디스크를 미리 확보하여 서비스 시간 중 디스크 부족이 발생할 확률을 줄이기 위함이다.
<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>
을 상속받는다.
![]()
별도로 명시하지 않은 설정은 <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 하여 재생이 실패하게 된다.
따라서 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에 * 표현을 하나만 붙일 수 있는 간단한 형식만을 지원한다.
가상호스트 검색 순서는 다음과 같다.
<Vhost>
의Name
과 일치하는가?- 명시적인
<Alias>
와 일치하는가? - 패턴
<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>
설정
HTTP 클라이언트 요청에 "Connection: Close"로 명시되어 있는 경우
GET / HTTP/1.1 ...(생략)... Connection: Close
이같은 요청에 대해서는 가상호스트 설정여부와 상관없이 "Connection: Close"로 응답한다. Keep-Alive헤더는 명시되지 않는다.
HTTP/1.1 200 OK ...(생략)... Connection: Close
이 HTTP 트랜잭션이 완료되면 HTTP 연결을 종료한다.
<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
<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
<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
<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
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)로 구성되어 있다.

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

최적화된 대역폭 활용
# 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-2 와 ISO 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헤더의 존재 유무에 따라 다른 콘텐츠가 캐싱될 수 있다. 원본서버에 요청을 보내는 시점에 압축여부를 알 수 없다. 응답을 받았다고해도 압축여부를 매번 비교할 수도 없다.
![]()
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전송방식이다.

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 사용여부.ON.
<AlternatesName>
에서 TS목록을 서비스한다.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
- STON Media Server : 최초 로딩 (아무 것도 캐싱되어 있지 않음.)
- HTTP/HLS Client : HTTP Range 요청 (100번째 파일의 최초 500KB 요청)
- STON Media Server : /trip.mp4 파일 캐싱객체 생성
- STON Media Server : /trip.mp4 파일 분석을 위해 필요한 부분만을 원본서버에서 다운로드
- STON Media Server : 100번째(99.ts)파일 서비스를 위해 필요한 부분만을 원본서버에서 다운로드
- STON Media Server : 100번째(99.ts)파일 생성 후 Range 서비스
- 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)는 다음 요소들에 의해 어떻게 사용될지 결정된다.
- 원본서버 주소 형식(IP 또는 Domain)과 보조주소
- 장애감지와 복구
- Health-Checker
서비스를 운영하다보면 원본주소가 배제/복구되는 일은 빈번하다. 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 (기본: /)
요청을 보낼 UriResCode (기본: 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 미디어 서버)는 원본파일 그대로가 아닌 모듈에 의해 변조된 파일을 서비스 받는다.
![]()
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를 줄 수 있다.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-customttlcc_maxage
원본이 Cache-Control에 maxage를 명시한 경우rescode
원본 응답코드별 기본 TTL
대소문자 구분¶
원본서버의 대소문자 구분여부를 능동적으로 알 수 없다.
![]()
아마도 같은 콘텐츠이거나 404가 발생한다.
# server.xml - <Server><VHostDefault><Options>
# vhosts.xml - <Vhosts><Vhost><Options>
<CaseSensitive>ON</CaseSensitive>
<CaseSensitive>
ON (기본)
URL 대소문자를 구문한다.OFF
URL 대소문자를 구분하지 않는다. 모두 소문자로 처리된다.
QueryString 구분¶
QueryString에 의하여 동적으로 생성되는 콘텐츠가 아니라면 QueryString을 인식하는 것은 불필요하다. 아무 의미없는 Random값이나 항상 변하는 시간 값이 매번 붙는다면 원본에 엄청난 부하가 발생할 수 있다.
![]()
동적 콘텐츠가 아니라면 같은 콘텐츠일 가능성이 높다.
# 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
파일 URIAccept-Encoding
("Y" or "N") Accept-Encoding을 지원한다면 "Y"RefCount
파일참조 카운트Size
(Bytes) 파일크기Disk-Index
(0부터 시작) 저장된 디스크 인덱스FID
파일 IDLocalPath
로컬 경로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 TypeLastModifiedTime
(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이 생성한 ETagCustomTTL
커스텀 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=...
기타설정¶
관리자는 다음과 같이 몇가지 동작방식에 대해 설정할 수 있다.
# 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 로 처리하도록 설정하면 과도한 원본부하를 방지할 수 있다.
<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 modeIOWait
waiting for I/O to completeIRQ
servicing interruptsSoftIRQ
servicing softirqsSteal
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
원본서버에서 먼저 연결을 종료한 총 회수
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 결과
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]
를 부여 받는다.[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을 넘을 수 없다.

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

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
클라이언트 IPdeny
차단조건
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
원본서버 IPcs-method
STON이 원본서버에게 보낸 HTTP Methodcs-uri
STON이 원본서버에게 보낸 URItime-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>
<OriginErrorLog>
의SysLog
속성을ON
으로 설정한다.<OriginErrorLog>
의 하위에<SysLog>
태그를 생성한다. n대의 서버로 동시에 전송가능하다.<SysLog>
의Priority
속성을 설정한다. 이 표현은 syslog의 Facility Levels 과 Severity levels 의 조합으로 구성한다.<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
대상 Domainttl
레코드 유효시간(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
서버 IPcs-method
HTTP 클라이언트가 보낸 HTTP Methodcs-uri-stem
HTTP 클라이언트가 보낸 URL중 QueryString을 제외한 부분cs-uri-query
HTTP 클라이언트가 보낸 URL중 QueryStrings-port
서버 포트cs-username
HTTP 클라이언트 usernamec-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-status
와 sc-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
클라이언트 IP192.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
HostNameexample.com
%...H
요청 프로토콜http 또는 https
%...{foobar}i
서버가 수신한 요청에서 foobar: 헤더의 내용%{User-Agent}i 로 입력 할 경우 User-Agent의 값을 기록
%...m
요청 MethodGET 또는 POST 또는 HEAD
%...P
Server PORT80
%...q
QueryStringId=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-ID1
%...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 클라이언트 IPs-ip
서버 IPs-port
서버 포트x-app
가상호스트Name
중 디렉토리. 없는 경우 - 로 기록cs-uri-stem
RTMP 클라이언트가 보낸 URL중 QueryString을 제외한 부분cs-uri-query
RTMP 클라이언트가 보낸 URL중 QueryStringcs(Referrer)
RTMP 클라이언트가 보낸 RTMP Referercs(User-Agent)
RTMP 클라이언트가 보낸 RTMP User-Agentx-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
고유한 세션 IDx-message-status
메시지 전송이 완료된 세션인 경우 c, 완료되지 않고 세션이 종료되면 xx-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]로 시작하는 에러 로그가 기록된다. 모든 필드는 공백으로 구분되며 각 필드의 의미는 다음과 같다.

원본 시간측정 구간
date
HTTP 트랜잭션이 완료된 날짜time
HTTP 트랜잭션이 완료된 시간cs-sid
세션의 고유ID. 같은 세션을 통해 처리된(재사용된) HTTP 트랜잭션은 같은 값을 가진다.cs-tcount
트랜잭션 카운트. 이 HTTP 트랜잭션이 현재 세션에서 몇 번째로 처리된 트랜잭션인지 기록한다. 같은cs-sid
값을 가지는 트랜잭션이라면 이 값은 중복될 수 없다.c-ip
STON의 IPcs-method
원본서버에게 보낸 HTTP Methods-domain
원본서버 도메인cs-uri
원본서버에게 보낸 URIs-ip
원본서버 IPsc-status
원본서버 HTTP 응답코드cs-range
원본서버에게 보낸 Range요청 값sc-sock-error
소켓 에러코드(1=전송실패, 2=전송지연, 3=연결종료)sc-http-error
원본서버가 4xx 또는 5xx응답을 줬을 때 응답코드를 기록sc-content-length
원본서버가 보낸 Content Lengthcs-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 미디어 서버의 동작을 구성한다.

WM은 STON 미디어 서버의 설정파일과 API를 사용한다.
우리는 이와 유사한 방식으로 WM을 능가하는 더 나은 관리기법이 존재할 것이라 생각한다.
접속¶
WM은 9500
포트를 사용한다. 설치된 STON 미디어 서버의 IP가 192.168.0.100이라면
WM접근 주소는 http://192.168.0.100:9500이 된다.
앞서 언급한 대로 httpd.conf 파일을 변경하면 다른 포트로 변경할 수 있다.

WM 접속초기화면
계정¶
기본 계정은 [아이디: admin , 비밀번호: ston ] 이다. 로그인에 성공하면 STON 미디어 서버의 전반적인 상태를 확인할 수 있는 대쉬보드 페이지가 나타난다.

WM 대쉬보드
최신버전 업데이트¶
최신버전이 릴리스되면 탑 메뉴 우측에 "새로운 업데이트가 있습니다" 메시지가 표시된다.

메시지를 클릭하시면 최신버전으로 업데이트할 수 있는 페이지가 표시된다. 현재 서비스 상태에 따라 업데이트 안전도 여부가 표시된다.

WM 업데이트하면 안전합니다.
업데이트가 완료되면 모든 서비스가 자동으로 재시작 된다.
메뉴 구성¶
메뉴는 Mouse-Click에 따라 확장/축소가 되는 Drop Down메뉴로 구성된다.

WM 메뉴
전역설정
전역설정(server.xml)에서 가상호스트 기본설정을 제외한 모든 기능을 설정한다.
가상호스트 관리
가상호스트의 추가/중지/삭제를 할 수 있으며 서비스 중인 모든 가상호스트 상태를 한눈에 볼 수 있다.
클러스터
클러스터를 구성/관리/파괴할 수 있으며 같은 클러스터의 모든 서비스를 서버별, 서비스별로 볼 수 있다.
컨텐츠제어
Purge와 같이 서비스 중인 컨텐츠에 대하여 제어할 수 있다.
서버 상태
시스템 상태와 같은 전역자원을 모니터링 한다. 모든 Graph는 전역자원 Graph를 사용한다.
서비스 상태
가상호스트의 서비스 상태를 모니터링 한다. 모든 Graph는 가상호스트 Graph를 사용한다.
가상호스트 관리¶
가상호스트를 추가/삭제/수정할 수 있다. 모든 가상호스트는 따로 명시적으로 설정을 변경하지 않는 이상 Default 가상호스트 의 설정을 사용한다.
신규¶
새롭게 서비스할 가상호스트를 생성한다. 클러스터가 설정되어 있는 경우 모든 서버에 가상호스트를 동시생성 할 수 있다.
모든 가상호스트는 Default 가상호스트 를 상속받으므로 가상호스트명과 원본서버 주소만 설정하면 곧바로 서비스 투입이 가능하다. 여러 개의 하위 설정이 있으며 펼쳐보기 버튼을 눌러 상세 설정으로 확장할 수 있다.

WM 가상호스트 관리 - 신규
목록¶
서비스 중인 모든 가상호스트 상태를 모니터링할 수 있다. 가상호스트별로 시작/중지가 가능하다. 클러스터가 설정되어 있다면 모든 서버의 가상호스트를 동시에 제어할 수 있다. 또한 기본가상호스트를 선택할 수 있다.

WM 가상호스트 관리 - 목록
상세설정¶
기본 가상호스트(VHostDefault)와 개별 가상호스트에 대해 설정한다. 좌측상단의 콤보박스를 선택하여 가상호스트를 선택할 수 있다. Default 가상호스트 는 모든 가상호스트가 상속받는 기본 설정이다. 그러므로 별도로 재정의(Overriding)하지 않은 설정의 경우 Default 가상호스트 의 설정이 반영된다.

WM 가상호스트 설정 - 상단메뉴
위 그림처럼 가상호스트에서 설정할 수 있는 세부메뉴가 제공되며 현재 선택된 세부메뉴가 붉은 색으로 표시된다. 모든 설정은 "적용" 또는 "Cluster전체적용" 버튼을 눌러야 반영된다.

WM 가상호스트 설정 - 원본서버
여기서 설정하는 거의 모든 항목은 재정의될 수 있는 설정이므로 이에 대한 명확한 이해가 필요하다. ( 가상호스트 기본설정 예제 참조)
WM에서는 색으로 재정의를 구분한다.
기본 가상호스트의 설정을 그대로 사용하는 경우 흰색
배경으로 표시된다.
재정의된 값은 살구색
으로 표시되어 기본값과 구분된다.
모든 재정의 설정의 우측에는 X
버튼이 제공된다.
이 버튼을 클릭하여 재정의를 해지한다.
클러스터¶
여러 대의 STON 미디어 서버를 하나의 클러스터로 통합하여 일괄적으로 관리/운영할 수 있다. 모든 STON 미디어 서버는 동등한 관계로 설정되기 때문에 클러스터에 포함된 어떤 STON 미디어 서버로 로그인 하여도 클러스터 전체를 관리할 수 있다.
구성¶
클러스터를 생성하거나 이미 존재하는 클러스터에 다른 서버를 추가할 수 있다. 클러스터 추가에는 WM계정의 인증절차가 필요하다. 만약 같은 계정(아이디와 비밀번호)으로 WM이 구성되어 있다면 인증절차는 생략된다.

신규 클러스터 생성

클러스터 목록
클러스터가 구성되면 가상호스트 관리시 "Cluster전체적용" 버튼으로 일괄설정이 가능하다. 또한 클러스터에 소속된 서버끼리 간편하게 모든 설정을 복제할 수 있다. 특정 서버를 다른 클러스터에 참여시키고 싶으면 탈퇴 후 재구성해야 한다.
전용 포트분리¶
최초 설치시 WM과 클러스터 포트가 같은 포트를 사용한다. 이 방식은 WM계정만으로 클러스터링 구성이 가능하다는 장점이 있지만 접근 IP를 제한하는 환경에서는 문제가 될 수 있다.
- 보안상의 이유로 WM을 일부 IP에서만 접근되도록 제한한다.
- 클러스터링을 위해서는 모든 서버들이 서로 다른 서버들의 IP를 허가해주어야 한다.
- (CDN 처럼) 서버 수가 매우 많거나 서버들의 IP가 유동적인 경우 IP목록을 작성할 수 없다.
클러스터 포트를 분리하여 이 문제를 해결할 수 있다. 서버들끼리 신원은 WM 계정이 아닌 라이선스를 통해 확인된다. 같은 라이선스를 가진 서버들끼리만 클러스터가 가능해져 보안성이 높아진다.
1. [Apache 서버] httpd.conf 멀티 Port설정
(기본 설치라면) /usr/local/StonMediaServer/wm/conf/httpd.conf 파일을 열어 다음과 같이 포트를 추가한다.

저장 후 반영을 위해 Apache서버를 재시작한다.
2. [WM] 클러스터 구성
정상적으로 멀티포트 구성이 되었다면 다음과 같이 "클러스터 포트 분리" 버튼이 생성된다.

버튼을 클릭한다.
3. [WM] 클러스터 포트선택
분리할 수 있는 포트 목록을 보여준다. 포트를 선택해 구성한다.

클러스터링에 포함되는 모든 서버는 반드시 같은 포트를 사용해야 한다.
서버 상태¶
클러스터에 소속된 모든 STON 미디어 서버의 상태와 서비스 현황을 확인할 수 있다. 서버 목록을 구성하는 각 항목을 클릭하면 보다 상세한 정보를 확인할 수 있다.

서버별 상태
가상호스트 상태¶
클러스터에서 서비스하는 모든 가상호스트의 MRTG를 종합하여 확인할 수 있다. 클러스터의 모든 가상호스트를 동시에 시작/중지할 수 있다. 가상호스트 목록을 구성하는 각 항목을 클릭하면 보다 상세한 정보를 확인할 수 있다.

가상호스트 서비스별 상태
컨텐츠 제어¶
서비스 중인 컨텐츠를 열람/제어하거나 클린업을 수행할 수 있다. 클러스터 구성이 되어있다면 모든 STON 미디어 서버의 컨텐츠를 동시에 열람하거나 제어할 수 있다.

Caching상태 확인

Purge등 API호출
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파일이다.

완전한 형태의 파일이 제공된다.
추출된 구간은 별도의 파일로 인식되기 때문에 200 OK로 응답된다. 그러므로 다음과 같이 Range헤더가 명시된 경우 추출된 파일로부터 Range를 계산하여 206 Particial Content 로 응답한다.

일반적인 Range요청처럼 처리된다.
구간추출 파라미터가 QueryString 표현을 사용하기 때문에 자칫 QueryString 구분 과 헷갈릴 수 있다.
<ApplyQueryString>
설정이 ON
인 경우 클라이언트가 요청한 URL의 QueryString이 모두 인식되지만 StartParam
과 EndParam
은 제거된다.
GET /bar/mp4:trip.mp4?start=30&end=100
GET /bar/mp4:trip.mp4?tag=3277&start=30&end=100&date=20130726
예를 들어 위와 같이 StartParam
이 start 로 EndParam
이 end 로 입력된 경우
이 값들은 구간을 추출하는데 쓰일 뿐 Caching-Key를 생성하거나 원본서버로 요청을 보낼 때는 제거된다.
각각 다음과 같이 인식된다.
GET /bar/mp4:trip.mp4
GET /bar/mp4:trip.mp4?tag=3277&date=20130726
Multi-Trimming¶
시간 값을 기준으로 복수로 지정된 구간을 하나의 영상으로 추출한다.

/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-Trimming 은 Trimming 보다 우선한다. QueryString에 Multi-Trimming 키가 명시되어 있다면 Trimming 키는 무시된다.
14장. 가상호스트 고급기법¶
이 장에서는 가상호스트를 활용하여 서비스를 유연하게 구성하는 여러 기법에 대해 설명한다.
가상호스트는 보통 원본(Domain 또는 IP목록)과 1:1로 구성되는 것이 기본이다. 하지만 상황에 따라 대표 가상호스트를 여러 하위 가상호스트로 분기하거나, 반대로 독립적인 여러 가상호스트를 하나의 서비스로 포장해야 하는 경우도 발생한다. 각 기능에 따라 monitoring_stats_vhost_client / admin-log-access 의 정책이 다를 수 있음을 유의해야 한다.
Facade 가상호스트¶
<Alias>
는 가상호스트의 별명만을 추가하는 것이므로 통계와 로그가 분리되지 않는다.
가상호스트는 공유하지만 도메인에 따라 monitoring_stats_vhost_client 와 admin-log-access 를 분리하고 싶은 경우 Facade가상호스트를 설정한다.

Facade는 통계와 로그만 수집한다.
# vhosts.xml - <Vhosts>
<Vhost Name="example.com">
...
</Vhost>
<Vhost Name="another.com" Status="facade:example.com">
...
</Vhost>
Status
속성의 값을 facade:
+ 가상호스트
로 설정한다.
예제의 경우 monitoring_stats_vhost_client 와 admin-log-access 는 example.com이 아닌 클라이언트가 요청한 도메인인 another.com으로 수집된다.
Sub-Path 지정¶
한 가상호스트에서 경로에 따라 다른 가상호스트가 처리하도록 설정할 수 있다.

통계/로그는 요청을 최종처리한 각각의 가상호스트에 기록된다.
# 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헤더를 추적하여 콘텐츠를 요청한다.
![]()
클라이언트는 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-2 와
ISO 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%)
비율만큼 소켓 수가 감소하면 다시 접속을 허용한다.

(기본 설정에서) 전체 클라이언트 소켓 수가 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된 컨텐츠의 경우에도 원본서버에서 캐싱할 수 없다면 복구시켜 서비스에 문제가 없도록 동작한다. 최대한 클라이언트에게 장애상황을 노출해선 안된다는 정책이다. 완전 장애상황에서 신규 컨텐츠 요청이 들어오면 다음과 같은 에러 페이지와 이유가 명시된다.

왠만하면 이런 화면은 보여주기 싫다.
시간단위 표현과 범위¶
기준 시간이 "초"인 항목에 대하여 문자열로 시간표현이 가능하다. 다음은 지원되는 시간표현 목록과 환산된 초(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) 중 한 가지를 의미한다.
가상호스트¶
가상호스트 그래프는 전체 또는 개별 가상호스트의 상태에 대해 서비스한다. 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) 중 한 가지를 의미한다.
히트율 all
rtmp
http
hls
mpegdash
¶
/graph/vhost/hitratio_*.png
Main
Request Hit RatioSub
Byte Hit Ratio
클라이언트 세션 all
rtmp
http
hls
mpegdash
¶
/graph/vhost/client_session_*.png
Main
전체 클라이언트 세션Sub
전송 진행 중인 클라이언트 세션
클라이언트 트랜잭션 http
hls
mpegdash
¶
/graph/vhost/client_res_complete_*.png
Main
완료된 클라이언트 응답횟수Sub
클라이언트 요청횟수
클라이언트 완료시간 http
hls
mpegdash
¶
/graph/vhost/client_res_complete_time_*.png
Main
클라이언트 요청에 대한 트랜잭션 완료시간
클라이언트 상세응답 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

/graph/vhost/client_rtmp_res_detail_*.png

원본서버 트랜잭션 http
hls
mpegdash
¶
/graph/vhost/origin_res_complete_*.png
Main
완료된 원본서버 응답횟수Sub
원본서버 요청횟수
원본서버 완료시간 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

Appendix B: 릴리스 노트¶
v20¶
v17¶
v17.10.0 (2017.10.24)¶
- HTTP OPTIONS Method 지원
버그수정
- 설정이 정상적으로 백업되지 않을 때 SNMP 관련 설정이 반영되지 않던 문제 수정
- Packetizing - 캐싱된 MP3 콘텐츠가 갱신될 경우 비정상 종료되는 문제 수정
v17.09.0 (2017.9.11)¶
- Apple HLS - MP4 Tracks을 QueryString을 통해 선택적으로 Packetizing 한다.
v17.07.0 (2017.7.31)¶
- Apple HLS - MP4 Tracks(오디오 또는 비디오)를 선택적으로 Packetizing 한다.
- HEVC/H.265를 지원한다.
- Memory-Only 모드 를 지원한다.
v17.04.0 (2017.4.17)¶
기능개선/정책변경
- Apple HLS
Packetizing – 시간값(PCR, PTS, DTS)계산식 변경을 통한 플레이어 호환성 강화
- Packetizing – 분석과정 오류가 발생할 경우 정책 수정
- Before. 404 Not Found 응답After. 분석된 지점까지 서비스
원본 통계 추가
MPEG-DASH - 클라이언트/원본 통계 추가
- 12장. WM (Web Management)
- Adobe RTMP - 예제 URL 추가
- Apple HLS - 원본 통계 추가
- MPEG-DASH - 클라이언트/원본 통계 추가
버그수정
- 낮은 확률로 로그 정리 시 비정상 종료 되는 증상
- 낮은 확률로 404응답이 메모리에서 Swap 될 때 비정상 종료 되는 문제
- 로그 압축 기능 사용시 로그가 일부 누락 될 수 있는 문제
- 시스템 시간 변경 시 5분 통계가 1시간 동안 누락되는 문제
- 12장. WM (Web Management)
- – User-Agent 값을 STON Media Server가 아니라 STON으로 기록하던 문제 – HTTP Listen을 OFF로 설정 할 경우 적용 되지 않는 문제
v17.02.0 (2017.2.24)¶
- STON 미디어 서버 공식 릴리스