Linux システムでキャッシュをクリアする方法の概要

Linux システムでキャッシュをクリアする方法の概要

1) キャッシュメカニズムの紹介

Linux システムでは、ファイルシステムのパフォーマンスを向上させるために、カーネルは物理メモリの一部を使用して、システム操作とデータ ファイルをキャッシュするためのバッファーを割り当てます。カーネルは読み取りまたは書き込み要求を受信すると、まずキャッシュにアクセスして、要求されたデータがあるかどうかを確認します。ある場合は、直接戻ります。ない場合は、ドライバーを介してディスクを直接操作します。
キャッシュ メカニズムの利点: システム コールの数を減らし、CPU コンテキストの切り替えとディスク アクセスの頻度を減らします。

CPU コンテキスト スイッチング: CPU は各プロセスに一定のサービス時間を割り当てます。タイム スライスが使い果たされると、カーネルは実行中のプロセスからプロセッサを取り戻し、プロセスの現在の実行状態を保存してから、次のタスクを読み込みます。このプロセスはコンテキスト スイッチングと呼ばれます。本質的には、終了したプロセスと実行するプロセスの間でプロセスを切り替えることです。

2) キャッシュとメモリの使用状況を確認する

[root@localhost ~]# free -m
       キャッシュされた未使用の共有バッファの合計
会員番号: 7866 7725 141 19 74 6897
-/+ バッファ/キャッシュ: 752 7113
スワップ: 16382 32 16350

上記のコマンド結果から、合計メモリが 8G で、7725M が使用されており、141M が残っていることがわかります。多くの人がこのように見ています。
しかし、これを実際の利用率として使用することはできません。キャッシュ メカニズムのため、具体的なアルゴリズムは次のようになります。

空きメモリ = 空き (141) + バッファ (74) + キャッシュ (6897)

使用メモリ = 合計 (7866) - 空きメモリ

これから、空きメモリは 7112M、使用メモリは 754M であると計算できます。これが実際の使用率です。-/+ バッファ/キャッシュ ライン情報も参照できますが、これも正しいメモリ使用率です。

3) バッファとキャッシュの区別

カーネルは、システムが物理メモリを使用し、データを正常に読み書きできることを保証しながら、バッファ サイズを割り当てます。

バッファは、メタデータとページをキャッシュするために使用され、システム キャッシュとして理解できます (例: vi がファイルを開く場合)。

cached は、ファイルをキャッシュするために使用され、データ ブロック キャッシュとして理解できます。たとえば、dd if=/dev/zero of=/tmp/test count=1 bs=1G テストでファイルを書き込むと、そのファイルはバッファーにキャッシュされます。このテスト コマンドが次に実行されると、書き込み速度が大幅に速くなります。

4) スワップの使用

スワップとはスワップ パーティションのことです。通常、ここで言う仮想メモリとは、ハード ディスクから分割されたパーティションのことです。物理メモリが不足すると、カーネルはバッファ(キャッシュ)内の長期間使用されていない一部のプログラムを解放し、これらのプログラムを一時的にスワップに格納します。つまり、スワップは物理メモリとキャッシュメモリが不足している場合にのみ使用されます。

スワップのクリーンアップ:

swapoff -a と swapon -a

注意: このクリーンアップには前提条件があります。空きメモリは、すでに使用されているスワップ領域よりも大きくなければなりません。

5) キャッシュメモリを解放する方法

a) ページキャッシュをクリーンアップする

# echo 1 > /proc/sys/vm/drop_caches または # sysctl -w vm.drop_caches=1

b) dentry(ディレクトリキャッシュ)とinodeをクリーンアップする

# echo 2 > /proc/sys/vm/drop_caches または # sysctl -w vm.drop_caches=2

c) ページキャッシュ、dentry、inodeを消去する

# echo 3 > /proc/sys/vm/drop_caches または # sysctl -w vm.drop_caches=3

上記の 3 つの方法はすべて、キャッシュを解放するための一時的な方法です。キャッシュを永続的に解放するには、/etc/sysctl.conf ファイルで vm.drop_caches=1/2/3 を設定する必要があります。その後、sysctl -p が有効になります。

さらに、sync コマンドを使用してファイル システム キャッシュをクリーンアップすることもできます。これにより、ゾンビ オブジェクトとそれらが占有するメモリもクリーンアップされます。

# 同期

上記の操作はほとんどの場合システムに害を及ぼすことはなく、未使用のメモリを解放するのに役立つだけです。

しかし、これらの操作の実行中にデータが書き込まれると、データはディスクに到達する前にファイル キャッシュから実際にクリアされるため、悪影響が生じる可能性があります。では、どうすればこのような事態を回避できるのでしょうか?

したがって、ここでは、inoe/dentry キャッシュを消去するときに使用する優先順位をカーネルに指示するファイル /proc/sys/vm/vfs_cache_pressure について言及する必要があります。

vfs_cache_pressure=100 これはデフォルト値です。カーネルは、dentry と inode を再宣言し、ページ キャッシュとスワップ キャッシュに対して「適切な」比率を採用しようとします。
vfs_cache_pressure の値を減らすと、カーネルは dentry および inode キャッシュを保持する傾向になります。
vfs_cache_pressureの値を増やすと(つまり100を超えると)、カーネルはdentryとinodeを再宣言する傾向があります。

