QNAP TS-112の省メモリ化チューニング (QTS4.2.2)

QNAP TS-112は古い機種なので搭載メモリが256MBしかなく、常にスワップファイルを確保しています。
普通に利用している限りでは問題になることはありませんが、無駄なメモリを解放することでアクセス速度が速くなるかな~と思い試してみました。

チューニング目的

目的は2つ。一つ目は少しでもアクセス速度を速くすること。
もう一つは少メモリ化によりオーディオに良い影響があれば・・・という期待。というのも最近話題のラズパイオーディオはシンプルなハードウェアとLinuxの組み合わせが高音質の秘訣だとか。最近のNASは高機能でソフトウェア的な拡張性が高い分多くのプロセスが稼働しているので、これらの解放でシンプル化を図ります。

前提条件

TS-112はLinuxをベースに専用カスタマイズされたOSなのでチューニングも独特です。起動サービスの無効化やKernelモジュールのblacklistなどは効かないため、通常起動後に起動スクリプトで不要なものを自動停止させます。スクリプトの作り方は以前の記事を参照してください。

QNAP TS-112のPowerLEDを消灯する (QTS4.2.1)
TS-112のPowerLEDは青色LEDなので結構まぶしいのですが、残念ながら輝度調整や消灯する方法がありませんでした。CLIで...
注意点

このチューニングはベンダーの想定外のカスタマイズですので思わぬ影響が出るかもしれません。サービス/モジュール停止の恒久化は十分な検証の上行ってください。設定変更・環境変更を頻繁に行う場合もお薦めしません。

不要サービスの調査

我が家のTS-112はファイルサーバ/DLNA(TwonkyServer)/USB-HDDへのスケジュールバックアップしか利用していないので、起動していても意味のないサービスがたくさんあります。まずはpsコマンドで稼働中のサービスを確認しましょう。

[~] # ps aux
  PID  Uid     VmSize Stat Command
    1 admin       588 S   init
    2 admin           SW  [kthreadd]
    3 admin           SW  [ksoftirqd/0]
    6 admin           SW< [khelper]
...
 2864 admin       864 S   /bin/sh /usr/local/mariadb/bin/mysqld_safe --defaults
 3212 admin     39880 S   /usr/local/mariadb/bin/mysqld --defaults-file=/usr/lo
 3291 admin      1848 S   /sbin/qpkgd -d0
 3506 admin      1992 S   /usr/local/sbin/Qthttpd -p 80 -nor -nos -u admin -d /
 3539 admin      1352 S   /usr/sbin/cupsd -C /etc/config/cups/cupsd.conf -s /et
 3895 admin      1436 S   /usr/local/samba/sbin/smbd -l /var/log -D -s /etc/con
 4422 admin       560 S   /usr/sbin/SCREEN -dmS MYTRANSCODE /usr/local/medialib
 4429 admin      2268 S   /usr/local/medialibrary/bin/mytranscodesvr -s -debug
...
 4897 admin       820 S   /usr/sbin/bluetoothd
...
 5089 admin      1360 S   /usr/sbin/upsutil
...

この中で自分にとって不要そうなのが、mariadb、cups(プリンタサーバ)、upsutil(UPS連携モジュール)、bluetoothd(Bluetoothモジュール)など。なおmariadbはQTSの機能として利用可能なSQLサーバではなく、QTSのDLNAサーバ(QPKGのtwonkyではない方)が利用しているようです。

不要サービスの停止

サービスは/etc/init.d/ディレクトリの中にあるスクリプトで停止できます。
先ほどのmariadb、cups、upsutil、bluetoothdとiscsi関連サービスを停止するコマンドは以下の通り。ただし利用環境により停止して良いサービスは異なるため、安易なコピペはしないよう注意してください。

[~] # /bin/sh /etc/init.d/bluetooth.sh stop
[~] # /bin/sh /etc/init.d/cupsd.sh stop
[~] # /bin/sh /etc/init.d/iscsiinit.sh stop
[~] # /bin/sh /etc/init.d/iscsitrgt.sh stop
[~] # /bin/sh /etc/init.d/ups.sh stop
[~] # /bin/sh /etc/init.d/mariadb.sh stop

なおmariadbの終了により約30MBのメモリを解放できることを確認しました。

