Red Hat Enterprise Linux 8 で useradd コマンドを連続投入すると処理が遅くなる問題

こんにちは、エス・ワイ・シーの島田圭吾です。

Linux サーバーを運用していてローカルユーザーを複数追加をする際に、
追加したいユーザー分のuseraddコマンドを記述したシェルを実行する方は多いかと思います。

例えば以下のようなシェルを事前作成して実行し、一括登録をするようなパターンですね。
useradd -s /sbin/nologin [UserA]
useradd -s /sbin/nologin [UserB]
useradd -s /sbin/nologin [UserC]
・・・

実は、Red Hat Enterprise Linux 8 (CentOS 8 も含む)からは、
ローカルのユーザー情報管理・認証には、LDAP 等を利用しない場合でもsssd サービスを使用するのが基本になっています。

そして、useradd コマンドはユーザー作成時に sss_cache コマンドを実行してキャッシュのクリアーを行うという動きをします。
そのため、一度に多くのユーザー追加や編集を行うと、ユーザー作成の度にsss_cache コマンドが実行され、
sssd 関連の sssd_be や sssd_nss 等バックエンドプロセスの負荷上昇が起り、
ユーザー情報や認証処理の応答性が悪くなるのが遅くなる原因です。

sssd 起動中に頻繁なキャッシュクリアー処理が入るとバックエンドプロセスの負荷を上げる一因になり、
こうなると、サービスを起動していない時でも本来のuseradd 以外の処理が入って完了を遅らせることになります。

□ 対処法

sssd の影響を無くすには、ユーザー作成スクリプト実行の前にsssd サービスを停止させた状態で実施してください。

# systemctl stop sssd

サービスが停止したかの確認

# systemctl status sssd

なお、useradd 時に実行される sss_cache の処理はハードコーディングされ、オプション等で実行させないようにはできません。
ユーザー情報追加だけであれば /etc/passwd や /etc/shadow にユーザーエントリを追加していくよう編集することでも可能ですが、
ユーザーの追加と同時にホームディレクトリやメールボックスの作成を行うには、現状では useradd を使うしかないですね。