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

推薦する

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

バッチモードでtopコマンドを実行する方法

top コマンドは、Linux システムのパフォーマンスを監視するために誰もが使用している最適なコマ...

Mysql 自己結合クエリ例の詳細な説明

この記事では、Mysql の自己結合クエリについて説明します。ご参考までに、詳細は以下の通りです。自...

フロントエンド Vue ユニットテストを始める

目次1. ユニットテストはなぜ必要なのでしょうか? 2. ユニットテストの書き方3. テストツール4...

Vueはマーキースタイルのテキストの水平スクロールを実装します

この記事では、マーキースタイルのテキストの水平スクロールを実現するためのVueの具体的なコードを参考...

ウェブデザイン実践者必読のキャリアプラン

原文記事、転載の際は著者と出典を明記してください! Web デザインは間違いなくテクノロジーであり、...

MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論

目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...

レスポンシブデザインについて知っておくべきこと

レスポンシブデザインとは、ウェブサイトの開発プロセス中に、ユーザーの操作やデバイス環境に応じて対応す...

ウェブサイトを高速化する

パフォーマンスは本当に重要ですか?パフォーマンスは重要であり、誰もがそれを知っています。なぜ私たちは...

jconsole を使用してリモート Tomcat サービスを監視する方法

JConsoleとはJConsole は Java 5 で導入されました。 JConsole は、コ...

Dockerはnginxをデプロイし、フォルダとファイル操作をマウントします

この間、私は docker を勉強していたのですが、nginx をデプロイするときに行き詰まりました...

Linux Centos でスクリプトを使用して Docker をインストールする方法

Dockerの主な機能は何ですか?現在、Docker には少なくとも次のアプリケーション シナリオが...

js 実行コンテキストとスコープの概要

目次序文文章1. JavaScriptコードの実行プロセスに関連する概念2. 実行コンテキストと実行...

CSS3 を使用して左上または右上隅にリマインダー ドットを表示するサンプル コード

効果画像(三角形をご希望の場合は、ここをクリックしてください): コード: <html>...