不要Kernelモジュール(ドライバ)の調査

続けて、lsmodで現在読み込まれているKernelモジュールの調査を行います。

# lsmod |sort
Module                  Size  Used by    Tainted: P
aes_generic 34432 1 mv_cesa, Live 0xbf112000
appletalk 25550 0 - Live 0xbf068000
arc4 1011 0 - Live 0xbf628000
async_memcpy 1000 2 raid456,async_raid6_recov, Live 0xbf0c7000
async_pq 4126 2 raid456,async_raid6_recov, Live 0xbf0cf000
async_raid6_recov 5356 1 raid456, Live 0xbf0d4000
async_tx 1952 5 raid456,async_raid6_recov,async_pq,async_xor,async_memcpy, Live 0xbf0c3000
async_xor 2825 3 raid456,async_raid6_recov,async_pq, Live 0xbf0cb000
auth_rpcgss 30572 2 nfsd,nfs, Live 0xbf2e8000
bluetooth 189546 7 btusb, Live 0xbf5ca000
bsd_comp 5223 0 - Live 0xbf676000
btusb 9582 0 - Live 0xbf605000
cfg80211 163115 1 mac80211, Live 0xbf434000
cifs 273237 0 - Live 0xbf396000
crc_ccitt 1053 1 ppp_async, Live 0xbf631000
cryptodev 17838 0 - Live 0xbf134000 (O)
dm_crypt 15749 0 - Live 0xbf10a000
dm_mod 70289 1 dm_crypt, Live 0xbf0ef000
ecb 1703 0 - Live 0xbf4ad000
ehci_hcd 37390 0 - Live 0xbf03b000
etxhci_hcd 78285 0 - Live 0xbf40b000
exportfs 2885 1 nfsd, Live 0xbf349000
ext3 125990 2 - Live 0xbf013000
ext4 307895 2 - Live 0xbf16b000
fat 48811 1 vfat, Live 0xbf074000
fnotify 28598 0 - Live 0xbf425000 (PO)
hal_netlink 2189 0 - Live 0xbf05c000 (O)
hid 49612 2 hid_logitech,usbhid, Live 0xbf04a000
hid_logitech 8548 0 - Live 0xbf54b000
hmac 2505 0 - Live 0xbf4a9000
ip_tables 9912 2 iptable_filter,iptable_nat, Live 0xbf69a000
ipt_MASQUERADE 1352 0 - Live 0xbf6b5000
ipt_REDIRECT 910 0 - Live 0xbf6b9000
iptable_filter 907 0 - Live 0xbf6b1000
iptable_nat 3414 0 - Live 0xbf6a7000
isofs 33467 0 - Live 0xbf26c000
jbd 46392 1 ext3, Live 0xbf000000
jbd2 55059 1 ext4, Live 0xbf155000
jnl 36016 1 ufsd, Live 0xbf1c8000 (O)
lib80211 3365 0 - Live 0xbf430000
linear 3896 0 - Live 0xbf09d000
llc 3229 1 psnap, Live 0xbf060000
lockd 59814 2 nfsd,nfs, Live 0xbf2d1000
mac80211 202896 0 - Live 0xbf469000
md4 3514 0 - Live 0xbf4b1000
mv_cesa 9748 0 - Live 0xbf12e000
nf_conntrack 43144 4 ipt_MASQUERADE,iptable_nat,nf_nat,nf_conntrack_ipv4, Live 0xbf645000
nf_conntrack_ipv4 5277 3 iptable_nat,nf_nat, Live 0xbf67b000
nf_defrag_ipv4 947 1 nf_conntrack_ipv4, Live 0xbf672000
nf_nat 12283 3 ipt_REDIRECT,ipt_MASQUERADE,iptable_nat, Live 0xbf685000
nfs 251372 0 - Live 0xbf2f6000
nfsd 231704 1 fnotify, Live 0xbf34d000
nls_cp437 4643 0 - Live 0xbf08c000
nls_cp850 3875 0 - Live 0xbf091000
nls_iso8859_2 3627 0 - Live 0xbf095000
nls_utf8 993 0 - Live 0xbf099000
ppp_async 6949 0 - Live 0xbf658000
ppp_deflate 3882 0 - Live 0xbf681000
ppp_generic 18404 4 ppp_deflate,bsd_comp,ppp_mppe,ppp_async, Live 0xbf63c000
ppp_mppe 5838 0 - Live 0xbf661000
psnap 1565 1 appletalk, Live 0xbf064000
raid0 7863 0 - Live 0xbf0a1000
raid456 66162 0 - Live 0xbf0d9000
raid6_pq 84018 2 async_raid6_recov,async_pq, Live 0xbf0ab000
sha1_generic 1736 0 - Live 0xbf11e000
sha256_generic 10793 0 - Live 0xbf122000
sha512_generic 9139 0 - Live 0xbf128000
slhc 4777 1 ppp_generic, Live 0xbf62c000
snd 41192 12 snd_usb_caiaq,snd_usb_audio,snd_usbmidi_lib,snd_hwdep,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_seq_oss,snd_seq,snd_rawmidi,snd_seq_device,snd_timer, Live 0xbf4ba000
snd_hwdep 5005 1 snd_usb_audio, Live 0xbf53d000
snd_mixer_oss 13566 1 snd_pcm_oss, Live 0xbf526000
snd_page_alloc 4782 1 snd_pcm, Live 0xbf4da000
snd_pcm 61047 3 snd_usb_caiaq,snd_usb_audio,snd_pcm_oss, Live 0xbf50f000
snd_pcm_oss 37893 0 - Live 0xbf52e000
snd_rawmidi 16391 3 snd_usb_caiaq,snd_usbmidi_lib,snd_seq_midi, Live 0xbf4df000
snd_seq 44731 5 snd_seq_oss,snd_seq_midi,snd_seq_midi_event, Live 0xbf4e8000
snd_seq_device 4885 4 snd_seq_oss,snd_seq_midi,snd_seq,snd_rawmidi, Live 0xbf4d5000
snd_seq_midi 4038 0 - Live 0xbf4ff000
snd_seq_midi_event 4719 2 snd_seq_oss,snd_seq_midi, Live 0xbf4fa000
snd_seq_oss 26319 0 - Live 0xbf503000
snd_timer 16550 2 snd_pcm,snd_seq, Live 0xbf4cc000
snd_usb_audio 80686 0 - Live 0xbf551000
snd_usb_caiaq 30667 0 - Live 0xbf571000
snd_usbmidi_lib 16712 1 snd_usb_audio, Live 0xbf542000
soundcore 4879 1 snd, Live 0xbf4b5000
sunrpc 167759 4 nfsd,nfs,auth_rpcgss,lockd, Live 0xbf295000
sysinfo 752 0 - Live 0xbf151000 (O)
tun 13366 0 - Live 0xbf620000
udf 90066 0 - Live 0xbf279000
ufsd 541855 0 - Live 0xbf1d6000 (PO)
usbhid 25146 0 - Live 0xbf13d000
usblp 12627 0 - Live 0xbf149000
uvcvideo 63848 0 - Live 0xbf5b4000
v4l2_common 5732 0 - Live 0xbf59d000
v4l2_int_device 1978 0 - Live 0xbf57d000
vfat 9437 0 - Live 0xbf086000
videobuf2_core 19097 1 uvcvideo, Live 0xbf5a3000
videobuf2_memops 1573 1 videobuf2_vmalloc, Live 0xbf5ac000
videobuf2_vmalloc 2108 1 uvcvideo, Live 0xbf5b0000
videodev 81981 2 uvcvideo,v4l2_common, Live 0xbf581000
x_tables 12032 6 ipt_REDIRECT,ipt_MASQUERADE,iptable_filter,iptable_nat,ip_tables,xt_tcpudp, Live 0xbf635000
xhci_hcd 73203 0 - Live 0xbf3f3000
xor 4684 1 async_xor, Live 0xbf0a6000
xt_tcpudp 2096 0 - Live 0xbf65d000

