Plexmediaserver 영화 라이브러리 예

플렉스 미디어 서버(Plex Media Server) 퍼포먼스 향상 팁

컴퓨터, 소프트웨어 2024년 9월 7일

개요

개인 영상이 많은 분들은 미디어 라이브러리 관리용으로 플렉스(Plex)를 많이 사용합니다. Plex는 유료 Plex Pass 없이도 많은 기능을 사용할 수 있고, 다양한 환경을 지원하기 때문에 장점이 많습니다.

과거에는 개인 Nas를 이용해서 대형 라이브러리를 보유하는 분들이 많았는데 요즘은 구글드라이브나 중국의 115 클라우드 스토리지 등을 이용하는 분들도 많습니다. 네트워크 속도가 빠른 오라클클라우드에서 구글드라이브를 마운트하는 방식으로 이용하기도 합니다.

이런 분들은 미디어 라이브러리 용량이 PB단위까지 가는 경우도 있다보니 DB나 메타데이터 처리 관련해서 문제가 생기기도 합니다.

Plex 사용 중 흔하게 보는 경고는 busy DB 관련 경고입니다.

Sqlite3: Sleeping for 200ms to retry busy DB

plex의 Busy DB 오류

플렉스 미디어 서버 퍼포먼스 향상 팁

몇 TB 정도의 소규모 라이브러리를 관리하는 일반적인 사용자는 Plex의 퍼포먼스 향상 팁이 별 이점이 없을 수 있습니다. 몇 십TB이상의 대규모 라이브러리, 아이템 항목이 많은 경우에는 약간의 성능향상을 위한 팁을 적용할 수 있습니다.

여기에서는 오라클 클라우드 (우분투)를 기준으로 퍼포먼스 향상 팁을 설명합니다. 윈도우용 Plexmediaserver에는 적용이 되지 않는 내용들이 있습니다.

팁1 : 데이터베이스 캐시 늘리기

Plex Web UI에서 퍼포먼스에 영향을 미치는 설정값을 수정할 수 있습니다. 개인의 사용 환경과 목적에 따라 다르겠지만 저는 DB와 메타데이터 용량을 지나치게 크게 만들거나 CPU 점유를 차지하는 옵션은 끄고 사용합니다.

저는 비디오 미리보기 축소 이미지 생성, 챕터 미리보기 생성, 소리 크기 조절을 위한 오디오 트랙 분석을 전부 '사용안함'으로 설정합니다.

또한, 헤비 콜렉터들은 DB의 용량도 몇 기가씩 나올 정도로 크기 때문에 캐시도 조금 늘려주는 것이 도움이 될 수 있습니다. (Plex의 공식 설명에 일반 사용자들은 그냥 기본값 40MB로 놔두라고 되어 있습니다.)

데이터베이스 캐시는 저도 현재 테스트 중이라 512MB를 넣은 것인데 DB파일 용량은 4GB정도고, 데이터베이스 크기의 1% ~ 5% 정도로 설정하는 것이 일반적이기 때문에 256MB정도면 될 것 같습니다.

웹 접속 후 설정 - 라이브러리에서 다음과 같이 값을 수정할 수 있습니다.

플렉스 미디어 서버 데이터베이스 캐시 크기 설정

팁2 : 감시 파일 수 늘리기

라이브러리 용량이 크고 아이템 항목이 많을 때는 OS가 파일 시스템의 변경 사항(예: 파일 생성, 삭제, 수정 등)을 감시할 일이 많습니다. 우분투의 파일 감시를 위한 watch 핸들러(fs.inotify.max_user_watches)의 기본값은 8192입니다.

우분투 시스템 설정에서 fs.inotify.max_user_watches의 값이 부족할 경우 Plex에서 다음과 같은 오류가 나기도 합니다.

 [Notify] Failed to add watch for "파일명" (28: No space left on device)

Plex의 fs.inotify.max_user_watches로 인한 오류

현재 내 OS에서 fs.inotify.max_user_watches 값이 몇으로 되어 있는지 확인하려면 다음 명령어를 실행하면 됩니다. 변경한 적이 없다면 대부분 8192로 되어 있을 것입니다. fs.inotify.max_user_watches 변경방법은 팁3에서 알려드립니다.

sudo sysctl fs.inotify.max_user_watches

시스템의 fs.inotify.max_user_watches 현재값 확인

팁3 : 물리 메모리 사용량 조절

상황에 따라 다르겠지만 대체로 물리 메모리가 높을 때는 스왑메모리를 적게 사용하는 것이 좋습니다. 물리 메모리가 속도도 빠르고, 스왑메모리를 적게 사용하는 쪽이 SSD의 수명도 더 길게 사용할 수 있습니다.

오라클 클라우드의 경우 24GB라는 높은 물리 메모리가 제공됩니다. 초기 설정시 스왑 메모리는 보통 1~4GB정도 설정하게 되는데 스왑메모리는 작게라도 설정하는 쪽이 안정성이 높기 때문에 있는 것이 좋습니다.

다만, 스왑메모리가 있다고 하더라도 가급적 물리메모리를 더 많이 사용하도록 설정할 수 있습니다.

우분투 시스템 설정에서 vm.swappiness 기본값은 60인데 10이나 1로 설정하면 물리 메모리를 적극적으로 사용합니다.

현재 내 OS에서 vm.swappiness 값이 몇으로 되어 있는지 확인하려면 다음 명령어를 실행하면 됩니다. 변경한 적이 없다면 대부분 60으로 되어 있을 것입니다.

