• No : 3121
  • 公開日時 : 2023/03/15 17:00
  • 印刷

futexを使用するアプリケーションが応答不能になる事象の回避策を知りたい。

回答

発生事象

 
 RHEL系OSのバージョン6.6/7.0/7.1において、futexを使用するアプリケーションが応答不能となる
 事象が発生する可能性があります。
 具体的には対象のLinuxサーバー上で動作するMySQLやnamed等のアプリケーションが突然応答不能
 になったケースを確認しております。
 本事象はニフクラが提供しているイメージから作成したOS、VMインポート等によって持ち込まれた
 OSの両方で発生が確認されております。
 

発生原因

 
 Linuxのカーネルにおける、ユーザー空間のロック制御を行うfutex_waitシステムコールのバグが原因です。
 アプリケーションがfutex_waitシステムコールをコールした際に、稀にスレッドがデッドロック状態
 となり、新規イベントを受け付けなくなることで事象が発生いたします。
 

対処方法

 
 OSのカーネルをアップデートすることで上記原因の事象を解消することができます。
 本FAQにおいて対象の確認方法とアップデート方法を記載しております。
 

バグ対象かの確認方法

 
 下記の二つの手順を実施して、バグ対象であるかの確認をします。
 
 方法① バージョンの確認
 osにログインし uname -r コマンドを実施ください。
 
 ■ RHEL 6.x、CentOS 6.xの場合
  結果が 2.6.32-504.16.2.el6.x86_64 未満の場合が対象になります。
 
バグ対象の例
[root@localhost ~]# uname -r
2.6.32-504.el6.x86_64
 
バグ対象外の例
[root@localhost ~]# uname -r
2.6.32-504.16.2.el6.x86_64
 
 ■ RHEL 7.x、CentOS 7.xの場合
  結果が 3.10.0-229.7.2.el7 未満の場合が対象になります。
 
バグ対象の例
[root@localhost ~]# uname -r
3.10.0-229.el7.x86_64
 
バグ対象外の例
[root@localhost ~]# uname -r
3.10.0-229.7.2.el7.x86_64
 
 方法② コマンドでの確認
 下記コマンドを実施した際に何も表示されない場合が対象になります。
 
バグ対象の例
[root@localhost ~]# sudo rpm -q --changelog kernel-`uname -r` | grep futex | grep ref
[root@localhost ~]#
 
バグ対象外の例(6.x)
[root@localhost ~]# rpm -q --changelog kernel-`uname -r` | grep futex | grep ref
- [kernel] futex: Mention key referencing differences between shared and private futexes (Larry Woodman) [1192107 1167405]
- [kernel] futex: Ensure get_futex_key_refs() always implies a barrier (Larry Woodman) [1192107 1167405]
- [kernel] futex: Fix errors in nested key ref-counting (Denys Vlasenko) [1094458] {CVE-2014-0205}
- [kernel] futex_lock_pi() key refcnt fix (Danny Feng) [566347] {CVE-2010-0623}
 
バグ対象外の例(7.x)
[root@localhost ~]# rpm -q --changelog kernel-`uname -r` | grep futex | grep ref
- [kernel] futex: Mention key referencing differences between shared and private futexes (Larry Woodman) [1219169 1205862]
- [kernel] futex: Ensure get_futex_key_refs() always implies a barrier (Larry Woodman) [1219169 1205862]
 