要約すると、vfs_cache_pressure の値は次のとおりです。
100 未満の値ではキャッシュが大幅に削減されることはありませんが、100 より大きい値では、キャッシュを高い優先度でクリアする必要があることをカーネルに伝えます。

実際、vfs_cache_pressure にどのような値が使用されても、カーネルは比較的低速でキャッシュをクリアします。
この値を 10000 に設定すると、システムはキャッシュを適切なレベルまで削減します。

メモリを解放する前に、sync コマンドを使用して同期し、ファイル システムの整合性を確保し、変更された i ノード、遅延ブロック I/O、読み取り/書き込みマッピング ファイルなど、書き込まれていないすべてのシステム バッファーをディスクに書き込みます。そうしないと、キャッシュ解放プロセス中に保存されていないファイルが失われる可能性があります。

/proc は、読み取りおよび書き込み操作を通じてカーネル エンティティとの通信手段として使用できる仮想ファイル システムです。つまり、/proc 内のファイルを変更することで、現在のカーネルの動作を調整できます。つまり、/proc/sys/vm/drop_caches を調整することでメモリを解放することができます。

drop_caches の値は 0 から 3 までの数値で、それぞれ異なる意味を表します。

0: 解放しない (システムのデフォルト値)
1: ページキャッシュを解放する
2: dentryとinodeを解放する
3: すべてのキャッシュを解放する

Linux システムでキャッシュをクリアする方法については、以上が参考になりました。123WORDPRESS.COM を学習していただき、ありがとうございます。

以下もご興味があるかもしれません:
  • PHPプログラマーが遊ぶLinuxシリーズ nginx初心者ガイド
  • Nasmは、自作のLinuxブートディスクをvmwareで実行するブートコードを実装します
  • Linux ブートプロセスの分析
  • Linux 管理者ガイド (5) -- 起動とシャットダウン
  • Linux システムコマンドのメモ
  • Linux システムのユーザー管理コマンドの概要
  • Linuxシステムのsudoコマンドの詳細な説明
  • フォルダとファイルを削除するLinuxシステムコマンド
  • Linuxシステムでddコマンドを使用する方法
  • Linux システムの sudo コマンドに関する 10 のヒントのまとめ
  • Linux ブートシステム方式の分析

<<:  MySQL データベースで UTF-8 エンコードを設定する方法

>>:  シンプルなビデオ連射機能を実装する JavaScript CSS3

推薦する

div要素に丸い境界線を追加する方法

以下のように表示されます。 CSSコードコンテンツをクリップボードにコピー分割{境界線: 2px 固...

Firefox ブラウザでバックグラウンド ミュージックを再生するための究極のソリューション (Chrome マルチブラウザ対応)

FirefoxでBGMを再生するための推奨コードがテストに合格しました空のコントロールパネルを開いて...

MySQL でのログインを取り消す

コンセプト紹介: MySQL の redo ログにはトランザクションの動作が記録されることはご存じの...

MySQL 8.0.15 winx64 解凍版のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15 winx64解凍版のインストールと設定方法を紹介します。具体...

位置固定オフセット問題を解決する方法の詳細な説明

質問CSS 固定配置の position:fixed は非常に使いやすいです。ブラウザのビューポート...

メタを使用してトラフィックキャッシュをキャンセルし、ページにアクセスするたびにページを更新して簡単にデバッグできるようにします。

コードをコピーコードは次のとおりです。 <!-- ブラウザがローカル キャッシュからページにア...

IDEA を使用して Tomcat を設定し、JSP ファイルを作成する方法

idea を使用して JSP ファイルを書き込む前に、jdk 環境 (ここでは説明しません) と対応...

Vue で pdfjs を使用して PDF ファイルをプレビューする方法

目次序文考えるライブラリディレクトリの解析とダウンロード使い方ファイルの場所実際の通話質問要約する序...

クロスドメイン js フロントエンドの 8 つの実装ソリューション

目次1. jsonp クロスドメイン2. document.domain + iframe クロスド...

JavaScriptのスリープ関数の使用

目次1.スリープ機能2.タイムアウトを設定する3. 約束4. 非同期待機5. 1秒後に出力1、2秒後...

MySQL インデックス障害の上位 10 の問題の概要

目次背景1. クエリ条件に「or」が含まれているため、インデックスが失敗する可能性があります。 2....

MySQL データベース監視ソフトウェア lepus の使用上の問題と解決策

lepus3.7 を使用して MySQL データベースを監視中に、次の問題が発生しました。このブログ...

Dockerイメージをプルしてバージョンを確認する方法

イメージのバージョンとタグを確認するには、docker hubで確認する必要があります。アドレスは次...

Vue での bimface の使用に関する詳細

目次1. Vue スキャフォールディングをインストールする2. プロジェクトを作成する3.1 プロジ...

CSS フィルターを使用してマウスオーバー効果を記述する例

CSSフィルターを使用してマウスオーバー効果を記述する <div class="fi...