트러블 슈팅을 위한 정보 파악 단계

A단계 : 사용자 현상 파악

    • 503/500 에러
    • 무응답/느린 응답
    • 예상과는 다른 어플리케이션 동작 (예) 간헐적 인증 실패)



B단계 : 서버 상태 파악

    • 어플리케이션 서버
    • 메모리 사용률 (Swap 사용여부 )
    • CPU 사용률
    • Disk 용량, I/O
    • 연계서버 상태 (Database 서버 등)



C단계: 어플리케이션의 정보 파악

    • 어플리케이션 로그
    • OOM 등 전형적인 Fatal 여러 발생여부
    • 자주 발생하는 에러 스택
    • WAS의 주요 설정
    • 소스
    • Stack Dump
    • GC로그
    • Heap Dump - 서비스 운영중에 덤프를 뜰 수 없음
    • 실행경로 프로파일링



자주 만나는 해결 방식

해결유형1: 인프라 요소 설정 변경

어플리케이션의 로직과는 상관없이 공통적인 설정을 변경해서 해결하는 경우

Database 등 외부 Reosurce에서 병목이 있을 때 부적절한 설정 때문에  발생하는 경우가 많음.

사례

      • A. 사용자가 몰릴 시 간헐적으로  느린 응답, 500, 503에러
      • B. Swapping 영역 사용.
      • C. 잦은 GC, OOM, Connection pool의 getConnection()에서 대기


해결책

      • ConnectionPool

- DBCP : maxActive (maxTotal), maxWait (maxWaitMills), validation query

      • JDBC : Socket timeout 등
      • Web Server

- Apache Httpd : maxClients

      • Web Application Server

- Tomcat: maxThreads, AJP connector의 backlog 값

      • JVM : GC option



해결유형2: 메모리릭 경로 제거

사례

      • C. 서버가 동작한지 오래되면 잦은 GC, OOM
      • 주로 Cache 로직에서 발생

- 캐쉬 용량의 한도값이 적절한가?

- 모든 서버에 같은 현상이 궁극적으로는 생김.

      • Thead 불안정성에 의한 메모리릭

- 일부 서버에만 OOM 발생


해결유형3: 무한 루프 경로 제거

사례

      • B. 100%에 가까운 CPU 사용. 특정 서버에서만 발생하는 경우가 많음.
      • C. 스택덤프를 뒤져보면 계속 실행 중인 스레드가 있음. 모든 CPU가 100%가 걸리면 덤프조차 못 뜰수 있음.
      • 특정 조건이 들어왔을때 혹은 Thread 불안정성 때문에 생기는 무한루프가 많음.

- 부조건 무한루프였으면 개발할때 모를리가 없음.

      • 잘못된 정규식에서 발생한 사례도 있음

해결유형4: 접속이 느려지거나 접속이 안 될 때

사례

      • 아파치 데몬 개수를 확인, 기본적으로 아파치 웹 서버의 경우 Max Clients가 256으로 설정되어 있음
      • 동시에 256개의 데몬이 뜨게 되면 더 이상의 접속을 받아들이지 않고, 기존의 프로세스가 죽을 때까지 대기한 후 접속이 끊기게 되면 그때 접속 가능
      • 현재의 상태가 비정상적인 접속인지 여부를 판단
-  netstat -na | grep ES로 ESTABLISHED된 연결 상태를 확인하여 클라이언트 의 IP가 정상적인 연결인지 여부를 확인
- netstat -na|grep ES|awk '{print $5}'|sort로 클라이언트의 IP만 Sort 하여 확인
- 통상적으로 HTTP 1.1 규약에서부터 적용되기 시작 한 KeepAlive 기능을 지정하였을 경우 한 클라이언트 IP에서 동시에 3~5개 정 도의 http 프로세스 생성 가능

해결유형5: 서비스 거부 공격(DoS)이 가해졌을 때

사례

      • 동시에 서비스할 수 있는 프로세스의 한계가 있다는 점을 악용한 공격
      • 공격지의 IP를 속이기가 매우 어려우므로 netstat으로 확인 후 비정상적인 접속으로 확인 될 경우 해당 IP를 차단.

해결유형6: include를 잘못하여 무한 루프가 돌 경우

사례

      • 프로그래밍 과정에서 의 실수로 php 파일에서 같은 php 파일을 include하는 경우
      • a.php 파일에서 b.php 파일을 include하고 b.php 파일에서 다시 a.php 파일을 include하는 경우
      • 이러한 경우에는 무한 루프가 돌게 되어 결국은 아파치 데몬이 금새 Maxclients에서 지정한 개수가 차버림
      • include를 하지 못하도록 차단을 하는 방법

