QNAP TS-112は古い機種なので搭載メモリが256MBしかなく、常にスワップファイルを確保しています。
普通に利用している限りでは問題になることはありませんが、無駄なメモリを解放することでアクセス速度が速くなるかな~と思い試してみました。
チューニング目的
目的は2つ。一つ目は少しでもアクセス速度を速くすること。
もう一つは少メモリ化によりオーディオに良い影響があれば・・・という期待。というのも最近話題のラズパイオーディオはシンプルなハードウェアとLinuxの組み合わせが高音質の秘訣だとか。最近のNASは高機能でソフトウェア的な拡張性が高い分多くのプロセスが稼働しているので、これらの解放でシンプル化を図ります。
前提条件
TS-112はLinuxをベースに専用カスタマイズされたOSなのでチューニングも独特です。起動サービスの無効化やKernelモジュールのblacklistなどは効かないため、通常起動後に起動スクリプトで不要なものを自動停止させます。スクリプトの作り方は以前の記事を参照してください。
注意点
このチューニングはベンダーの想定外のカスタマイズですので思わぬ影響が出るかもしれません。サービス/モジュール停止の恒久化は十分な検証の上行ってください。設定変更・環境変更を頻繁に行う場合もお薦めしません。
不要サービスの調査
我が家の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だったので当然の結果でした。もしからしたらなんてないですね。
ネットワークオーディオの音質についても変化は体感できず。直接再生するわけではないので影響は限定的なのでしょう。
結果的に実験は失敗でした。が、誰かの何かの参考になればと思って記事化しておきます。