블로그 작성 초창기에 SAP DB/AP 서비스 시작/중지 방법 에 대한 글을 작성했었다.
간단한 명령어와 목적에 대해서만 정리를 했었는데, 정상적으로 잘 수행된다면 큰 문제가 없겠지만, 이슈가 생겼을때는 전체적인 흐름을 알고, 이슈 포인트를 빠르게 짚어내는게 중요하다.
따라서 이번 포스트에서는 좀 더 자세하게 SAP 서비스가 어떻게 시작되는지, 그리고 어떻게 내려가는지 하나씩 분석해보려고 한다.
Unix/ Linux OS 기준으로 작성
Window 는 약간 다르기는 하나 전체적인 흐름에서 크게 다르지는 않다.
OS 정상 부팅 시, 커널을 통해 init 이라는 최초의 프로세스가 실행(호출)된다.
리눅스 버전이 바뀜에 따라 init process 는 변해왔는데,
최근에는 거의 모든 리눅스에서 systemd 를 기본 initializer Programe 으로 사용한다.
따라서, OS 부팅 시 init(systemd) 프로세스에 따라 /etc/init.d 디렉토리 아래의 스크립트가 실행되며, 부팅 시 필요한 서비스들의 실행한다.
정확한 설명은 아니지만, 포스트 주제를 고려하여 이해해주기 바란다.
init process 에 대한 자세한 설명은 다른 좋은 글을 참조하면 좋다.
SAP 를 설치하게 되면, /etc/init.d 디렉토리 밑에 sapinit 스크립트가 생성된다.
init.d 디렉토리 밑에 있는 sapinit 스크립트는 OS 부팅과 함께 수행되고, sapstartsrv 프로세스를 실행한다.
systemctl 명령어를 통해 sapinit 서비스의 상태 및 활성/비활성을 할 수 있다.
systemctl status sapinit
systemctl enable sapinit
systemctl disable sapinit
sapinit 서비스의 status 정보조회를 통해 실제 실행 명령어를 확인할 수 있다.
/etc/init.d/sapinit start
sapinit 스크립트를 열어보면 start 외, stop, status, restart 옵션을 사용할 수 있으며, trace 옵션을 추가하여 추적로그를 남길 수 있다.
sapinit 스크립트가 수행되면, /usr/sap/sapservices 파일을 읽어와 각 인스턴스 별 LD_LIBRARY_PATH 환경변수를 세팅하고, sapstartsrv 프로세스를 시작한다.
즉, sapinit 스크립트 수행하며, sapstartsrv 프로세스가 시작하게 되고, 이 모든 과정은 OS 부팅과 함께 같이 이뤄진다.
sapinit 서비스는 제어 그룹(CGroup) 과 함께 작동하며, 관련된 서비스를 관리한다.
보통 SAP Host Agent 서비스(/usr/sap/hostctrl/exe) 도 같이 실행하게 되는데,
sapinit status 조회를 해보면, SAP Host Agent 의 saphostexec, saposcol 도 같이 실행하게 된다.
여기까지의 순서도를 한번 정리한다.
◼ OS 부팅
-> Init 프로세스(systemd) 에 의해 sapinit 스크립트 수행
-> 각 인스턴스 별 sapstartsrv 프로세스 실행(/usr/sap/sapservices 참조)
-> SAP Host Agent 프로세스 실행 (saphostexec, saposcol)
위 순서에 따라,
sapstartsrv 프로세스는 SAP 인스턴스 관리를 위한 데몬이며, SAP 시스템에서 필요한 모든 프로세스들의 부모 프로세스가 된다.
또한 SAP 서비스 수행에 매우 중요한 프로세스이다.
SAP Notes 936273 - sapstartsrv for all platforms
따라서, SAP 시스템을 시작하기 위해서는 반드시 sapstartsrv 프로세스가 살아있어야하며, sapstartsrv 프로세스가 죽어있다면 SAP 서비스를 올릴수 없게 된다.
sapstartsrv 프로세스는 sapcontrol 명령어 또는 startsap/stopsap 를 통해서도 수동으로 올리고 내릴 수 있다.
◼ sapcontrol : sapcontrol -nr <Instance number> -function StartService <SID>
◼ startsap : startsap startupsrv <Instance name>
◼ sapcontrol : sapcontrol -nr <Instance number> -function StopService
◼ stopsap : stopsap startupsrv <Instance name>
startsap/stopsap 은 SAP 시스템을 시작 및 중지하는데 사용되는 스크립트이다.
정확히는 startsap 스크립트 자체가 SAP 시스템(서비스) 를 구동하는 스크립트는 아니다.
실제 SAP 시스템 구동하는 것은 sapstart 프로그램이며, startsap 스크립트에서 sapstart 프로그램을 호출하여 실행한다.
startsap / sapstart 이름이 비슷하여 햇갈리지만 정확이 구분해야 한다.
startsap 는 스크립트이며, sapstart 는 프로그램이다.
이 과정에서 startsap 스크립트는 sapstartsrv 프로세스 상태를 다시 한번 확인하여, 만약 sapstartsrv 프로세스가 내려가있다면 수행되도록 한다.
(sapstart 는 sapstartsrv 프로세스를 상속받아 수행되므로, sapstartsrv 프로세스가 올라와 있어야 수행될 수 있다.)
또한, Profile Directory 를 읽어와 sapstart 스크립트가 Profile 을 읽을 수 있게 경로는 제공한다.
즉 정리하면, startsap 스크립트는 SAP 시스템을 시작하는 작업 및 확인을 한번에 수행하는 스크립트 이다.
sapstart 프로그램은, 실제 SAP 시스템을 구동한다.
startsap 스크립트에서 전달받은 Profile Directory 를 통해 각 인스턴스 Profile 을 읽어와 SAP 시스템 구동에 필요한 SAP 서비스들을 차례로 실행한다.
각 SAP 서비스들은 sapstart 프로세스를 상속받아 실행되며, ps -ef
명령어로 확인할 수 있다.
먼저 sapcpe 를 수행하여, SAP Kernel 파일들을 로컬로 복사해온다.(/sapmnt/<SID>/exe
->/usr/sap/<SID>/<Instance Name>/exe
)
이 후, disp+work(dw) 의 Dispatcher 프로세스가 sapstart 프로세스를 상속받아 가장 먼저 올라온다.
Dispatcher 프로세스가 올라온 다음, 각 Work 프로세스들은 Dispatcher 의 프로세스를 상속받아 올라오게 된다.
dw 프로세스들 중, sapstart 프로세스를 상속받은(PPID) 1개의 dw 프로세스가 Dispatcher 프로세스이다.
Dispatcher 프로세스는 인스턴스당 1개만 존재하며(일반적으로), 해당 Dispatcher 프로세스가 나머지 모든 Work 프로세스들을 관리한다.
이 외에, 게이트웨이(gwrd), ICM(icman), IGS(ig), Web Dispatcher(wd) 등등의 프로세스들이 순차적으로 올라오면서, SAP 시스템이 구동되게 된다.
SAP 는 2015년 4월 이후부터 startsap/ stopsap 스크립트에 대한 지원을 종료했으며, 더 이상 사용하지 않는 것을 권장한다.
대신, SAP MC (Management console) 또는 sapcontrol 명령어를 사용하기를 권장한다.
(정확히는 SAP NetWeaver 7.0 이상을 기반으로 하는 SAP 시스템에 대해서 sapcontrol 명령어를 사용하는 것을 권장)
SAP Notes 1763593 - Starting and Stopping SAP system instances - startsap/stopsap are deprecated
기억상으로, SAP S/4 HANA 1809 부터 커널파일내에 startsap/stopsap 스크립트가 사라져 해당 명령어 수행이 안되므로, 대신 sapcontrol 명령어를 사용해야한다.
또한, sapcontrol 명령어 출시 이후, startsap/stopsap 스크립트 내부적으로 sapcontrol 명령어를 사용하므로 크게 달라진 바는 없다.
SAP Notes 897399 - Start and stop sequence for SAP system
상기 Notes 를 통해 SAP 에서 권장하는, SAP 시스템의 올바른 기술적인 시작 순서를 확인할 수 있다.
(중지는 시작의 역순)
stopsap 스크립트는 SAP 서비스를 종료하는 스크립트로 옵션에 따라 특정 인스턴스만 종료할 수 있다.
옵션을 생략하면 ALL(Default) 옵션이 자동으로 붙으며, 모든 SAP 서비스를 종료한다.
stopsap 스크립트는 kill 명령어로 SAP 프로세스들(dw, gwrd, ig 등등) 을 종료한다.
이때 사용되는 파일이 kill.sap 파일이다.
그림에서 보면 stopsap 스크립트는 kill.sap 를 실행한다고 표현된지만, 실제로는 kill 명령어를 수행하기 위한 PID 가 적혀있는 파일을 참조하는 것이다.
kill.sap 는
/usr/sap/<SID>/<Instance name>/work
디렉토리 밑에 파일로 존재한다.
kill.sap 파일내에 적혀있는 PID 가 바로 sapstart 프로세스의 PID 이다.
즉, stopsap 명령어는 kill.sap 파일을 읽어와 sapstart 프로세스의 PID 를 확인하고, 해당 PID 를 kill 함으로써 SAP 서비스를 종료한다.
이로써, SAP 시스템(서비스)이 시작하고 중지하는 자세한 프로세스에 대해서 살펴봤다.
그러나, SAP 시스템의 시작/중지 프로세스에 대해 면밀하게 알고 있다고 해도, 각 사이트 별로 운영환경이 천차만별이고 구성과 세팅도 전부 다르기에 이슈/장애상황에 놓였을때 대처하기는 쉽지 않다.
SAP BC 직을 수행하다 보면, 아마 다들 한번쯤 SAP 서비스가 제대로 올라오지 않아 식은땀을 흘린적이 있을 것이다.
다음은 SAP 서비스 시작/중지 이슈에 대해서, 체크해봐야할 로그파일 목록이다.
(오류 문구나 증상에 대해서도 주의깊게 체크해봐야 한다.)
로그 파일 경로 : /usr/sap/<SID>/<Instance name>/work
SAP 서비스 시작과 관련하여, 특이한 케이스의 SAP Notes 를 정리했다.
=> SAP Notes 823941 - SAP start service on Unix platforms
=> SAP Notes 1825259 - UNIX sapstartsrv: the system does not start with 720 kernel
=> SAP Notes 3219591 - sapstartsrv: minimal set of files to start the instance