lsmodの読み方は、モジュール名、メモリ使用量(バイト)、このモジュールを参照しているモジュール数、参照モジュール・・・。3列目が0のものは基本的に利用されていないモジュールのはず。
モジュールは文字列で判断するしかありませんが、***80211は無線LANドライバ、snd_***はサウンドドライバなど特徴があります。
注意点としては*hci_hcdはUSBホストドライバ、raid***はRAIDに関連するモジュールなので、確実に不要と判断しない限り解放しない方が良いでしょう。

不要Kernelモジュール(ドライバ)の解放

最初はrmmodコマンドで一つずつ停止し数日様子を見てみるのが良いと思います。というのも、最初に試した際、参照モジュール数が0の*hci_hcdを解放した際外付けUSB-HDDがアンマウントしたことに気付かず翌日のスケジュールバックアップが失敗していたミスがありました。
他にありがちなのがfat/vfat/jnl/ufsdの解放によりWindows系ファイルシステムを読めなくなることでしょうか。いずれにせよ十分な検証が必要です。

[~] # rmmod ppp_mppe
[~] # rmmod ppp_async
[~] # rmmod ppp_deflate
[~] # rmmod snd_usb_caiaq
[~] # rmmod snd_usb_audio
[~] # rmmod snd_pcm_oss
[~] # rmmod snd_seq_oss
[~] # rmmod snd_seq_midi
[~] # rmmod hid_logitech
[~] # rmmod mac8021
[~] # rmmod lib80211
[~] # rmmod raid456
[~] # rmmod raid0
[~] # rmmod appletalk
[~] # rmmod hal_netlink
[~] # rmmod uvcvideo
[~] # rmmod ufsd
[~] # rmmod btusb
[~] # rmmod iscsi_tcp
[~] # rmmod cfg80211
[~] # rmmod snd_pcm
[~] # rmmod cifs
[~] # rmmod nfs
[~] # rmmod snd_usbmidi_lib
[~] # rmmod snd_mixer_oss
[~] # rmmod videobuf2_core
[~] # rmmod snd_seq_midi_event
[~] # rmmod btusb
[~] # rmmod bluetooth
[~] # rmmod snd_hwdep
[~] # rmmod snd_page_alloc
[~] # rmmod snd_rawmidi
[~] # rmmod snd_seq
[~] # rmmod snd_seq_device
[~] # rmmod snd_timer
[~] # rmmod snd
[~] # rmmod soundcore
[~] # rmmod v4l2_common
[~] # rmmod v4l2_int_device
[~] # rmmod videobuf2_vmalloc
[~] # rmmod videobuf2_memops
[~] # rmmod videodev
[~] # rmmod async_raid6_recov
[~] # rmmod async_memcpy
[~] # rmmod async_pq
[~] # rmmod async_xor
[~] # rmmod async_tx
[~] # rmmod bsd_comp
[~] # rmmod ppp_generic
[~] # rmmod raid6_pq
[~] # rmmod vfat
[~] # rmmod fat
起動スクリプトに反映する

