Linux システムの最適化 (カーネルの最適化) に関するいくつかの提案

Linux システムの最適化 (カーネルの最適化) に関するいくつかの提案

スワップを無効にする

サーバーがデータベース サービスまたはメッセージ ミドルウェア サービスを実行している場合は、スワップ パーティションを無効にしてください。

echo "vm.swappiness = 0" >> /etc/sysctl.conf
sysctl -p

OOMキラー

通常、Linux サービスは共存サービスであり、各プログラムが要求する物理メモリは共有されます。たとえば、物理メモリが 1 GB しかない場合、2 つのプログラムを起動してそれぞれ 1 GB を要求することができます。Linux はこの過剰割り当て方式を使用してメモリを最大限に活用します。プログラムが実際に使用するメモリが物理メモリを超えると、システムは優先度に応じて一部のプログラムを強制終了し、他のプログラムの正常な動作を確保します。コア サービスの強制終了を回避するために、プロセス ファイルを最高の優先度に設定できます。

# 値が小さいほど、強制終了される可能性が低くなります echo -17 > /proc/$pid/oom_score_adj

通信プロトコル

当社が提供するデータベースと一部のメッセージ ミドルウェア サービスはすべてイントラネット上で動作するため、イントラネットの TCP パラメータを最適化できます。

  • ネット.ipv4.tcp_syn_retries

デフォルト値は 6、参照値は 2 です。ホストがクライアントとして動作し、3 ウェイ ハンドシェイクの最初のステップである外部への TCP 接続を開始すると、カーネルは SYN メッセージを送信し、指定された回数だけ再試行します。この回数を超えると、接続は破棄されます。イントラネット環境では通信が良好なので、この値は適切に削減できます。

  • ネット.ipv4.tcp_synack_retries

デフォルト値は 5、参照値は 2 です。ホストがサーバーとして機能し、TCP 接続を受け入れる場合、3 ウェイ ハンドシェイクの 2 番目のステップで、クライアントに SYN+ACK メッセージを送信して再試行し、この回数の再試行後に接続を放棄します。この値はイントラネット環境では適切に減らすことができます。

  • net.ipv4.tcp_タイムスタンプ

タイムスタンプを有効にするかどうか。有効にすると、RTT をより正確に計算できます。他のいくつかの機能もタイムスタンプ フィールドに依存します。

  • net.ipv4.tcp_tw_reuse

デフォルト値は 0 で、推奨値は 1 です。 TIME_WAIT 状態のソケットを新しい TCP 接続に使用することを許可するかどうか。これは TIME_WAIT の数を減らすのに非常に効果的です。このパラメータは、tcp_timestamps が有効な場合にのみ有効になります。

  • ネット.ipv4.tcp_tw_リサイクル

TIME_WAIT ソケットの高速リサイクルを有効にするかどうか。これは tcp_tw_reuse よりも根本的な方法であり、tcp_timestamps オプションにも依存します。 tcp_tw_recycle を有効にしないことを強くお勧めします。その理由は 2 つあります。まず、TIME_WAIT は、閉じる接続のデータと新しく確立された接続のデータが混同されないようにするために必要な状態です。次に、tcp_tw_recycle オプションにより、NAT 環境では一部の新規接続が拒否されます。NAT では各ホストに時間差があるため、これはソケットのタイムスタンプ フィールドに反映されます。サーバーは、増加されるはずの特定の IP のタイムスタンプが減少したことを検出し、相対的に減少したタイムスタンプを持つメッセージは破棄されます。

  • ネットコア

デフォルト値は 128、参照値は 2048 です。システム内の各ポートの最大リスニング キューの長さを定義します。サーバーがポートをリッスンすると、オペレーティング システムはクライアントの接続要求に対する 3 ウェイ ハンドシェイクを完了します。確立された接続はキューに保存され、受け入れ呼び出しによって解除されるのを待機します。このオプションはキューの長さを定義します。この値を増やすと、同時実行性の高いシナリオでサーバー側の拒否の数を減らすことができます。

  • ネット.ipv4.tcp_max_syn_backlog