kernelアップデートの手順

 
 kernelアップデートの手順は次の二通りがあります。お客様の環境に合わせた手順を実施してください。
  • 手順① yum updateの実施
    ※最新バージョンのkernelにアップデートされます。
    ※再起動が必須となります。
  • 手順② kernelのrpmファイルの直接インストール
    ※kernelのバージョンを指定したい場合、手順①が実施できない場合はこちらを実施ください。
    ※6.xにおけるkernel-2.6.32-696.18.7.el6.x86_64以上、7.xにおける3.10.0-693.21.1.el7.x86_64
     以上のkernelにアップデートをするとパフォーマンスが低下する可能性があるため、
     パフォーマンス影響を事前に検証してから実施するなど、慎重にご判断くださいますよう
     お願いいたします。
     ご参考:https://pfs.nifcloud.com/info/2019/11/cpu.html
    ※再起動が必須となります。
 手順① yum updateの実施
  1. kernel update無効化設定のコメントアウトの実施
    ニフクラから作成したRHEL、CentOSはkernel updateの無効化設定が入っているため、
    /etc/yum.conf内で無効化設定を入れている記述をコメントアウトしてください。
    ご参考:https://docs.nifcloud.com/cp/guide/os_image/linux.htm
     
  2. yum updateの実施
    [root@localhost ~]# yum update
     
  3. ゲストOSの再起動
 ※yum updateができない場合
 手順② kernelのrpmファイルの直接インストール
  1. 必要なrpmファイルをダウンロード
    まずアップデートしたいバージョンのrpmファイルと依存関係で必要なrpmファイルを
    ダウンロードしてください。

    【例:6.xのOSにおいて2.6.32-504.16.2.el6.x86_64上げる際に必要なファイル】
    CentOSの場合:
    下記リンクから取得可能なrpmファイルの中から kernel-2.6.32-504.16.2.el6.centos.plus.x86_64.rpm と依存関係で必要な kernel-firmware-2.6.32-504.16.2.el6.centos.plus.noarch.rpm をダウンロードしゲストOSに配置ください。
    http://ftp.iij.ad.jp/pub/linux/centos-vault/6.6/centosplus/x86_64/Packages/
    ※外部サイトのため、リンク切れの際はご容赦ください。

    RHELの場合:
    下記サイトにログインし、kernelから kernel-2.6.32-504.16.2.el6.x86_64.rpm、kernel-firmwareから kernel-firmware-2.6.32-504.16.2.el6.noarch.rpm をダウンロードしゲストOSに配置してください。
    https://access.redhat.com/downloads/content/69/ver=/rhel---6/6.10/x86_64/packages
    ※外部サイトのため、リンク切れの際はご容赦ください。
    ※サイトへログインするためにRed Hat accountの作成が必要です。RHEL(サブスクリプション付き)
     をご利用中でダウンロード権限がないお客様はニフクラサポート窓口にお問い合わせください。
    ※依存関係のために最低限 kernel-firmware も必要となります。

    これらはあくまで一例です。お客様の環境に合わせて適切なダウンロード先とファイルを選択ください。
     
  2. rpmをインストール
    下記コマンドでrpmファイルをダウンロードしてください。
    (例ではダウンロードしたファイルを/tmpに保存しています。)
    <例>
    [root@localhost ~]# rpm -ivh /tmp/*.rpm
    準備中...                ########################################### [100%]
       1:kernel-firmware        ########################################### [ 50%]
       2:kernel                 ########################################### [100%]
     
  3. ゲストOSの再起動
     
  4. (6.x系の場合)vmware-toolsの起動
    再起動後、コントロールパネルの表示、または下記コマンドでvmware-toolsが止まっていることが
    確認された場合は下記手順でvmware-toolsを再起動してください。
    https://faq.support.nifcloud.com/faq/show/73?site_domain=default
    <例>
    [root@localhost ~]# status vmware-tools
     vmware-tools stop/waiting

    4-1.
    再起動のためのコマンドを実施  
    [root@localhost ~]# /usr/bin/vmware-config-tools.pl

    入力が求められた際には、下記2つについてのみnoを入力、その他の問いは
    全てEnterを入力してください。  
    The path "" is not valid path to the gcc binary.
    Would you like to change it? [yes]

    The path "" is not a valid path to the 2.6.32-504.16.2.el6.centos.plus.x86_64
    kernel headers.
    Would you like to change it? [yes]

    4-2.
    vmware-toolsの起動確認
    再度status確認のコマンドを実施しvmware-toolsが起動していることを確認してください。
    <例>  
    [root@localhost ~]# status vmware-tools
    vmware-tools start/running
 

対応後の確認

 
 「バグ対象かの確認方法」にて行った確認手順を再度実施し、バグ対象外の状態であることを
 確認してください。