- iptables -A INPUT -p tcp -i lo -s xxx.xxx.xxx.xxx --sport 1024:65535 -j DROP

서버 내에서 include 시에는 lo(Lookback Interface)를 통해 sport 가 1024 이후의 High Port를 이용하여 통신한다는 특성을 이용

- ps aux | grep http로 보이는 프로세스에서 ls -la/proc /pid/로 각각의 http 프로세스가 어떤 파일을 참조하고 있는지 일일이 추적

(예:cwd -> /home/user1/public_html/infinite_loop/)

해결유형7: 프로세스가 과도한 메모리를 사용할 경우

사례

      • 메모리를 무한정 소모하는 것을 차단하기 위해서는 아파치의 설정 인자 (Directive) 중에서 RLimitMEM을 사용하여 차단
      • CPU 점유율을 제한하는 RLimitCPU
      • 사용자당 프로세스의 개수를 제한할 수 있는 RLimitNPROC

해결유형8: 아파치 데몬은 떠 있는데, 접속이 되지 않는 경우

사례

      • MaxClients에 도달하지도 않았는데, 실제로 접속이 되지 않는 경우라면 웹 서버가 TCP SYN Flooding 공격을 받고 있을 가능성이 있음
      • netstat -na | grep SYN으로 확인하여 많은 SYN_RECEIVED 프로세스가 보인다면 이 공격 때문임
      • Syncookie 기능활용


참조
http://blog.pages.kr/65
https://d2.naver.com/helloworld/1286587





'IT > ETC' 카테고리의 다른 글

Thread Dump 분석  (0) 2018.11.09
4 steps to troubleshooting  (0) 2018.10.29

Thread Dump 생성 방법

  • Unix : kill -3 [PID]

  • window : Ctrl + Break

  • 공통 :  jstack [PID]

  • 반드시 생성시 3~5회 연속으로 생성하여 문제 상황에 대한 변화 과정을 확인


Thread Dump 정보

    • tid (Java-Level Thread ID )를 이용하여 정보 얻기

      • ThreadMXBean을 이용하여 ThreadInfo 정보 획득 가능
      • JMX 또는 REST API 등록으로 정보 획득을 가능하게 할 경우 문제 분석 용이
      • tid와 threadId가 다른 경우도 존재하기 때문에 name으로 찾는 것이 좋음
  •  - nid (Native Thread ID)를 이용하여 정보 얻기

      • Linux  : ps -mo , ps - Elf 이용

Thread 상태

 Thread Dump - BLOCKED State ( synchronized )



Thread Dump - BLOCKED State - DEADLOCK



Thread Dump - WAIT State

wait 메소드 실행 시 가지고 있던 모니터를 다 반환, wait하는 객체를 notify를 하는 코드를 찾아야 함



Thread Dump - RUNNABLE State



트러블 슈팅

1. CPU 사용 및 Load가 점차적으로 증가

1. 재시작후 Thread  dump를 주기적으로 생성

2. 장애 원인 확인





2. 요청이 증가하는 경우 장애가 발생하지는 않지만 응답시간이 느려지는 현상

1. Thread Dump  생성후 TDA로 분석



2. Stack Trace 확인

3. log4j 설정 확인

4. log4j 문서 확인

3. 요청이 증가한 매우 간헐적으로 CPU가 100%로 폭증 이후 요청량이 줄어들어도 CPU 사용량은 줄어들지 않고 재시작후 정상으로 돌아오는 현상

1. CPU를 많이 사용하는 Thread 확인 - ps -mo 명령어를 통하여 CPU를 사용하는 lwp ( Light Weight Process) 확인



2. 16진수로 변경된 Thread Id를 이용하여 Thread Dump 검색


4. 장애 원인 확인





  


참조

https://d2.naver.com/helloworld/1286587








'IT > ETC' 카테고리의 다른 글

트러블 슈팅  (0) 2018.11.09
4 steps to troubleshooting  (0) 2018.10.29

아래 아티클을 번역

https://www.spiceworks.com/it-articles/troubleshooting-steps/ 


1 단계 : 문제가 정확히 무엇입니까?