クライアントの要求は、サーバー側の 2 つのキューによって管理されます。1 つは、クライアントとの接続が確立され、受け入れを待機しているキューです。このキューの長さは、somaxconn パラメータによって制御されます。もう 1 つは、確立中だが完了していない接続が格納される別のキューです。このキューの長さは、tcp_max_syn_backlog によって制御されます。デフォルトは 128 ですが、8192 に調整できます。

  • ネット.ipv4.tcp_max_tw_buckets

デフォルト値は 4096、参照値は 100000 です。システムが同時に維持できる TIME_WAIT ソケットの最大数を定義します。この数を超えると、TIME_WAIT ソケットは直ちにクリアされ、警告メッセージが出力されます。システムが過剰な TIME_WAIT によって問題を抱えている場合は、tcp_max_tw_buckets、tcp_tw_reuse、tcp_timestamps の 3 つのオプションを調整して問題を軽減できます。 TIME_WAIT 状態は、TCP セッションを能動的に閉じる側が閉じられたときに発生します。問題を根本的に解決したい場合は、サーバーではなくクライアントが能動的に接続を閉じるようにします。

ページキャッシュ

ページ キャッシュは、システムのダーティ ページであり、システムの IO キャッシュです。データはディスクに書き込まれる前に、まずページ キャッシュに書き込まれ、その後非同期的にディスクにフラッシュされます。書き込みキャッシュにより IO アクセス速度が向上しますが、データ損失のリスクも高まります。

ページ キャッシュからディスクにフラッシュする機会は 3 つあります。

  • 使用可能な物理メモリが特定のしきい値を下回った場合に、システムの空きメモリを解放します。
  • ダーティ ページの常駐時間が特定のしきい値を超えた場合に、ダーティ ページがメモリ内に無期限に残ることを防ぎます。
  • ユーザーからの sync() または fsync() 呼び出しによってトリガーされます。

システムによって実行されるフラッシュには、次の 2 つの書き込み戦略があります。

  • ユーザー I/O をブロックせずにディスク フラッシュを非同期に実行します。
  • フラッシュは同期的に実行され、ダーティ ページが特定のしきい値を下回るまでユーザー I/O はブロックされます。

通常、システムは最初の戦略を最初に実行します。ダーティ ページ データの量が多すぎて、非同期実行ではディスク フラッシュを時間内に完了できない場合は、同期モードに切り替わります。

カーネル パラメータを使用して、ダーティ データのフラッシュしきい値を調整できます。

  • vm.dirty_background_ratio、デフォルト値は 10 です。このパラメータはパーセンテージを定義します。メモリ内のダーティ データがこのパーセンテージを超えると、システムは非同期メソッドを使用してデータをディスクにフラッシュします。
  • vm.dirty_ratio、デフォルト値は 30 です。パーセンテージも定義されています。メモリ内のダーティ データがこのパーセンテージを超えると、システムはディスクを同期的にフラッシュし、ダーティ データが dirty_ratio より低くなるまで書き込み要求はブロックされます。それでも dirty_background_ratio より高い場合は、非同期ディスク フラッシュに切り替えます。したがって、dirty_ratio は dirty_background_ratio よりも高くする必要があります。

パーセンテージ制御に加えて、有効期限も指定できます: vm.dirty_expire_centisecs。デフォルト値は 3000 (30 秒) で、単位は 100 分の 1 秒です。この時間が経過すると、ダーティ データは非同期でディスクにフラッシュされます。

次のコマンドを使用して、システム内の現在のダーティ ページの数を表示できます。

