현상
Tibero 기동 시 Cannot get shared memory segment 에러가 발생하며, 정상적으로 기동되지 않습니다.
$ tbboot
shmget failed.: No space left on device
***************************************************************************
* Cannot get shared memory segment:
* SHM_KEY = 0x780d5c27, size = 3221225472, errno=28 (No space left on device)
***************************************************************************
SQL
복사
원인
Linux에서는 디스크에 저장된 파일을 메모리 영역인 파일 캐시에 로드한 후 사용함으로써, 디스크에 비해 상대적으로 느린 성능을 보완합니다.
또한, 파일을 사용한 이후에도 추후 재사용 가능성을 고려하여 해당 데이터를 즉시 반환하지 않고 파일 캐시에 유지함으로써, 느린 디스크에서 다시 로드해야 하는 오버헤드를 줄입니다.
이러한 반환되지 않은 파일 캐시로 인해 사용 가능한 메모리가 부족해지면, Tibero 구동 시 Cannot get shared memory segment 오류가 발생하면서 구동에 실패할 수 있습니다.
$ tbboot
shmget failed.: No space left on device
***************************************************************************
* Cannot get shared memory segment:
* SHM_KEY = 0x780d5c27, size = 3221225472, errno=28 (No space left on device)
***************************************************************************
SQL
복사
free 명령어를 통해 파일 캐시 영역인 buffers/cache의 사용량과 시스템의 실제 free memory 용량을 확인할 수 있습니다.
# free -mt
total used free shared buff/cache available
Mem: 18046 4606 2844 9834 10596 3369
Swap: 32763 724 32039
Total: 50810 5330 34884
SQL
복사
해결
vm.drop_caches 커널 파라미터를 활용하여 파일 캐시 영역의 메모리를 반환함으로써 free memory를 확보한 후, Tibero 구동을 다시 시도합니다.
아래는 적용 예시입니다.
# sync
* file cache를 비우기 전에 memory 에서만 변경된 data를 disk에도 반영 한다.
# sysctl -w vm.drop_caches=3
vm.drop_caches = 3
* 점유중인 file cache memory를 반환
# free -mt
total used free shared buff/cache available
Mem: 18046 4500 3861 9221 9684 4087
Swap: 32763 724 32039
Total: 50810 5224 35901
* file cache를 반환하여 free memory 확보
$ tbboot
Listener port = 8629
Tibero 7
TmaxTibero Corporation Copyright (c) 2020-. All rights reserved.
Tibero instance started up (NORMAL mode).
* 기동 성공
SQL
복사
참고
vm.drop_caches 커널 파라미터는 설정 시점에만 적용되며, 지속적으로 유지되는 설정은 아닙니다.
해당 파라미터를 활용하면 파일 캐시에 저장된 항목들을 선택적으로 반환시킬 수 있습니다.
아래는 설정 예시입니다.
1. pagecache 반환
# sysctl -w vm.drop_caches = 1
2. dentires, inodes 반환
# sysctl -w vm.drop_caches = 2
3. pagecache, dentries, inodes 반환
# sysctl -w vm.drop_caches = 3
SQL
복사