JVM(Java Virtual Machine)이 비정상동작하였을 때, 죽으면서 그 원인을 기록하는 것입니다.
죽으면서까지 어떤 기록을 남기는 기술을 hs (hot spot)으로 칭하면서 파일 이름이 hs_err 를 포함하는 것 같습니다.
1. 언제 생성시키나?
예를 들면, 메모리 부족할 때 메모리를 할당하고자 할 때 처럼 일반적으로 오류가 있을 때.
즉 충분히 예측되는 예외사항(handled exception?) 때는 파일을 남긴다고 합니다.
2. 항상 발생시키는가?
그렇지 않다고 합니다. 어떤 감당하기 어려운 사항(unhandled exception)일 경우에는 파일을 남기지 않을 수 있다고 합니다.
3. 어디에 크래시(crash) 파일이 있는가?
특별한 옵션 지정을 하지 않았다면, 일반적으로 수행/실행시킨 경로에 파일이 만들어집니다.( Working directory of the process )
특별한 경우 즉, 디스크용량 부족, 권한 부족한 경우네는 /tmp 파일에 저장될 수도 있습니다.
4. 저장경로를 지정할 수 있는가?
지정할 수 있습니다. JAVA 구동 명령어에 '-XX:ErrorFile=/logs/ezdas/ezdasX/log/hs_error_pid%p.log' 을 추가한 후 구동시킵니다. 물론 지정경로에 대해 파일쓰기 권한을 부여합니다. 여기서 X는 0 또는 1의 값입니다.
5. 크래시 파일은 어떤 정보를 가지는가?
Thread, SigInfo, VM State, System Information, VM arguments, Environment Variables, CPU, Memory, vm_info, Resiter, Top of Stack, Instruction, Stack Info, pid, java frames, Dynamic libararies
6. ezDAS 서버에 왜 파일 기록이 없을까?
2번 항목에 의해, unhandled exception이 발생하였으면 기본 워킹 디렉토리(/app/exdas/ezdasX/bin/) 에 파일이 없을 수 있습니다. 여기서 X 는 0 또는 1의 값입니다.
또는, connector 서버( java.io.IOException: Too many open files ) 의 File open 후 close하지 않아서, 라이브러리 로딩 에러 발생 초래하는 경우이면, 파일을 기록하지 못할 수 있습니다.
또는 ulimit -a 로 조회하였을 때, core file size 가 0 이면 파일이 저장되지 않을 수 있습니다.
7. 파일을 기록하는 한도를 무제한으로 변경하는 조치는?
ulimit 는 프로세스의 자원 한도를 설정하는 명령입니다.
현재 설정되어져 있는 값을 조회하는 명령어는 ulimit -aH 입니다.
최대 코어 파일 사이즈를 변경하는 명령어 및 옵션은 ulimit -c unlimited 입니다.
영구적으로 저장하려면 .bashrc 나 .bash_profile에 해당 명령어를 입력하여 저장합니다.
해당 계정으로 재접속 후, 값이 제대로 변경되었는지 확인합니다. 필요시 재부팅을 필요로 할 수 있습니다.
8. 덤프파일 이외의 다른 방법으로 오류를 확인할 수 있는 방법은?
journalctl 명령어를 활용할 수 있습니다.
예를 들면,
1. 오늘 날짜 로그 보기
# journalctl --since=today
2. 특정 기간별 로그 보기
# journalctl --since "2017-05-25 00:00:00" --until "2017-05-30 10:30:00"
# journalctl --since "1 hour ago"
# journalctl --since "2 days ago"