共有メモリは、プロセス間で状態を共有する方法です。共有メモリは、その名前が示すように、プロセス間でデータを「共有」する方法です。どちらのプロセスも同じメモリ領域を「共有」として定義し、そこに書き込むだけで情報を交換できます。これは、プロセス間でネットワークまたはパイプベースのメッセージを送信する代替手段よりも高速です (以前はそうでしたが、現在でも多少は高速です)。
メモリをデータを格納する手段と見なす場合、ファイル システム上のファイルは共有メモリ (つまり、共有ファイル) と見なすことができます。共有メモリを説明するのは困難です。 1つのプロセスに属していますか?両方?ない?複数のプロセスに属するメモリを単純に合計すると、ひどく「過大評価」します。
名前が示すように、共有 (仮想) メモリは、複数のプロセスによって共有され、複数のプログラムで同時に使用できる仮想メモリを指します。仮想メモリを使用すると、プロセスは個別の (仮想) アドレス空間を持つことができますが、メモリを共有するためにプロセスが必要になる場合があります。共有メモリ (SHM) はプロセス間通信 (IPC) のもう 1 つの方法であり、複数のプロセスが単一のメモリ チャンクを共有して通信します。
共有メモリは、プロセスが相互に大量のデータを渡す最速の方法を提供します。 /dev/shm は、従来の共有メモリの概念の実装に他なりません。これは、プログラム間でデータを渡す効率的な手段です。 1 つのプログラムがメモリ部分を作成し、他のプロセス (許可されている場合) がアクセスできます。これにより、Linux での速度が向上します。
問題
サーバーを再起動するたびに、/dev/shm パーミッションが変更されます:
$ ls -alrt /dev/ | grep shm drwxr-xr-t. 2 root root 60 jul 6 11:14 shm
元の許可(1777):
# ls -ld /dev/shm drwxrwxrwt. 2 root root 200 Aug 20 03:44 /dev/shm
既存の許可 (1754):
$ ls -alrt /dev/ | grep shm drwxr-xr-t. 2 root root 60 jul 6 11:14 shm
解決策
この問題の原因は、既存の initscripts パッケージ [initscripts-9.49.37-1.0.1.el7_3.1.x86_64] にあります。
回避策
ステップ 1 :サービスをマスクします( rhel-import-state):
# systemctl mask rhel-import-state
ステップ 2 :サービスの状態を確認してください。以下のようになります:
rhel-import-state.service Loaded: masked (/dev/null; bad) << Active: active (exited) since Fri 2017-07-21 18:28:05 EDT; 2 weeks 3 days ago Main PID: 600 (code=exited, status=0/SUCCESS) CGroup: /system.slice/rhel-import-state.service
ステップ 3 :マシンを再起動し、同じ問題が再発するかどうかを確認してください。
注意 :これは回避策のアクション プランです。恒久的な解決策として、CentOS/RHEL7 update 4 に含まれている initscripts パッケージのバージョンを 9.49.39-1.0.1 にアップグレードしてください。変更を元に戻す
以下のコマンドを実行してマスクされたサービスのマスクを解除することにより、変更を元に戻すこともできます。
# systemctl unmask rhel-import-state.service # systemctl status rhel-import-state.service