자바 jmap으로 heap 메모리 분석(jmap -heap pid) 수행시 오류 발생 할때
Heap Usage:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.tools.jmap.JMap.runTool(JMap.java:201)
at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: java.lang.RuntimeException: unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap
at sun.jvm.hotspot.tools.HeapSummary.run(HeapSummary.java:157)
at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:260)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:223)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
at sun.jvm.hotspot.tools.HeapSummary.main(HeapSummary.java:50)
... 6 more
(2.2.x 부터 추가된 설정으로 Junit 5설정으로 예제 돌리면 오류)
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
* 위의 부분에서 { ~ } 까지를 빼면 Junit 4설정으로 수행되기 때문에 오류 없음
* 또한 위의 설정으로 Test들을 수행하면 @RunWith, @Before, @Test 등이 모두 오류 발생
# ss –[옵션] -a : 모든 포트 확인 -t : TCP 포트 확인 -u : UDP 포트 확인 -l : LISTEN 상태 포트 확인 -p : 프로세스명을 표시 -n : 호스트 / 포트 / 사용자이름을 숫자로 표시 -i : 정보보기 -s : 통계 정보 보기
> 전체 tcp : ss -at > 전체 udp : ss -au > 전체 Listen 포트 : ss -l > 전체 Listen tcp 포트 : ss-tl > Established 상태의 포트 조회 : ss -o state established > 프로세스명 표기 : ss -p > 소켓 메모리 사용 : ss -ltm > 연결된 시간 표기 : ss -tn -o > 1초에 한번 통계 정보 보기 : watch -n 1 "ss -s" > tcp 연결에 목적지 443 포트나 80 포트 조회 : ss -nt '( dst :443 or dst :80 )'
> tcp의 목적지 IP가 127.0.0.1이고 소스는 5000번 이상 큰 경우 : ss -nt src 127.0.0.1 sport gt :5000 <= or le : Less than or equal to port >= or ge : Greater than or equal to port == or eq : Equal to port != or ne : Not equal to port < or gt : Less than to port > or lt : Greater than to port
2. IP와 프로세스 삭제
dport 옵션과 = 포트번호 사이는 반드시 띄어쓰기를 해야한다.
# ss -kill dst 192.168.216.133 dport = 1234
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.100.122:52218 192.168.216.133:1234
3. 출력 단어 설명 RTO(Retransmission TimeOut) : 타이머가 작동하는 시간을 의미 RTT(Round Trip Time) : 네트워크 통신을 하는 두 노드 간에 패킷이 전달되는데 소요된 시간을 의미
내부 TCP 정보를 표시합니다. 아래 필드가 나타날 수 있습니다.
ts 타임 스탬프 옵션이 설정된 경우 ts 표시
sack sack 옵션이 설정된 경우 sack 표시
ecn 명시적 정체 알림 옵션이 설정된 경우 ecn 표기 (explicit congestion notification)
ecnseen 수신 패킷에서 ecn 플래그가 발견된 경우 표기
fastopen show string "fastopen" if the fastopen option is set
cong_alg "cubic" 혼합 알고리즘 기본 설정 the congestion algorithm name, the default congestion algorithm is "cubic"
wscale:: window 창 옵션을 사용하는 경우 송신 스케일 요소와 수신 스케일 요소를 표시
rto: TCP 재전송 시간 종료값 (단위는 밀리 초)
backoff: 지수 백 오프 재전송에 사용되는 실제 재전송 시간 초과 값은 icsk_rto << icsk_backoff
rtt:/ rtt는 평균 왕복 시간이고, rttvar은 rtt의 평균 편차이며, 단위는 밀리초 입니다.
- In-Bound Queue 길이 증가 > net.core.netdev_max_backlog : 각 네트워크 장치 별로 커널이 처리하도록 쌓아두는 Queue의 크기를 설정 > net.core.netdev_max_backlog 이 미정의되면 값이 1000 기본 > 적용 /etc/sysctl.conf 파일내 net.core.netdev_max_backlog=30000
- listen 값 변경 (accept를 기다리는 ESTABLISHED 상태 소켓 큐) 기본값은 128 > 적용 /etc/sysctl.conf 파일 내 net.core.somaxconn=1024
- listen 값 변경 (SYN-RECEIVE 상태의 소켓) > 적용 /etc/sysctl.conf 파일 내 net.ipv4.tcp_max_syn_backlog=1024
3. 사용할 수 있는 포트 RANGE - 확인 명령 > sysctl net.ipv4.ip_local_port_range
- 적용 /etc/sysctl.conf 파일 내 net.ipv4.ip_local_port_range=1024 65535
4. 서버 메시지 큐 관련 - 확인 명령 > sysctl kernel.msgmax
/etc/sysctl.conf 파일 내 - 하나의 프로세스에서 다른 프로세스로 보내질 수 있는 최대 메시지 사이즈 지정 (아래는 기본 크기)
# 최대 메시지 큐의 크기를 지정하며 bytes 단위로 지정 (최대 65,536보다 작게 설정함) kernel.msgmax = 8192
# kernel.msgmni (자동할당되는 최대 메시지 큐)
# 기본 메시지 큐의 최대 크기 (최대 메시지 큐의 크기보다 작거나 같아야 함) kernel.msgmnb = 16384
clear echo "" echo "1. TCP Time Wait 상태를 유지하는 시간 변수 조회(기본 : 7200초)" echo " > WEB,WAS 서버 기준 : 15" echo ""
sysctl -a | grep net.ipv4.tcp_keepalive_intvl
echo "" echo "2. Keep Alive가 끊어졌다고 판단하고 세션을 정리하는 동안 보낼 Ping-Pong 패킷 수(기본 :9)" echo " > WEB,WAS 서버 기준 : 5" echo ""
sysctl -a | grep net.ipv4.tcp_keepalive_probes
echo "" echo "3. 세션이 끊어지지 않게 Keep Alive Time 설정 (기본 : 7200)" echo " > WEB, WAS 서버 기준 : 30 / 데몬 서버는 연결되어야할 초 시간 기준으로 설정함." echo ""
sysctl -a | grep net.ipv4.tcp_keepalive_time
echo "" echo "4. 사용할 수 있는 포트 범위를 설정 " echo " > WEB, WAS 서버 기준 : 1024 - 65000" echo ""
sysctl -a | grep net.ipv4.ip_local_port_range
echo "" echo "5. 각 네트워크 장치 별로 커널이 처리하도록 쌓아두는 Queue의 크기 설정 (기본 1000)" echo " > WEB, WAS 서버 기준 : 2,500" echo " ※ 일부 소켓 accept라고 오역되는 사이트가 존재함" echo ""