設定画面・仕様

起動オプション(v111.6.0)

Jpsonicの起動オプションに関する注意点です。

一般的な起動引数

これらは指定が無くても動作が可能ですが、最大ヒープサイズは指定する方が無難かもしれません。

最大ヒープサイズ

これはアプリの起動引数ではなくJavaコマンドです。平たく言えばサーバが使用可能な最大メモリを指定します。

Subsonicには最大ヒープサイズに関して明確な推奨値というものはありませんが、サンプルは256mbで記述されることが多かったように思えます。Airsonicは同様に512mbでアナウンスされています。これは倍のメモリを使用するようになったというわけではなく、Subsonicが32bit時代のプロダクト、Airsonicで64bit時代に移行したという違いがあるためです。

Jpsonicは機能が増えていますが、コードの改善やライブラリアップデート(サードパティライブリが省メモリの改善を行う場合がある)といった対策も行われています。そのため使用メモリはSubsonic/Airsonicと同程度かそれ以下に抑えられています。10万曲程度であれば「-Xmx512m」を追加すれば問題ありません。

引数名称 使用例
-Xmx -Xmx512m

ログレベル

v111.6.0 以降、JpsonicのログレベルはWARNがデフォルトになっています。Subsonic/Airsonic風のログが欲しい場合、INFOを指定してください。以下のログレベルが使用可能ですが、ログの分量が増えるほどサーバのパフォーマンスは低下します。

  • ERROR 例外発生時のみ
  • WARN 警告メッセージは出力される。画像がない、フォーマットが不正、等
  • INFO 比較的冗長なアプリケーションログ
  • DEBUG 詳細なログ。起動時のLiquibaseのログ等も出力される
  • TRACE ほとんど全てのログが出力される
引数名称 使用例
logging.level.com.tesshu.jpsonic -Dlogging.level.com.tesshu.jpsonic=INFO

追加の起動引数

Jpsonicは一部の起動オプションの仕様がAirsonicとは異なるため解説します。これらは必須ではなく、必要に応じて追加するオプションです。

名称が変更されている引数
各種デフォルトディレクトリの起動オプションのキー名は変更されています。
他の類似サーバと並行稼働させる際に、設定ミスによる万が一の競合を避けるため。
Jpsonic開発開始当初からの仕様です。
Airsonic Jpsonic
airsonic.home jpsonic.home
airsonic.defaultMusicFolder jpsonic.defaultMusicFolder
airsonic.defaultPodcastFolder jpsonic.defaultPodcastFolder
airsonic.defaultPlaylistFolder jpsonic.defaultPlaylistFolder
機能が変更されている引数
Airsonicと同じ起動オプションが存在しますが、少し仕様が異なるものです。

v107.0.0以降導入されたDLNA起動ポートの仕様が、AirsonicとJpsonicでは異なります。

  • SubsonicはDLNAの起動ポートは自動割り当て
  • Airsonicはデフォルト4041固定。起動オプションUPNP_PORTによって明示指定可能
  • JpsonicはデフォルトWindowsで自動割り当て。Linuxでは起動オプションUPNP_PORTによって指定必須

SubsonicからJpsonicへ移行した方が混乱しない仕様に変更されています。
Airsonic仕様では自動構成機能を持つWindowsの場合設定にてこずる場合があり、回避方法がWindowsのバージョンによって変わります。競合が発生した場合のリカバリはLinuxよりもWindowsの方が面倒なためSubsonic仕様にあわせています。

引数名称 使用例
UPNP_PORT -DUPNP_PORT=4041
バージョンにより異なる引数
Spring Frameworkの最新化によりコンテキストパスの指定方法が変わります。
起動引数によりコンテキストパスを指定している方には影響があります。
引数名称 バージョン 使用例
server.context-path 109.0.0 より前 -Dserver.context-path=/subsonic
servlet.contextPath 109.0.0 から -Dservlet.contextPath=/subsonic
Jpsonic独自に追加されている引数(サーバ起動時の自動スキャン)
初回起動時にスキャンを行うかどうかの仕様が、Subsonic/AirsonicとJpsonicでは異なります。

  • Subsonic/Airsonicは初回起動時にスキャンを自動で開始する
  • Jpsonicは初回起動時にスキャンを自動で開始しない

レガシーサーバが起動時にスキャンを強制するのは、全ての機能が索引データが存在する前提で設計されているためです。一方ストレージのマウントのタイミングが予測しにくいケースでは自動スキャンを行いたくない場合もあります(レガシーサーバではDocker等の起動時にトラブルが発生したという前例がある)。そのためJpsonicでは自動スキャンを選択制とし、デフォルトはオフに変更してあります。

引数名称 使用例
jpsonic.scan.onboot -Djpsonic.scan.onboot=true
Jpsonic独自に追加されている引数(DSDのMIME)

DSDのMIMEを変更可能です。大抵のDSD対応サーバにはこのような設定項目があります。

JpsonicのDSDのMIMEは、dsf/dffのいずれもデフォルト値は「audio/x-dsd」です。AndroidのBubbleUPnPはこの値で認識するため、Jpsonic側の設定を変えなくてもローカルレンダラへdsfを渡すことができます。

DSDのストリーミングは一般的でないためMIMEには統一見解が存在しません。そのためデバイスベンダー各社が各々に都合のいい値を使用しているのが現状です。おそらくDSDをストリーミングしている方は使用されている機器の仕様を把握していると思われるので、audio/x-dsdで問題がある場合は適切な値に書き換えてください。

BubbleUPnP Serverには、プロクシを建てる際に元のサーバのDSDのMIMEをオーバーライドする機能があります(2021年12月)。そのためもし多くのサーバを建てている場合、BubbleUPnP Serverでグローバル管理するというのもひとつの方法です。

