MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

Cでスレッドの最大数を確認し、上限増やしてみた!

投稿日:2020年2月7日 更新日:



マルチスレッドプログラミングをする上で、

今回はスレッドが最大で

いくつ作成できるか検証してみます。


まずは実際に確認してみましょう。



上のコードを動かしてみると、

このようになってしまいます。



スレッドは32752個作成した時点で

それ以上作れなくなってしまいます。

これはreturnでスレッド処理が戻っても

そのスレッド情報は残ったままだからです。



コード中のコメントアウトしてある

pthread_join()
の箇所を追加してあげると、

スレッド情報が完全削除されます。



今回の場合であれば上限に達することなく、

指定したスレッド数だけ

作成出来るようになります。



実は、OS側で作成出来る

最大スレッド数が決められています。



作成できる最大スレッド数は、

物理面と論理的ファクタが関係してきます。




まずはOSによる論理的ファクタです。

これを確認するには、

以下のコマンドを打ちます。


$cat /proc/sys/kernel/threads-max
$cat /proc/sys/kernel/pid_max
$cat /proc/sys/vm/max_max_count



threads-maxは1プロセスが作成できる

最大スレッド数を意味します。


※なぜかこれ値を超えて
 作成できてしまいました。
 なぜだろうか。
 色々調べましたが結局分かりませんでした。



pid_maxはシステム全体で

作成できる数を意味します。



メモリマップは1スレッドに2つ以上

使用するので、現実はこれの

半分以下が作成できることになります。



以上の3つを変更してあげれば

作成可能な最大スレッド数も増えます。



/etc/sysctl.conf に以下の3行を設定します。

kernel.threads-max = 数値
kernel.pid_max = 数値
vm.max_map_count = 数値




上述したようにメモリマップ値は

2倍以上の値をセットしましょう。



/etc/sysctl.confに追加出来たら、

sysctl -p
を打ち込みます。

こうすることでシステムを

オフにしても設定が保持されます。




この状態でもう一度コードを

実行してみましょう。

上限突破しているはずです。



以下のようになりました。



50000まで設定したはずですが、

実際に作成出来た数は49987でした。

ほぼ一緒ということでOKでしょう。




次に物理的な制約面のお話です。

スレッドを作成すると、

スタック領域に確保されます。



つまりスタック領域の最大領域を

超えてスレッドは作成できません。



ユーザが使用できる

スタックサイズは以下で確認できます。



ulimit -a
で確認できます。

私の環境であれば、

スタック領域は約8MBでした。



単純な話、この領域内であれば、

スレッドを作成出来ることになります。



もう少し詳しく話すと、

環境によってはswap領域

作成している場合があります。



swap領域はメモリが足りなくなった際に、

ストレージの一部をメモリとして

使うことが出来る領域のことです。



したがって実際はswap領域も関係してきます。






以上です。

最後まで読んでいただきありがとうございました。


-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.