すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:カーネルのプリエンプションモードを変更する

最終更新日:Oct 23, 2024

ビジネス要件に基づいて、カーネル5.10.134-17以降のバージョンを使用して、Alibaba Cloud Linux 3オペレーティングシステムでカーネルプリエンプションモードを動的に切り替えることができます。 たとえば、インスタンスの実行中に、なしプリエンプションモードから任意プリエンプションモードに切り替えて、ビジネスのレイテンシ要件を満たすことができます。 このトピックでは、カーネルバージョン5.10.134-17以降のバージョンのAlibaba Cloud Linux 3オペレーティングシステムでカーネルプリエンプションモードを切り替える方法と、サポートされているカーネルプリエンプションモードのパフォーマンスの違いについて説明します。

カーネルのプリエンプションモード

次の表に、カーネルバージョン5.10.134-17以降のAlibaba Cloud Linux 3オペレーティングシステムでサポートされているカーネルプリエンプションモードを示します。

プリエンプションモード

説明

none

  • カーネルは、プリエンプティブではない。 カーネルが重要なタスクを実行するとき、タスクのCPUリソースを先取りすることはできず、タスクを中断することはできません。 システムがユーザモードで応答を返し、カーネルモードではアクティブプリエンプションを実行しない場合、システムはコンテキスト切り替えを実行します。

  • スループットは高いですが、レイテンシの問題が発生する可能性があります。

任意

  • カーネルは、特定のプリエンプションポイントでCPUリソースをアクティブに解放します。

  • このプリエンプションモードは、なしモードよりも短いレイテンシと低いパフォーマンスを提供します。

Alibaba Cloud Linux 3はフルモードをサポートしていません

noneモードと任意モードに加えて、Linuxコミュニティはフルモードをサポートしています。

  • フルモードでは、CPUリソースはカーネル内でいつでもプリエンプトできます。 カーネルが準リアルタイムタスクスケジューリングを実行できるようにするために、より多くのコードチェックポイントが追加されます。これにより、カーネルコンテキスト切り替えのオーバーヘッドが増加します。

  • フルモードは、主にリアルタイムシステムまたは高い応答速度を必要とするシナリオで使用されます。 このモードは、高負荷のタスクが実行され、スムーズなユーザーエクスペリエンスと高い対話性を提供するために高速応答が必要なデスクトップ環境に適しています。

フルモードでは、主にクラウドサーバーで動作するAlibaba Cloud Linux 3カーネルのシナリオはほとんどありません。 動的にフルモードに切り替えるために使用されるコードがAlibaba Cloud Linux 3のコードに組み込まれると、システムパフォーマンスに大きな影響を与え、いくつかのLinuxベンチマークテスト指標値が10% 以上減少します。

カーネルのプリエンプションモードを変更する

カーネルバージョン5.10.134-17以降のAlibaba Cloud Linux 3オペレーティングシステムでは、次の方法でカーネルプリエンプションモードを変更できます。

カーネルのプリエンプションモードを永続的に変更する

カーネルのプリエンプションモードは、インスタンスの再起動後に永続的に変更され、保持されます。

カーネルのプリエンプションモードを変更するには、preempt=none設定をbootcmdlineパラメーターに追加または削除します。

  1. 現在のカーネルのプリエンプションモードを表示します。

    sudo cat /sys/kernel/debug/sched_preempt
  2. 現在のカーネル情報を表示します。

    sudo grubby --info=0
  3. カーネルのプリエンプションモードを変更します。

    <kernel> の値を、手順2で照会したカーネルバージョンに置き換えます。 例: /boot/vmlinuz-5.10.134-17.2.al8.x86_64

    • カーネルのプリエンプションモードを任意に変更します。

      sudo grubby --update-kernel=<kernel> --remove-args="preempt=none"
    • カーネルのプリエンプションモードをnoneに変更します。

      sudo grubby --update-kernel=/boot/vmlinuz-<kernel> --args="preempt=none"
  4. インスタンスを再起動して、変更を有効にします。

    sudo reboot
  5. 新しいカーネルのプリエンプションモードを表示します。

    sudo cat /sys/kernel/debug/sched_preempt

カーネルのプリエンプションモードを一時的に変更する

debugfsインターフェイスを使用して、カーネルのプリエンプションモードを一時的かつ動的に変更できます。 インスタンスの再起動後、新しいカーネルプリエンプションモードは無効になります。

この例では、カーネルプリエンプションモードが一時的に自発的に変更されています。

  1. 現在のカーネルのプリエンプションモードを表示します。

    sudo cat /sys/kernel/debug/sched_preempt

    次の図は、現在のカーネルプリエンプションモードがnoneであることを示しています。

    image

  2. カーネルのプリエンプションモードを任意に変更します。

    sudo sh -c 'echo voluntary > /sys/kernel/debug/sched_preempt'
  3. 新しいカーネルのプリエンプションモードを表示します。

    sudo cat /sys/kernel/debug/sched_preempt

    次の図は、新しいカーネルのプリエンプションモードが任意であることを示しています。

    image

カーネル先取りモードの性能解析

エンドツーエンドのシナリオでは、x86およびArm64アーキテクチャを使用するMySQL、Redis、およびNGINXインスタンスでは、noneモードおよび自発的なプリエンプションモードでのベンチマークテストの結果は、noneモードがほとんどの場合より良いパフォーマンスを提供し、2つのモード間のパフォーマンスギャップは比較的小さいことを示しています。 この例では、MySQLシナリオのベンチマークテスト結果が使用されます。

x86およびArm64アーキテクチャでは、oltp_write_onlyoltp_read_only、およびoltp_read_writeメトリックがテストされます。 テスト結果は、1秒あたりのトランザクション (TPS) と1秒あたりのクエリ (QPS) の値が大きいほど、avg latencyavg 95thの値が小さくなり、パフォーマンスが向上することを示しています。

説明

以下の実施例では、モードの試験結果を1に正規化している。 次の図は、なしモードと任意モードのパフォーマンスデータの違いを示しています。

  • x86

    image

  • Arm64

    image

x86およびArm64アーキテクチャでは、前の図に示すように、noneモードが任意モードよりも優れています。