HIKKIE

PC / スマホ / ガジェット

Trim コマンドをAndroid デバイスで実行する方法│たまにはデバイスを再起動しよう

Androidデバイス イメージ

Android デバイスの性能低下、その理由

長期間利用しているデバイスは、ディスプレイの焼き付きや輝度の低下、バッテリーライフサイクルの消費による電池持ち時間の低下、ゴムや樹脂の経年劣化による防水・防塵性能の低下など、さまざまな理由で機能を喪失していくものです。

ただ、システムやアプリのスタートアップ速度が低下した、いわゆるデバイスの挙動が「もっさり」するのは、ストレージの劣化によるストレージI/Oの低下が原因かもしれません。

ストレージI/Oとは

ハードディスクなどの外部記憶装置(ストレージ)に対するデータの読み書き操作、あるいはその操作にかかる時間や速さ。装置からのデータの読み込みのことをインプット(input)あるいはリード(read)、書き込みのことをアウトプット(output)あるいはライト(write)と言います。

NANDフラッシュメモリの特性

Android デバイスで利用されるストレージは、eMMCあるいはUFSと呼ばれるものですが、いずれもNANDフラッシュメモリを記憶媒体として利用するものです。まあ、パソコンで使われているSSDのお仲間だと思ってしまってもいいかもしれません。HDDとちがってシークによる機械的な待ち時間が存在せず、古いパソコンのそれよりもかなり快適なユーザー体験を実現しています。

とはいえ弱点や問題がないわけではなく、記憶媒体であるNANDフラッシュメモリの仕様として、「書き換えられるデータ容量に上限がある」、「上書きが出来ない」というものがあります。前者はウェアレベリングという機能によって、表面上問題ないレベルまで隠ぺいされているのですが、後者はストレージの空き容量が減ることによって実利用においても性能低下を引き起こす場合があります。

ハードディスクにおいては、1セクタのデータ書き換えを行った場合、単純に上書きを行うだけですが、NANDフラッシュメモリにおいてはページ単位・ブロック単位でアクセスが必要となり、直接セクタの上書きを行うことはできません。書き込みがしたい場合、一度ブロックの消去を行ってから書き込むことになります。ただ、ブロック消去にはミリ秒単位の待ち時間が発生するため、実際のNANDフラッシュメモリを使用するストレージでは、あらかじめ消去して空きブロックを確保しておくことで、消去に必要な時間を隠ぺいして高速性を実現しています。

そのため、書き込みたいデータサイズ分の空きブロックがなかったり、まだ未消去の状態であった場合には、新たにブロックを消去する必要があるため、アクセス速度が大幅に低下します。さらにストレージを使い込んでいくと、ファイルシステムによるデータの断片化が発生し、空きブロックを確保することが少しずつ困難になっていきます。そうして、NANDフラッシュメモリを使用するストレージは空き容量が少ない状態で使い続けると、大幅にアクセス速度が低下してしまうのです。

不要なファイルを消して、十分な空き容量を確保すればよいと思われるかもしれません。実際、不要ファイルやキャッシュの削除による空き容量の確保はトラブルシューティングにおける鉄板作業としてよく案内されます。しかし、実はそれだけではすぐに効果はありません。

なぜかというと、システムやアプリによるファイルの削除はあくまでファイルの管理データベースからそのファイルの情報を削除しているだけで、実際のデータの実体がフラッシュメモリ上から消去されているものではないからです。初期化しても同様です。通常、システムによる初期化ではデータ実体は消去されず、データベースが初期化されているだけです。

では実際にはどうやって空きブロックを確保しているのかというと、モダンなシステムソフトウェアではトリム(Trim)というコマンドを利用して、空きブロックを生成してパフォーマンスの低下を回避しています。トリムコマンドをストレージに送ると、消去しても良いセクタ情報がストレージに通知され、ストレージはこれに基づいてブロックを消去整理して、空きブロックを生成しています。

Trim コマンドがAndroid デバイスで実行されるタイミング

Windows 10 デバイスの最適化

トリムコマンドは通常、ユーザーには意識されることなく実行されています。たとえばWindows 10では、初期状態では1週間に1度のスケジュール、何らかの理由で3回連続してスケジュールが実行されなかった場合、スケジュールの優先度を上げて実行されます。また、ドライブの最適化から手動で最適化を実行することもできます。

ただし、Android デバイスの場合はシステムの標準ツールやアプリを介してトリムコマンドを実行することはできません。(Android コマンドラインツールの利用 sm fstrimで手動で行うことが出来る他、Rootを取ることでトリムを行うことが出来るアプリは存在します。)

Android デバイスにおいては、if the device is alive at midnight + idle, fstrim gets run at the next available charging + idle time (深夜 + アイドル時にデバイスが起動している場合、次の充電 + アイドル時にfstrimが実行される)とされています。また、もしも何らかの理由でスケジュールされず、3日間トリムが行われなかった場合、デバイスを再起動することで強制的にトリムをスケジュールし、トリムを行わせることが出来ます

デバイスの再起動や充電器への接続をトリガーにスケジュールされるメンテナンス機能はトリムだけではありませんし、週に1度くらいは就寝前にデバイスを再起動して充電器に接続することをお勧めします。

もっと頻繁にトリムを実行したい!

NANDフラッシュメモリはデータを書き込むときに、まず既存のデータを消去する必要があります。この一連のプロセスを「P/Eサイクル」と言うのですが、これを実行できる回数には限界があり、それを超えると障害を起こし機能を喪失します。

つまり「書き換えられるデータ容量に上限がある」のことですが、トリムの頻繁な実行はこのP/Eサイクルを消費し、結果的にストレージの健常性を損なう可能性があります。そのために、ユーザー操作によるトリムの実行は基本的に出来ないようにされているわけです。

参考・関連リンク

PackageManagerService.java (Google Git)

NANDフラッシュメモリ特性 | 東芝情報システム株式会社

▼あわせて読みたい

hikkie.hatenablog.jp

hikkie.hatenablog.jp

hikkie.hatenablog.jp