問題
LinuxのSSDディスク内のスワップパーティションでバックグラウンド TRIM操作を有効にしたい。この記事などのいくつかの記事によると、カーネルはこの構成を検出し、自動的に破棄操作を実行しますが、「破棄」マウントオプションを使用してこの動作を強制しても、テストでは動作していないようです。
シナリオ
- Linux 3.2.0を実行しているDebian Wheezy
- SSDディスク:1 x 120GB OCZ Vertex 3 MI
- 2GBスワップ「プレーン」パーティション、他のレイヤー(LVM、RAIDなど)なし
バックグラウンド
以下は、バックグラウンドTRIMがスワップパーティションで動作しているかどうかを確認するために実行する手順です。
TRIMサポート:SSDディスクがTRIMコマンドをサポートし、カーネルがデバイスに非回転フラグを立てているかどうかを確認します。
# hdparm -I /dev/sda | grep TRIM * Data Set Management TRIM supported (limit 1 block) * Deterministic read data after TRIM # cat /sys/block/sda/queue/rotational 0
スワップフィルアップ:パーティションをマウントし、すべてのVMキャッシュを消去し、積極的にスワップするようにLinuxを構成して、vm.swappinessを100に設定します。次に、利用可能なすべてのメモリを割り当て、カーネルにスワッピングを開始させるスクリプトを実行します。
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
このスクリプトは、32GBの物理メモリと2GBのスワップパーティションを備えたサーバー上で実行され、メモリ内に〜33.8GBのオブジェクトを作成します。これで、すべてのメモリがいっぱいになり、スワップが開始されます。これは、この動作を実現するスクリプトの例です。
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
スワップコンテンツを確認します。「swapon -s」は、スワップメモリが100%使用されていることを示します。「hdparm --read-sector」を使用して、スワップパーティションセクターのrawコンテンツをチェックし、すべてのバイトが「4141」、「A」文字に対応する16進表記に設定され、すべてが正常に機能します。これは、スワップパーティションのコンテンツをセクターごとに読み取るためのサンプルスクリプトです。
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
注:parted、cfdiskなどを使用して、スワップパーティションの開始/終了セクターを取得できます。
スクリプトを停止すると、スワップ割り当てを含むすべてのメモリが解放され、「swapon -s」はシステムでスワップ使用を返しません。この時点で、Linuxはバックグラウンドでスワップパーティションのコンテンツを破棄し始めると予想されますが、動作しません。数時間後でも、セクターのコンテンツは「4141」のままです。
いくつかのテストを行ったところ、Linuxはswapon()
システムコールを使用してパーティションが有効になっている場合にのみ完全な破棄を実行しますが、/ etc / fstabでマウントオプション「破棄」が有効になっています。
さらなる調査:blkdev_issue_discard()は、基礎となるSSDデバイスへのTRIMコマンドの送信を担当するカーネル関数です。この関数には、次の2つの固有の参照がありますmm/swapfile.c
。
discard_swap()
swapon()プロセス中に呼び出されます。「破棄」マウントオプションが有効になっている場合、すべてのコンテンツが破棄されます。これは期待どおりに機能します。discard_swap_cluster()
クラスタスワップの内容を破棄する必要がありますが、TRIMコマンドは実行されないようです。
質問:スワップ+ SSDデバイスでのLinuxの予想される動作は何ですか?すべての空きセクター/ページを破棄する必要がありますか、それとも起動プロセス中にパーティションが有効になっている場合にのみ最初の完全破棄を発行しますか?ありがとう。