문제의 진상을 파헤치는 것은 때때로 "스무고개 게임"을 하는 것처럼 느껴질 때가 있다. 즉 근본적인 문제를 빨리 발견하고 싶다면 무엇보다도 올바른 질문을 하는 것이 중요하다.

  • 다른 사람과 대화하거나 전자 메일을 주고받는 경우 주의 깊게 듣거나 읽고 메모하세요(상대방의 의중 또는 기타). 작업이 완료되면 "예/아니오"로 대답하거나 정량적으로 답변할 수 있는 질문을 진행합니다(예: "이 일이 몇 번이나 발생했습니까?"). 이 접근은 상황을 움직이고 애매한 반응을 줄일 수 있다.
  • 무엇을 물어야 할까요? 핵심은 문제의 "누가, 무엇을, 언제"를 찾아내는 것입니다. 이 문제가 한 사람에게만 영향을 미치는지 아니면 많은 사람에게 영향을 미치는지? 컴퓨터나 네트워크에서 중요한 이벤트가 발생한 직후에 발생 했습니까? "이메일을 보낼 수 없습니다."와 같은 일반적인 문구 아래에 자세히 설명하도록 요청할 수 있는 구체적인 질문이 있습니다. PC나 모바일 장치를 사용하고 있습니까? PC 전원이 켜져 있습니까? 전자 메일 클라이언트를 열 수 있습니까? 이메일을 보내거나받을 수 있습니까?
  • 일단 여러분이 이 문제에 대해 이해하게 되면, 그 문제에 대한 당신의 이해를 되풀이하여 같은 페이지에 무엇이 잘못되었는지 확인하십시오. 그들이 사용하는 것과 동일한 언어를 사용하고 복잡한 기술 용어를 사용하는 것을 피하는 것은 좋은 생각이다. 이렇게 하는게 이상적으로 문제와 관련된 잠재적인 혼란을 제거하는 데 도움이 됩니다.

이제 문제의 본질에 대한 기본적인 이해를 하셨으니, 해결 방법을 찾을 수 있는 기술적인 세부 사항을 살펴보실 수 있습니다.



2 단계 :  자세한 정보 수집, 변수 제거

많은 경우에서 일반적인 문제로 보고 된 내용(예 : 인터넷이 다운 됨)은 사실 특정 웹 사이트가 오프라인 상태 인 것과 같이 매우 특별한 것입니다. 이것을 알아내는 가장 좋은 방법은 무엇일까요? 적절한 질문을 한 후 다음과 같은 다양한 출처에서 더 많은 정보를 찾아보십시오.

  • 에러 메시지 : 사용자가 에러를 보고하거나 우리가 에러를 확인하려고하는 경우, 에러가 발생한 이유에 대해 정확한 이유를 알려줄 수 있습니다. 예를 들어, Windows(윈도우)의 파란 화면은 고장 원인에 대한 적절한 오류 코드를 제공합니다.
  • 이벤트 로그 : 존재하고 있습니까, 그렇다면 정확히 어떻게 적혀 있습니까? 에러 메시지 외에도 로그는 타임 스탬프를 제공하므로 정확한 이벤트가 언제 발생했는지에 대한 질문에 대답 할 수 있습니다. Windows 이벤트 뷰어를 확인하면 관련 로그를 찾을 수 있는 첫 단계가 될 수 있습니다.
  • 사용자가 문제 해결 프로세스에 도움이 될 수 있는 스크린샷, 비디오 또는 기타 지원 정보를 제공할 수 있습니까?
  • 진단 결과: 스템 유틸리티를 실행하여 추가 정보를 얻었습니까? 예를 들어: ping은 해당 서버 또는 웹 사이트에 연결할 수 있는지 원격으로 확인하는 데 도움이 됩니다. 또한 Windows 메모리 진단은 오류가 있는 메모리를 확인할 수 있으며, 리소스 모니터 또는 성능 모니터는 비정상적으로 높은 CPU나 메모리 사용량을 확인할 수 있으며, 디스크 검사로 하드 드라이브에 오류가 있는지 검사할 수 있습니다.
  • 모니터링 : 문제가 발생하기 전에 더 많은 단서를 제공하거나 문제를 예측할 수있는 모니터링 툴이 있습니까? Spiceworks와 같은 네트워크 모니터링 솔루션은 다운 될 위험이있는 서버에 대한 (사전)경고를 제공합니다. 또한 네트워크 인벤토리 응용 프로그램은 디스크 공간, 사용 가능한 메모리, 설치된 OS 및 해당 devies에서 실행중인 소프트웨어와 같은 수십 또는 수백 개의 시스템에 대한 중요한 통계를 제공 할 수 있습니다.

3 단계 : 문제를 재현하고 근본 원인에 대한 가설을 세웁니다.

이제 기본 배경 정보를 수집했으므로 이제 문제를 직접 해결할 때입니다. 문제를 재현하는 것은 사용자가 보고한 것과 동일한 에러를 재현할 수 있음을 확인하는 것을 의미합니다. 이 작업은 문제가 되는 실제 사이트에서 또는 원격 데스크톱/원격 제어 응용 프로그램을 통해 수행할 수 있습니다. 이러한 옵션을 사용할 수 있습니까? 당신은 유사한 컴퓨터 환경에서 동일한 조건을 비슷하게 만들 수 있을 것입니다.

