X-PUSH Monitoring Server
운영자가 콘솔 및 스크립트를 통하여 X-PUSH의 모니터링 및 관리가 가능한 서비스입니다.
모니터링 서버 사용법
X-PUSH 서버의 동작을 모니터링하기 위한 2가지 방식을 제공하고 있습니다.
console (telnet)
script (batch, shell)
console (telnet) 사용법
telnet 접속
명령 프롬프트 (cmd) 에서 telnet X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) 를 입력합니다.
telnet 로그인
$XPUSH_HOME/conf/user.properties 의 id, pw 를 참고하여 로그인합니다.
[telnet] show status
show status : 현재 서버의 상태를 가져와서 출력하는 명령어입니다.
[telnet] show clients
show clients : 현재 서버에 접속한 전체 client 정보 (userId, ip, projectId, topicType, topicId) 를 출력하는 명령어입니다.
[telnet] show client [userID]
show client [userID] : 현재 서버에 접속한 client 중 입력받은 userID 와 일치하는 client 정보를 출력하는 명령어입니다.
[telnet] show client (userID, projectID, topicType, topicId)
show client (Enter key) : 현재 서버에 접속한 client 중 4가지 조건 (userId, projectId, topicType, topicId) 으로 세부검색된 결과를 출력하는 명령어입니다.
[telnet] save clients
save clients : 현재 서버에 접속한 전체 client 정보 (userId, ip, projectId, topicType, topicId) 를 json file 로 저장하는 명령어입니다.
-> $XPUSH_HOME 에 clientInfo 폴더가 생성되고 폴더 내부에 생성시각이 포함된 이름의 json file 이 생성됩니다.
[telnet] help
help : 명령어에 대한 도움말이 필요할 때, 사용하는 명령어입니다.
[telnet] invalid command : 잘못된 명령어 입력 시, 출력되는 문구입니다.
[telnet] no data : 해당하는 조건에 일치하는 검색 결과가 없어서 출력되는 문구입니다.
script (batch, shell) 사용법
$XPUSH_HOME/bin 에서 script 를 실행합니다.
Windows : batch script 실행
Linux : shell script 실행
Linux shell script 사용 시, 특수문자가 들어간 인자를 넣을 경우,
스크립트가 정상 동작하지 않을 수 있습니다.
ex) event not found
=> 인자값을 ''(single quotation) 으로 감싸서 입력하면 정상 동작합니다.
[script] show_status
show_status : 현재 서버의 상태를 보기 위한 스크립트입니다. $XPUSH_HOME/bin으로 이동 후, show_status.bat/sh 를 실행합니다. 실행 시, 필요한 파라미터는 아래와 같습니다.
Windows : show_status.bat X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw
ex) show_status.bat localhost 50003 tobesoft xpush
Linux : ./show_status.sh X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw
ex) ./show_status.sh localhost 50003 tobesoft xpush
id, pw 는 $XPUSH_HOME/conf/user.properties 를 참고합니다.
다음은 실행 예입니다.
[script] show_clients
show_clients : 현재 서버에 접속한 전체 client 정보 (userId, ip, projectId, topicType, topicId) 를 보기 위한 스크립트입니다. $XPUSH_HOME/bin으로 이동 후, show_clients.bat/sh 를 실행합니다. 실행 시, 필요한 파라미터는 아래와 같습니다.
Windows : show_clients.bat X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw
ex) show_clients.bat localhost 50003 tobesoft xpush
Linux : ./show_clients.sh X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw
ex) ./show_clients.sh localhost 50003 tobesoft xpush
id, pw 는 $XPUSH_HOME/conf/user.properties 를 참고합니다.
다음은 실행 예입니다.
[script] show_client (userID)
show_client (userID) : 현재 서버에 접속한 client 중 입력받은 userID 와 일치하는 client 정보를 보기 위한 스크립트입니다. $XPUSH_HOME/bin으로 이동 후, show_client.bat/sh 를 실행합니다. 실행 시, 필요한 파라미터는 아래와 같습니다.
Windows : show_client.bat X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw userID
ex) show_client.bat localhost 50003 tobesoft xpush user01
Linux : ./show_client.sh X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw userID
ex) ./show_client.sh localhost 50003 tobesoft xpush user01
id, pw 는 $XPUSH_HOME/conf/user.properties 를 참고합니다.
다음은 실행 예입니다.
[script] save_clients
save_clients : 현재 서버에 접속한 전체 client 정보 (userId, ip, projectId, topicType, topicId) 를 json file 로 저장하는 스크립트입니다. $XPUSH_HOME/bin으로 이동 후, save_clients.bat/sh 를 실행합니다. 실행 시, 필요한 파라미터는 아래와 같습니다.
Windows : save_clients.bat X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw
ex) save_clients.bat localhost 50003 tobesoft xpush
Linux : ./save_clients.sh X-PUSH 서버 IP 모니터링 포트 (기본 port: 50003) id pw
ex) ./save_clients.sh localhost 50003 tobesoft xpush
id, pw 는 $XPUSH_HOME/conf/user.properties 를 참고합니다.
다음은 실행 예입니다.
-> $XPUSH_HOME 에 clientInfo 폴더가 생성되고 폴더 내부에 생성시각이 포함된 이름의 json file 이 생성됩니다.
[script] no data : 해당하는 조건에 일치하는 검색 결과가 없어서 출력되는 문구입니다.
세부 항목 설명 (show_status)
.모듈 Main X-PUSH 서버
RUNTIME
항목 | 설명 |
---|---|
Startup Time | 서버가 구동된 시간 |
Current Time | 현재 시간 |
Status Reset | status가 재설정된 시간 |
MEMORY
항목 | 설명 |
---|---|
Max | JVM의 최대 사용 가능 메모리 |
Total Heap | 최대 heap 메모리 |
Used Heap | 사용된 heap 메모리 |
Free Heap | 사용되지 않은 heap 메모리 |
Free Heap 메모리가 0이 되면 메모리 부족으로 X-PUSH 서버가 정상 동작하지 않습니다.
QUEUE
큐 관련 값은 큐의 상태를 0.1초 간격으로 수집된 통계치입니다. 모두 10,000개의 상태를 저장하고 있으며, 결과적으로 최근 1,000초, 약 16분에 해당하는 통계치를 제공합니다.
항목 | 설명 |
---|---|
Message Size in Queue | 현재 X-PUSH의 메인큐에 처리 대기 중인 메시지의 수 |
Average Message in Queue | 큐에 담기는 메시지의 평균 개수, 이 값이 1보다 큰 값이라면 메시지를 푸시하는데 지체가 발생하고 있는 것입니다. |
Waiting Ratio | 전체 서버 런타임 중에 메시지가 큐에서 대기하고 있는 시간의 비율입니다. |
Message Size in Queue 항목이 0 이상이고 지속적으로 수치가 증가될 경우. X-PUSH의 메시지 발송이 지연되는 상황
메시지 처리보다 공급이 많은 경우
DB 처리가 지연이 되는경우
Client Servant Container
항목 | 설명 |
---|---|
Container Count | servant를 관리하는 container의 수입니다. |
Total Client Count | 현재 접속된 클라이언트의 수입니다. |
Total Push Count | 서버 구동 이후 클라이언트에 푸시한 메시지의 총 개수입니다. 각 container가 푸시한 값의 총합입니다. |
Average Tps | 서버가 전달한 메시지의 초당 개수 평균입니다. 각 container의 tps를 평균한 값입니다. |
container 관련 delay와 tps에 관련된 값은 최근 10,000건의 메시지에 대한 통계치입니다. 개별 메시지가 container에 전달되고 처리되면, 각 delay가 수집되고 이에 대한 통계치가 계산됩니다.
container 별 제공되는 항목은 아래와 같습니다.
항목 | 설명 |
---|---|
#client | 해당 container가 관리하는 클라이언트의 개수입니다. |
#pushed | 해당 container가 푸시한 메시지의 총 개수입니다. |
#in Q: | 해당 container의 큐에 담긴 현재 메시지의 개수입니다. |
avg delay | 해당 container의 큐에서 메시지가 푸시를 대기한 평균 시간입니다. 단위는 초입니다. |
max delay | 해당 container의 큐에서 메시지가 푸시를 대기한 시간 중 최댓값입니다. 단위는 초입니다. |
push tps | 해당 container가 전달한 메시지의 초당 개수입니다. container가 처리한 메시지 수와 시간을 가지고 값을 구합니다. container가 처리한 메시지 개수는 실제로 각 클라이언트에 푸시한 메시지의 수와는 무관합니다. 예를 들어 어떤 메시지는 소수의 클라이언트에게 전달되고, 어떤 메시지는 모든 클라이언트에 전달될 수 있습니다. |
#in Q 항목이 0 이상이고 지속적으로 수치가 증가될 경우. X-PUSH의 메시지 발송이 지연되는 상황.
메시지 처리보다 공급이 많은 경우
Socket Push Message Provider
항목 | 설명 |
---|---|
Connected Provider Count | 접속된 메시지 공급자의 수입니다. |
servant 별
각 메시지 공급자의 IP 주소와 포트, 그리고 접속 계정을 보여주며, 해당 공급자가 공급한 메시지 수를 나타냅니다.
Provider Message Queue
항목 | 설명 |
---|---|
Push Count | X-PUSH 서버 내부의 Queue를 사용하여 푸시된 메시지의 개수입니다. |
Repository Service
QUEUE
현재 대기 중인 메시지 수 / 큐 사이즈를 의미합니다.
항목 | 설명 |
---|---|
Provide Message Queue Size | 공급된 신뢰성 메시지가 대기 중인 큐 |
Response Message Queue Size | 확인응답 메시지가 대기 중인 큐 |
Request Message Queue Size | 미수신 발송 요청 메시지가 대기 중인 큐 |
Topic Message Queue Size | 토픽 등록 요청 메시지가 대기 중인 큐 |
#Queue Size 항목이 0 이상이고 지속적으로 수치가 증가될 경우. X-PUSH의 메시지 발송이 지연되는 상황.
DB 처리가 지연이 되는경우
ex) Provide Message Queue Size = 5000 / 20000 인 상태가 지속됨. 혹은 계속 증가.
Message Process Time(milisec)
각각 Queue별(Provide, Response, Request, Topic)로 메시지의 처리에 소요되는 시간과 해당 메시지를 처리하는 작업 쓰레드의 상태를 의미합니다.
항목 | 설명 |
---|---|
# | 활성 작업 쓰레드-코드 레벨 / 활성 작업 쓰레드 |
Avg | 평균 소요 시간 |
Min | 최소 소요 시간 |
Max | 최대 소요 시간 |
DB Connection Pool
항목 | 설명 |
---|---|
Active | 사용중인 Connection 수 |
Max | 최대 Connection 수 |
Idle | 대기중인 Connection 수 |
Notification Message Queue
항목 | 설명 |
---|---|
in Q | 해당 큐에 쌓여 있는 메시지의 개수입니다. |
Notification Result Update Queue
항목 | 설명 |
---|---|
in Q | 해당 큐에 쌓여 있는 메시지의 개수입니다. |
Apns Notification Message Queue
항목 | 설명 |
---|---|
in Q | 해당 큐에 쌓여 있는 메시지의 개수입니다. |
FCM Notification Message Queue
항목 | 설명 |
---|---|
in Q | 해당 큐에 쌓여 있는 메시지의 개수입니다. |
ApnsNotifier Service
Message Process Time(milisec)
ApnsQueue의 작업 쓰레드와 Apns로 데이터를 전송하는 Provider의 메시지 처리 소요시간과 해당 메시지를 처리하는 작업 쓰레드의 상태를 의미합니다.
항목 | 설명 |
---|---|
# | 활성 작업 쓰레드-코드 레벨 / 활성 작업 쓰레드 |
Avg | 평균 소요 시간 |
Min | 최소 소요 시간 |
Max | 최대 소요 시간 |
FcmNotifier Service
Message Process Time(milisec)
FcmQueue의 작업 쓰레드와 FCM으로 데이터를 전송하는 Provider의 메시지 처리 소요시간과 해당 메시지를 처리하는 작업 쓰레드의 상태를 의미합니다.
항목 | 설명 |
---|---|
# | 활성 작업 쓰레드-코드 레벨 / 활성 작업 쓰레드 |
Avg | 평균 소요 시간 |
Min | 최소 소요 시간 |
Max | 최대 소요 시간 |
Etc Message Queue
항목 | 설명 |
---|---|
in Q | 해당 큐에 쌓여 있는 메시지의 개수입니다. |
JMX
JConsole 접속
윈도우 환경 설정
%JAVA_HOME%\bin\jconsole을 실행합니다.
Remote 탭에서 IP와 포트를 입력 후 "Connect" 버튼을 클릭합니다.
X-PUSH 서버가 리눅스에 설치되어 있을 경우 JMX에 접속이 되지 않습니다.
리눅스와 윈도우 둘 다 X-PUSH는 0.0.0.0으로 바인딩 되어 실행된다. 하지만 윈도우의 경우 자신의 IP로 라우팅 정보가 라우팅 테이블에 등록되어 있어 해당 주소로 접근할 수 있고, 리눅스의 경우에는 라우팅 테이블에 기본으로 등록되지 않기 때문에 해당 주소로 접근할 수 없습니다.
- 방안 1
xpush_conf.xml 에서 ServerBindAddress 항목을 "0.0.0.0"가 아닌 실제 사용하는 IP를 부여합니다.
<service name="Publisher"> ... <attribute name="ServerBindAddress">192.168.0.1</attribute> ... </service>
- 방안 2
/etc/hosts 파일에 IP를 부여합니다.
192.168.0.1 localhost.localdomain localhost ::1 localhost6.localdomain localhost6
항목
X-PUSH MBean
MBean 정보 목록 | ObjectName | 설명 |
---|---|---|
ConnectionManagerService | X-PUSH:name=ConnectionManagerService | 현재 접속 중인 사용자 정보 |
NodeManagerService | X-PUSH:name=NodeManagerService | X-PUSH Node 정보 |
PublisherService | X-PUSH:name=PublisherService | Publisher 정보 |
RepositoryService | X-PUSH:name=RepositoryService | 저장소 정보 |
System | X-PUSH:name=System | 시스템 정보 |
Container | X-PUSH:type=container, name=TobePublishContainerService0 X-PUSH:type=container, name=TobePublishContainerService1 ...... | Container 정보 |
Notification | X-PUSH:type=notification, name=ApnsNotifierService | APNS, GCM 정보 |
Provider | X-PUSH:type=notification, name=GcmNotifierService | Provider 정보 |
ConnectionManagerService
MBean 정보 목록 | 설명 |
---|---|
ConnectUserCount | 접속된 클라이언트 개수 |
NodeManagerService
MBean 정보 목록 | 설명 |
---|---|
MyInetInfo | X-PUSH Node의 IP, port |
AnotherNodeCount | Node의 개수 |
PublishCount | 다른 Node로 Publish 한 count |
AnotherNodeList | 연결된 Node 정보 |
PublisherService
MBean 정보 목록 | 설명 |
---|---|
ClientNumber | 접속되 클라이언트 개수 |
PublishAddress | publish IP |
ContainerCount | container 개수 |
PublishPort | publish Port |
XpushVersion | X-PUSH 버전 |
DateStart | X-PUSH 구동된 시간 |
DateReset | X-PUSH data 리셋 시간 |
DateCurrent | 현재 시간 |
RepositoryService
MBean 정보 목록 | 설명 |
---|---|
UpdateMsgQueueMaxCapacity | Queue Size (수신확인 메시지 큐) |
SelectMsgQueueMaxCapacity | Queue Size (미수신 메시지 큐) |
InsertMsgQueueMaxCapacity | Queue Size (신뢰성 메시지 큐) |
SelectMsgQueueState | 큐의 상태(0:open, 1:block) |
UpdateMsgQueueState | 큐의 상태(0:open, 1:block) |
InsertMsgQueueState | 큐의 상태(0:open, 1:block) |
DbcpConnectionPoolActiveCount | 사용 중인 pool 개수 |
DbcpConnectionPoolIdleCount | 남아 있는 pool 개수 |
DbcpConnectionPoolMaxCount | pool 최대 개수 |
SelectMsgQueueSize | 현재 큐 안에 있는 메시지 개수 (미수신 메시지 큐) |
InsertMsgQueueSize | 현재 큐 안에 있는 메시지 개수 (신뢰성 메시지 큐) |
UpdateMsgQueueSize | 현재 큐 안에 있는 메시지 개수 (수신확인 메시지 큐) |
ThreadPoolMax | 쓰레드 풀 개수 |
FailCount | DataBase 처리 실패 개수 |
FailCountLimit | FailCount의 한계치 |
TimeRetryDBPeriodMillis | Queue가 Block 되었을 때 DB Check 하는 간격(Milisecond) |
System
MBean 정보 목록 | 설명 |
---|---|
CpuIdle | System CPU Idle |
CpuSys | System에서 사용 중인 CPU 사용량 |
CpuUser | User가 사용중인 CPU 사용량 |
JavaHome | JAVA_HOME 디렉터리 |
MemoryCommittedHeap | X-PUSH 최대 Heap Size |
MemoryFreeHeap | X-PUSH 남은 Heap Size |
MemoryMaxHeap | X-PUSH 최대 Heap Size |
MemroyUsedHeap | X-PUSH 사용 중인 Heap Size |
ProcessCpu | CPU 사용량 |
ProcessName | 프로세스 이름 |
ProcessPid | 프로세스 아이디 |
ProcessRss | 사용되는 실제 메모리양 |
ProcessSize | X-PUSH process의 크기 |
SystemMemoryTotal | 시스템 메모리 전체 용량 |
SystemMemoryUsed | 시스템 메모리 사용량 |
SystemMemoryFree | 시스템 메모리 여유 용량 |
SystemNetworkTotalrx | 네트워크 전송량(read) |
SystemNetworkTotaltx | 네트워크 전송량(write) |
SystemSwapFree | swap 남은 용량 |
SystemSwapTotal | swap 전체 용량 |
SystemSwapUsed | swap 사용량 |
XpushHome | X-PUSH Home 디렉터리 |
Container
MBean 정보 목록 | 설명 |
---|---|
AverageDelay | 해당 container의 큐에서 메시지가 푸시를 대기한 평균 시간입니다. 단위는 초 |
CountInQueue | containerQueue에 들어있는 메세지 개수 |
MaxCapacity | container 의 큐에 담을 수 있는 최대 메세지 개수 입니다 |
MaxDelay | container의 큐에서 메시지가 푸시를 대기한 시간 중 최댓값입니다. 단위는 초입니다 |
MaxServantNum | seravnt를 가질 수 있는 최대 개수 |
PushCount | 일반 메시지 전송 개수 |
PushTps | container가 전달한 메시지의 초당 개수입니다 |
QueueAverageDelay | 평균 지연 시간 |
PushTps | container가 전달한 메시지의 초당 개수입니다 |
QueueAverageDelay | 평균 지연 시간 |
QueueCurrentCount | Queue에 있는 메시지 개수 |
QueueMaxDelay | 최대 지연 시간 |
QueueMaxSize | Queue가 가질수 있는 최대 개수 |
ReliCount | 신뢰성 메시지 전송 개수 |
ServantNum | 접속자 수 |
ThreadPoolCurrentSize | Thread Pool 의 현재 개수 |
ThreadPoolSetMaxSize | Thread Pool 의 최대치 |
ThreadPoolSetMinSize | Thread Pool 의 최소치 |
Notification
ApnsNotifierService
MBean 정보 목록 | 설명 |
---|---|
FailureCount | 전송 실패 개수 |
KeystorePath | APNS 인증서 위치 |
Retries | 전송 실패시 재전송 시도 횟수 |
SuccessCount | 전송 성공 개수 |
TotalSendCount | 총 전송 개수 |
GcmNotifierService
MBean 정보 목록 | 설명 |
---|---|
Apikey | 인증 key |
FailureCount | 전송 실패 개수 |
Retries | 전송 실패시 재전송 시도 횟수 |
SuccessCount | 전송 성공 개수 |
TotalSendCount | 총 전송 개수 |
Provider
MBean 정보 목록 | 설명 |
---|---|
ConnectProviderList | 접속된 Provider 정보(IP, port) |
Port | Provider port |
ProviderAddress | Provider IP |
ProviderNumber | 접속된 provider 개수 |
부족 자원 파악
서버운영을 위한 자원이 부족한 경우 show status에 의한 값들을 가지고 부족한 자원을 파악할 수 있습니다.
메모리 자원 부족
Free Heap 메모리가 작을 경우 정상적인 동작이 불가합니다. Free Heap 메모리가 Total Heap 메모리의 10% 미만일 경우 메모리를 증설하고, 메모리 설정을 변경해야 합니다. 메모리 설정은 startup.bat/startup.sh의 –Xms, -Xmx의 값을 수정합니다.
startup.bat set JAVA_OPTS=-Xms1024m –Xmx1024m –server
startup.sh JAVA_OPTS=”-Xms1024m –Xmx1024m –server $JAVA_OPTS”
Free Heap 메모리가 0이되면 메모리 부족으로 X-PUSH 서버가 정상동작하지 않습니다.
접속 가능 자원 부족
X-PUSH 서버에 접속할 수 있는 최대 클라이언트의 수는 xpush_config.xml에 설정된 container수와 container 별 servant의 개수에 의해 결정됩니다.
배포 시의 기본값은 20개의 container와 각 container별 50개의 servant입니다. 따라서 모두 1,000개(20 container x 50 servant)의 클라이언트 접속이 가능합니다. Total Client Count의 수가 최대 접속 수에 다다르면 더 이상 클라이언트의 접속이 불가합니다. 이 경우 설정을 변경하여야 합니다.
container 수와 servant 수의 변경은 X-PUSH 서버의 성능에 영향을 끼칠 수 있습니다.
cpu 혹은 network 자원 부족
Waiting Ratio의 값이 30% 이상이라면 전달될 메시지가 즉시 전달되지 못하고 대기하는 경우가 발생한 경우이고, 이는 cpu나 network 자원이 부족한 경우입니다. 이 경우 보통 Average Message in Queue의 값이 크고, Average Tps가 낮은 수치를 보입니다. 외부 모니터링 툴을 사용하여 cpu의 사용량과 network 사용량을 측정하여, 필요한 자원을 증설하여야 합니다.
Database Connection 부족
DB 사용량이 증가가 되면 다른 메시지를 처리할 DB Connection없어 Queue에 메시지가 적제가 됩니다. 이때 DB 의 Max Connection 을 확인후 X-PUSH xpush_conf.xml에 maxActive 에서 수치를 증가해 주시면 됩니다
[show status 증상] MODULE : Repository Service QUEUE Provide Message Queue Size = 100 / 100 Response Message Queue Size = 500 / 20000 Request Message Queue Size = 1000 / -1 Topic Message Queue Size = 0 / -1 Message Process Time(milisec) Provide # : 0 / 0 Avg : 0 Min : 0 Max : 0 Response # : 0 / 0 Avg : 0 Min : 0 Max : 0 Request # : 20 / 20 Avg : 0 Min : 0 Max : 0 Topic # : 0 / 0 Avg : 0 Min : 0 Max : 0 Request 에서 20개의 Connection 을 모두 사용을 하면, 다른 Queue 를 처리 할수 없어 Queue에 메시지가 쌓이는 현상이 발생
<service name="DbcpService"> ... <attribute name="maxActive">50</attribute> ... </service>
MaxActive 를 모두 사용중이면 X-PUSH 서버가 정상 동작을 하지 않습니다.