sudo sysctl vm.swappiness

시스템의 vm.swappiness 현재값 확인

fs.inotify.max_user_watches, vm.swappiness 시스템 설정값 변경방법

팁2에서 언급한 fs.inotify.max_user_watches값과 팁3의 vm.swappiness값을 변경하기 위해서는 /etc/sysctl.conf 파일을 수정해야 합니다.

nano /etc/sysctl.conf

sysctl.conf 파일 수정

위와 같이 자신이 사용하는 에디터를 이용해 /etc/sysctl.conf파일을 열고 아래 내용을 추가 합니다. 기존값이 존재할 경우에는 숫자만 바꾸면 됩니다.

fs.inotify.max_user_watches=524288 
vm.swappiness = 10

sysctl.conf에 추가할 내용

파일 수정 후 시스템을 재부팅하면 변경 사항이 적용됩니다.

팁4 : 로컬 미디어 에이전트의 기능 수정(특정 함수 사용안함)

Local Media Assets 에이전트

100% 확실하지는 않지만 플렉스에서 자막 등을 인식하려면 Local Media Assets에 체크가 되어 있어야 합니다. 그런데 이 에이전트의 기능 중에서 비디오 파일의 태그를 읽는 기능이 있습니다. 비디오 파일에 태그가 잘 정리되어 있는 경우가 많지 않고, 그마저도 대부분 영어로 적혀 있습니다.

메타 데이터를 담당하는 에이전트는 주로 다른 것이기 때문에 해당 기능은 없애는 쪽이 좋습니다. 이 기능은 videohelpers.py 파일에 process_metadata라는 함수로 정의 되어 있습니다.

process_metadata 기능으로 인해 쓸 데 없이 파일을 계속해서 읽기 때문에 SSD수명에도 CPU 사용량에도 좋지 않습니다. rclone으로 구글드라이브 등을 마운트 한 경우에도 process_metadata 기능으로 인해 API 낭비가 생깁니다.

process_metadata 기능 끄는 방법

process_metadata 함수를 비활성화 해야 하는데 해당 함수는 videohelpers.py라는 파일에 정의 되어 있습니다. 그런데 plex버전 마다 경로가 달라서 수정하기가 꽤 귀찮습니다. 경로 중 Plug-ins-xxxxxxxx 부분이 버전 마다 경로가 다릅니다.

plexmediaserver 1.40.5.8897-e5987a19d일 때 videohelpers.py파일 경로

/usr/lib/plexmediaserver/Resources/Plug-ins-e5987a19d/LocalMedia.bundle/Contents/Code/videohelpers.py

plexmediaserver 1.40.4.8679-424562606일 때 videohelpers.py파일 경로

/usr/lib/plexmediaserver/Resources/Plug-ins-424562606/LocalMedia.bundle/Contents/Code/videohelpers.py

plexmediaserver 1.40.2.8395-c67dce28e일 때 videohelpers.py파일 경로

/usr/lib/plexmediaserver/Resources/Plug-ins-c67dce28e/LocalMedia.bundle/Contents/Code/videohelpers.py

일단, videohelpers.py 파일 수정 방법은 다음과 같습니다. 버전에 맞게 다음과 같이 파일을 엽니다.

nano '/usr/lib/plexmediaserver/Resources/Plug-ins-c67dce28e/LocalMedia.bundle/Contents/Code/videohelpers.py'

이 파일의 29~30행 즈음에 def process_metadata(self, metadata, episode = None):라는 함수가 있는데 이걸 사용하지 않도록 함수 시작 부분에 그냥 return을 넣어주면 됩니다.

videohelpers.py 파일 수정전(원본)
videohelpers.py 파일 수정 후(return추가)

videohelpers.py 파일 자동 편집 스크립트

버전 마다 경로가 다르기 때문에 이를 간단하게 수정해 줄 파이썬 스크립트를 만들었습니다.

edit_plex_videohelpers.py파일을 다운로드해서 적당한 곳에 넣고 실행하면 됩니다. 위 파일의 다운로드 주소는 https://bonik.me/content/files/2024/09/edit_plex_videohelpers.py입니다. 윈도우는 적용 안됩니다.

우분투에서 적당한 폴더를 생성합니다.

mkdir '/home/ubuntu/scripts/python/plex'

스크립트 파일을 해당 경로에 다운로드 합니다.

wget -P /home/ubuntu/scripts/python/plex 'https://bonik.me/content/files/2024/09/edit_plex_videohelpers.py'

다운로드한 스크립트를 실행하면 videohelpers.py파일을 찾아서 자동으로 수정합니다.

python3 '/home/ubuntu/scripts/python/plex/edit_plex_videohelpers.py'

그 밖의 팁 : DB 설정값 조절

sqlite3를 이용해 plexmediaserver의 DB파일인 com.plexapp.plugins.library.db파일을 직접 최적화 할 수도 있습니다. 다만, 플렉스 미디어 서버 자체 기능에도 DB최적화가 존재하고, DB가 손상될 위험도 크고, sqlite3 쿼리를 이용하는 수고에 비해 드라마틱한 효과를 보지 못해서 굳이 방법을 적지는 않기로 했습니다.

sqlite3를 사용할 줄 아는 고급 사용자라면 plex포럼과 reddit에 있는 DB 최적화 정보를 참고하시면 될 것 같습니다.

https://forums.plex.tv/t/suggested-sqlite3-db-optimizations/794749/37

태그

BoniK

협업, 의뢰, 레슨 등 문의 : mail@bonik.me, open.kakao.com/me/bonik