같은 오류가 발생하면 관찰 한 내용을 바탕으로 근본 원인에 대한 이론을 보다 쉽게 ​​개발할 수 있으며 문제를 해결하기 위한 조치를 취하기 시작할 수 있습니다. 때로는 범인을 (솔루션을 생각해내는 것) 빨리 찾아 낼 수도 있을 겁니다. 가설과 다른 경우에는, 시간이 더 오래 걸릴 것이고, 가지고 있는 여러 지식을 파고들어야 할 수도 있고, 오래된 헬프 데스크 티켓들을 뒤적거리거나, 같은 문제에 직면한 다른 사람들의 해결책을 찾기 위해서 구글을 검색해야 할 수도 있다.

이 단계에서 컴퓨터의 작동 방식에 대한 깊은 이해가 입증될 것입니다. 예를 들어, 컴퓨터 네트워킹에서 네트워크에 대한 7계층 OSI 모델을 이해하는 경우(이 중 하나에 문제가 존재할 수 있음), 네트워킹 문제의 잠재적인 원인을 체계적으로 처리할 수 있는 프레임워크가 있습니다. 연결 문제의 경우 이더넷 케이블이 손상되거나 또는 분리되거나(Layer 1 문제), 네트워크 요청이 수행되지 않거나(Layer 3),  응용 프로그램이 제대로 코드화되지 않을 수 있습니다(Layer 6).

4 단계:발견한 결과를 기반으로 해결 시도


이미 수집한 증거는 근본 원인의 가능성이 있는 부분으로 좁혀갈 수 있고, 문제를 해결 할 수 있는 부분을 지적하고 있어야 한다. 이 시점부터는 초점을 맞추고 실험을 해야 할 단계이다. 문제와 관련된 변경 설정 변경, 문제가 있는 부분 교체, 손상된 파일을 복구, 드라이버와 소프트웨어 업데이트 등을 문제가 해결될 때까지(또는 최소한 가까워질 때까지) 시도해 볼 수 있습니다.

아직도 엉망진창? 모든 것이 정상적으로 작동하면 언제든지 기계를 다시 복원할 수 있습니다. 다시 말하면, 문제가 발생하기 전에 누군가가 데이터 또는 시스템 상태를 백업하는 매우 중요한 단계를 밟았을 때 문제가 발생하기 전의 정상적인 PC로 돌아갈 수 있습니다.

모든 문제는 고유한 눈송이와 유사하지만 문제 있는 시스템 재부팅, DNS 및 DHCP 문제 확인, 장치 관리자 드라이버 문제 확인, 시스템 정리 또는 방화벽 설정 확인 등의 일반적인 문제 해결 단계를 통해 많은 문제를 해결할 수 있습니다. 더 어려운 문제의 경우, 각자의 여러가지의 시도와 Google 검색 결과가 만족스럽지 않을 경우 Spiceworks와 같은 IT 포럼에서 토론을 검색하는 것이 PC 문제를 해결하는 데 매우 유용할 수 있습니다. 아무것도 나타나지 않으면 언제든지 Spiceworks의 수백만 명의 IT 전문가 커뮤니티에 문의할 수 있습니다.

문제가 해결 되었나요? 미래의 문제를 준비하세요

기본적인 기술 문제(네트워크 문제, 드라이버 충돌, 디스크 문제 등)가 무엇이든 간에, 위에 설명된 프로세스는 정보 수집, 문제의 가능한 원인 확인, 문제 발생 시 솔루션을 찾는데 적합합니다. 하지만 여전히 각각의 독특한 사례에 따라 판단을 내려야 할 것입니다.

이런 종류의 시스템을 마련하고, 이전의 컴퓨터 문제를 통해 학습된 지식을 통해 여러분은 더 많은 경험을 쌓을 때 더 효율적으로 컴퓨터 문제를 해결할 수 있을 것입니다. 또한 향후 위기를 사전에 방지하기 위해 유사한 문제에 직면한 모든 사용자가 참조할 수 있도록 문제를 문서화할 수 있습니다.


참고

https://b.luavis.kr/server/linux-performance-analysis


https://www.spiceworks.com/it-articles/troubleshooting-steps/

'IT > ETC' 카테고리의 다른 글

트러블 슈팅  (0) 2018.11.09
Thread Dump 분석  (0) 2018.11.09

+ Recent posts