Linux + SSDのスワップパーティションでのバックグラウンド破棄


11

問題

LinuxのSSDディスク内のスワップパーティションでバックグラウンド TRIM操作を有効にしたい。この記事などのいくつかの記事によると、カーネルはこの構成を検出し、自動的に破棄操作を実行しますが、「破棄」マウントオプションを使用してこの動作を強制しても、テストでは動作していないようです。

シナリオ

  • Linux 3.2.0を実行しているDebian Wheezy
  • SSDディスク:1 x 120GB OCZ Vertex 3 MI
  • 2GBスワップ「プレーン」パーティション、他のレイヤー(LVM、RAIDなど)なし

バックグラウンド

以下は、バックグラウンドTRIMがスワップパーティションで動作しているかどうかを確認するために実行する手順です。

  1. 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
    
  2. スワップフィルアップ:パーティションをマウントし、すべての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()
    
  3. スワップコンテンツを確認します。「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の予想される動作は何ですか?すべての空きセクター/ページを破棄する必要がありますか、それとも起動プロセス中にパーティションが有効になっている場合にのみ最初の完全破棄を発行しますか?ありがとう。


4
ポイントは何ですか?RAMは安価です。サーバーに32個の大きなものを搭載することで十分に証明できます。スワップをオフにして、SSDを便利なものに使用し、ビットフリッキングを止めます。
トム・オコナー

3
これらのサーバーではスワップを無効にすることはできず、固有のSSDディスクがあります。従来のHDDでスワップパーティションをホストするオプションはありません。SSDディスクにスワップを置くことは最良の選択肢ではないことは承知していますが、可能な限りディスクパフォ​​ーマンスを改善するために、スワップパーティションで同じ「破棄」ext4動作を実現できるかどうか疑問に思っていました。
santisaez

2
これは本当に時期尚早な最適化の場合のように聞こえます。
MikeyB

「コメントは5分間しか編集できません」-仕事中にSFにいることができます。@MikeyB実際、私はこれについて読んでいます。ウィキペディアの記事には、私が知らなかったことが記載されています。「フラッシュメモリの動作の性質上、ハードディスクドライブのようにデータを直接上書きすることはできません。」それで、以前にスワップで使用されたブロックが空になることは理にかなっています...しかし、santisaezがスワップの内容をチェックするとき、それらは「0000」のように見えますか?
信号15

これらはすべて、オペレーティングシステムの下のレイヤーで発生します。OSに関する限り、ブロック上のデータは書き換えられるまでそこにあります。読み取り/消去/書き込みサイクルを処理するのはドライブの責任です。
MikeyB

回答:


1

と思われdiscard_swap_clusterはのみから呼び出されscan_swap_map順番にから呼び出されget_swap_pageまたはget_swap_page_of_type。私が正しい場合、破棄は、新しいスワップページが割り当てられるときにのみ発生し、ページが解放されたときではありません。


それはバグのように聞こえます。
カスペルド

2
バグではないかもしれません。このようにして、Linuxは1つずつ行うのではなく、一度に多くのページを破棄できます。
-lav

1

システムに--discard=onceデフォルトとして設定されている可能性があります。特定の廃棄オプションを使用してマウントしようとしましたか?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

そして、このような強制:

# swapon --discard=pages /dev/sda2

また、fstrimサービスを作成するか、既に利用可能な場合は構成することもできます。


-1

スクリプトを停止すると、スワップ割り当てを含むすべてのメモリが解放され、「swapon -s」はシステムでスワップ使用を返しません。この時点で、Linuxはバックグラウンドでスワップパーティションのコンテンツを破棄し始めると予想されますが、動作しません。数時間後でも、セクターのコンテンツは「4141」のままです。

スワップの内容は、swapon -s「スワップを使用していません」と返されると効果的に「破棄」されます。システムはブロックの内容を上書きしません(「4141」で埋められます)。 SSD(少なくとも、それはドキュメントから取り除いたものです)


5
場合はdiscardマウントオプションが使用されているTRIMコマンドは避けるの基礎となるソリッド・ステート・ドライブに送られるべき書き込み増幅 SSDディスク上の問題。少なくとも、これはext4のような他のファイルシステムの方法です。
santisaez

明確にするために、それは確かにSSDのガベージコレクタを実行する機会があったことはhdparmコマンドでゼロだけを読んで、しかし後にのみ生じるであろう...
Halfgaar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.