引数名称 使用例(機器やソフトウェアにより変わります)
jpsonic.mime.dsf -Djpsonic.mime.dsf=application/octet-stream
-Djpsonic.mime.dsf=audio/dsd
-Djpsonic.mime.dsf=audio/dsf
-Djpsonic.mime.dsf=audio/x-dsf
jpsonic.mime.dff -Djpsonic.mime.dff=application/octet-stream
-Djpsonic.mime.dff=audio/dsd
-Djpsonic.mime.dff=audio/dff
-Djpsonic.mime.dff=audio/x-dff
Jpsonic独自に追加されている引数(埋め込みフォントの有効化)
JpsonicではフォントにJavaの論理フォント(間接的に参照するシステムのフォント)を利用します。v111.4.0以前ではフォントのトラブルを回避するため埋め込み日本語フォントが利用されていました。強制的に以前のフォントを使用したい場合、オプションで切り替えることができます。
引数名称 使用例
jpsonic.embeddedfont -Djpsonic.embeddedfont=true

Tomcatコンテナ配備時の注意点

Tomcatに配備をしていて演奏中に音飛びがする場合 server.xml のConnectorタグをご確認ください。connectionTimeoutの値を大きくすることで解決する場合があります。

Subsonicが登場したWebアプリケーション黎明期と比較すると、現在ではどのサーバもHTTP関連のいくつかのプロパティのデフォルト値は小さめに設定されています。(デフォルトでデータの大量送信などの攻撃を受けつけにくいようにするため) そのためアプリケーションの要件によっては調整が必要になります。組み込みJettyによる単体起動の場合は設定の必要がありません。

グレースフルシャットダウン

v110.0.0以降、グレースフルシャットダウンが導入されました。ターミナル実行時のCtl+CやTomcatのcatalina stopのような正常終了の場合、段階的なリソース解放を行います。
従来のサーバにはシャットダウンに異常終了と正常終了の区別がありませんが、Jpsonicは正常終了時には安全なリソース解放を行います。Tomcatの場合、リクエスト強制終了の際にログにメモリリークを示唆する警告が記録されることがありますが、擬陽性であり問題ありません。

シャットダウンのフロー

おおまかに以下のようになっています。

  • Webレイヤの遮断。既に開始済みのセッションを除き新規リクエストには503がレスポンスされる
  • 開始済みのリクエストの終了を一定時間待ち、強制終了(接続中のブラウザやアプリを全て終了することで待ち時間をなくせる)。
  • 処理中のバックグラウンドプロセスの停止処理。サウンドデバイスは即時クローズ、他のほとんどの処理は一定時間終了待機。Podcastやスキャンのダウンロードの場合、再起動後に再実行したときに完全復帰できる「できるだけキリのよい」ポイントでのキャンセルを試みる。一定時間内に中断できなければ強制終了。
  • キャッシュマネージャのシャットダウン(バックグラウンドプロセスが終了するまで停止できない)
  • データベースのシャットダウン

スキャン中にシャットダウンを実行した場合の挙動は、従来のサーバは完全にデータベースまかせの仕様となっています。Jpsonicは、この辺りを特に説明しなくてもなんとか使えるであろう仕様になっています。

  • Subsonicの場合、実際のところどうなるか不明(データベース破損の報告が多い)。
  • Airsonicの場合、スキャン終了後または自動デフラグ実行時にCHECKPOINTが実行される。そのためスキャン中にシャットダウンした場合でも、あとから意図的にROLLBACKを実行し再スキャンを行うことができる(整合性はスキャン終了タイミングで保証されている。強制中断による整合性の回復のためにROLLBACKが必要となるかならないかは運次第だがほとんどの場合必要)。あるいはそのようなフローを期待した設計と実装。スキャン以外についての整合性は考慮されていない。
  • Jpsonicは異常終了/正常終了時はAirsonicと同じ仕様。スキャン中にサーバのシャットダウンが開始されスキャンがキャンセルされた場合、分かりやすく言えばスキャン途中のアルバムはスキャンしきってから処理を終了する。またキャンセル時にはCHECKPOINTが実行されない。ほとんどの場合直前のコミットまではDBにフラッシュされるので、次回起動後のスキャンは、前回までの内容をスキップし次のアルバムからスキャンが開始されるイメージ。前回スキャン中にシャットダウンを行い、特にエラー等の記録がなく終了できている場合、ロールバック等の操作なしにスキャンの再実行で整合性が回復できる。正常終了時にはAirsonic同様CHECKPOINTが実行されているため、意図的に前回の正常スキャン終了段階までROLLBACKすることも可能

更新履歴

何か機能更新をしてこの記事を書き換えたときに以下に追記します。

v111.6.0
一般的な起動引数を追加。最大ヒープサイズとログレベルについて記載
v111.4.0
カバーアートの生成に埋め込みフォントを使用するオプションを追加
v111.1.0
DSDのMIMEオプションを追記
v110.0.0
Tomcat使用時の注意点を追記
グレースフルシャットダウンの項目を追記
v109.0.0
コンテキストパスの仕様が変更されたため「バージョンにより異なる引数」を追記
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

設定画面・仕様
Web画面の概要(v111.0.0)

Web画面を使用したブラウジングの概要です。

設定画面・仕様
設定画面の概要 (v112.0.0)

SubsonicとJpsonicの設定方法はほぼ同じですが、画面構成が少し異なります。

設定画面・仕様
設定画面 : 音楽フォルダ(v112.0.0)

設定画面「音楽フォルダ」に関する解説です。