cat /proc/vmstat |egrep "dirty|writeback"
ダーティ数 951
ライトバック数 0
ライトバック時間 0
#出力には、ディスクへの書き込みを待機しているダーティ ページが 951 個あることが示されています。デフォルトのページ サイズは 4KB です。さらに、この情報は /proc/meminfo ファイルでも確認できます。

データ セキュリティ要件がそれほど高くなく、読み取りがキャッシュにヒットしやすくするためにより多くのデータを「キャッシュ」したい場合は、ダーティ データ比率と有効期限を増やすことができます。

vm.dirty_background_ratio = 30
vm.ダーティ比率 = 60
vm.dirty_expire_centisecs = 6000

同様に、ディスク フラッシュによって io がブロックされることを望まない場合は、非同期ディスク フラッシュの値を適切に減らすと、io がスムーズになります。

vm.dirty_background_ratio = 5
vm.ダーティ比率 = 60

上記は Linux システムの最適化 (カーネルの最適化) に関する詳細な提案です。Linux システムの最適化の詳細については、123WORDPRESS.COM の他の関連記事にご注目ください。

以下もご興味があるかもしれません:
  • MySQL 5.7 をバイナリモードでインストールし、Linux でシステムを最適化する手順
  • PHP+swoole+linuxによるシステム監視とパフォーマンス最適化の操作例
  • Mysql オペレーティング環境の最適化 (Linux システム)
  • Linux Apache サーバーシステムのセキュリティ設定と最適化
  • Linux オペレーティングシステムの最適化とセキュリティに関する簡単な説明

<<:  Vueログイン機能の実装

>>:  Mysql の一時テーブルとパーティションテーブルの違いの詳細な説明

推薦する

MySQLはinet_atonとinet_ntoaを使用してIPアドレスデータを処理します。

この記事では、適切な形式を使用して IP アドレス データをデータベースに保存し、IP アドレスを簡...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

Windows Server 2016 リモート デスクトップ サービスを展開するためのクイック スタート ガイド

現在、2016サーバーは、win2008や2012よりも優れたマルチサイトhttpsサービスをサポー...

NodeJS は画像テキスト分割を実現します

この記事では、画像テキストセグメンテーションを実装するためのNodeJSの具体的なコードを参考までに...

Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...

MySql インポート CSV ファイルまたはタブ区切りファイル

別のライブラリから別のライブラリにデータをインポートする必要がある場合があり、このデータは CSV ...

MySQL データ ウェアハウスを保護するための 5 つのヒント

さまざまなソースからデータを集約することで、中央倉庫を作成できます。データ ウェアハウスは、ビジネス...

Dockerコンテナ監視とログ管理の実装プロセス分析

Docker の導入規模が大きくなると、コンテナを監視する必要があります。一般的に、Docker に...

JavaScript キャンバスで動的な点と線の効果を実現

この記事では、動的な点と線の効果を実現するためのJavaScriptキャンバスの具体的なコードを参考...

mysqlは内部コマンドエラーの解決策ではありません

「mysqlは内部コマンドではありません」というエラーは、mysqlのbinディレクトリパスが環境変...

Docker で Portainer ビジュアル インターフェースを構築するための詳細な手順

前回述べた問題を解決するために、オンラインで検索したところ、非常に優れたビジュアル インターフェース...

Docker mongoDB 4.2.1 をインストールし、Springboot ログを収集する詳細な手順

1: dockerにmongodbをインストールするステップ1: dockerにmongodbをイン...

CSS3はアニメーション効果を実現するためにvar()とcalc()関数を使用する。

ナレッジポイントをプレビューします。アニメーションフレーム背景グラデーションvar() と calc...

MySQL 8.0.15 のインストールと設定方法のグラフィック チュートリアル (Windows 10 X64)

最近私が学んでいるのは MySQL の知識なので、MySQL をインストールすることが非常に重要です...

ネガティブマージン関数の紹介と使用方法の概要

1998 年の CSS2 勧告の時点で、テーブルは徐々に舞台から消え、歴史の中に記録されるようになり...