動作検証が取れたら起動スクリプトに、サービス停止・Kernelモジュール解放コマンドを追加します。

# vi /share/HDA_DATA/.qpkg/autorun/autorun.sh
#!/bin/sh
/sbin/pic_raw 75 #LED消灯コマンド

/bin/sh /etc/init.d/bluetooth.sh stop
/bin/sh /etc/init.d/cupsd.sh stop
/bin/sh /etc/init.d/iscsiinit.sh stop
/bin/sh /etc/init.d/iscsitrgt.sh stop
/bin/sh /etc/init.d/ups.sh stop
/bin/sh /etc/init.d/mariadb.sh stop

sleep 10

rmmod ppp_mppe
rmmod ppp_async
rmmod ppp_deflate
rmmod snd_usb_caiaq
...

exit 0
省メモリ化の効果

効果を確認します。まずはQTSのメモリ使用率グラフで確認すると、常時120MB程度だったメモリ使用率が90MB程度に下がりました。ただしスワップメモリの使用率は変化なし。/proc/sys/vm/swappinessの変更やswapoff -a && swapon -aもコマンドは通るのに効果がないので、きっと別の制御が行われているのでしょう。

アクセス速度に関しては全く効果なし。今回停止したモジュールの中で一番重そうなmariadbでも未使用=CPU使用率0だったので当然の結果でした。もしからしたらなんてないですね。
ネットワークオーディオの音質についても変化は体感できず。直接再生するわけではないので影響は限定的なのでしょう。

結果的に実験は失敗でした。が、誰かの何かの参考になればと思って記事化しておきます。