クラスタ環境では、SDBは、非常に同時動作シナリオに直面した場合、時には不可解-10エラーを報告しました。
このエラー-10は、慎重に検討をdiaglogログノードの後、オペレーティングシステムが問題スレッドの失敗を作成して見つけます。
そして、この記事では、問題を特定する方法をご案内することです。
エラーログdiaglog sdbのノード情報
総エラーログ情報を通じ、次の重要な情報のようになります。
新しいエージェントの作成に失敗しました:ブースト:: thread_resource_error:リソースがtemporaily利用できない 新しいエージェント、プローブの作成に失敗しました = 30は、 サブエージェントスレッドの作成に失敗しました、RC = - 10は、 セッションEDUの起動に失敗しました、RC = - 10
それのパラメータによって制限されるスレッドが作成され、一般的なオペレーティングシステムは、2つの主要があります
- ファイルには、制限を処理します
- メモリリソース
- のは、ファイルハンドルから始めましょう
すべてとして知られているLinuxオペレーティングシステムでは、それはプロセス、スレッド、sockerまたは他の、それが最終的にオペレーティングシステムのファイル操作として分類されているかどうか、ファイルです。オペレーティング・システムまたはプロセス、リソースの各アプリケーションは、そのようなスレッドと、socker、ファイルを開く、ファイルを開くには、単純なファイルハンドルとして理解することができます。
だから、それが何であるかを制限扱いますか?実際には、オペレーティングシステムの数、またはファイルを開くことができ、プロセスを制限します。
私たちは、オペレーティング・システムは、ファイルハンドルの数を制限することである方法を見て、この概念を持っています。
オペレーティングシステムでは、魔法のようなコマンドがあります - ulimitの、特にこれらの奇妙なリミット値を設定し、ファイルハンドルのプロセスは、そのうちの一つです。
たとえば、私たちは、ulimitの出力rootユーザーを参照して、-n開いているファイル可能= 1024は、プロセスがハンドルを開くことができるようにする最大のファイルのrootユーザーです。
ここで注意が必要な細部の少しです。
rootユーザーは、Linuxでの管理者ユーザがあるので、rootユーザーのulimit開いているファイルが1024に設定されている場合、そのような他のユーザーとして:などの試験、MySQLのユーザーは、1024よりも大きくなるように設定されているOPONファイルをulimitをしたい、それだけでは十分ではありませんの。
あなたが通常のユーザのulimitの値を変更したい場合は、我々は、知っている必要があります。これは非常に大きく、我々は最初にrootユーザーの値を変更する必要があります。
また、ハンドルの数だけではなく、プロセス内のハンドルの数だけでなく、上限を制限するためのハンドルの数全体のオペレーティングシステム上の制限は、オペレーティングシステムとして、我々は無期限にハンドルを開くことができません。また、それは、オペレーティングシステムの最大数はオープンハンドルに設定された限度を導入されています。
この値は、CentOSの7である、それはを/ proc / sys / fs /ファイルの最大ファイルに格納されています
オペレーティングシステムの合計数が上限に達している処理する場合、プロセスは複数のスレッドを開始していない場合でも、状況を処理するのに十分だろう。
あなたは、オペレーティングシステムを変更する一時的なハンドルの最大数を設定したい場合は、直接エコーが行うことができます 2000000> / procの/ SYS / FS /ファイル-MAXができます。
あなたは永久にハンドルの最大数を設定するには、オペレーティング・システムを変更したい場合は、編集することができ 、/etc/sysctl.confファイルを追加 fs.file-MAX = 2000000をした後、rootユーザーの実行 のsysctl -pをすることができます。
- 私たちは、その後、メモリリソースを紹介します
あなたがLinuxでスレッドを作成するとき、それはメモリを事前に割り当てる必要があるので - また、スレッドに格納されたデータの値のスタックサイズと呼ばれます。
ここで再びプログラムは、メモリはと呼ばれる2つの主要な部分、「ヒープ」と呼ばれる1に分割され、他の人気の科学の知識である「スタック」。「ヒープ」は定数と変数名を保持するために使用されるプログラムであり、「スタック」の数字で特定の変数を保存するためのプログラムです。
まあ、背景の導入は、ビジネスを始めました。
開始時にいえば、不十分なシステムメモリ場合は、スレッドを作成することはできません。その理由は、スレッドが作成されたときに、オペレーティングシステムがスレッドにメモリのブロックを割り当てる必要があるということです、このメモリは、サイズのulimit -sスタックサイズになっているどのくらいのです。オペレーティングシステムおよびスタックサイズの偶数サイズの内容が出ても、スレッドを作成できない場合は失敗します。
ので、少しメモリがなくなっている理由はいくつかの読者は不思議に思われるかもしれませんか?
あなたが密接にオペレーティングシステムを見れば実際には、あなたはそれぞれのプロセスは非常に多くのスレッドがメモリ不足は通常、(このメモリは物理メモリであることに注意)、アプリケーションのメモリ内の各スレッドを実行しているされているので、多くのプロセスがあります非常に。また、これはJVMのOOMを彷彿とさせるが、彼らは私たちが誤解していない、実際には同じものではありません。
ダイレクトし、粗 - この問題を解決するために、比較的単純なのですか?オペレーティング・システムは、より十分なメモリリソースとなり、各スレッドはそんなにメモリを適用しないことを少し調子に-sスタックサイズをulimitのことです。結局のところ、これらのスレッドが最後に実行され、すべての永続的メモリを占有することはできません。
- 知識のあるその他の見所
一部の読者は、このような問題を解決してあるので、はulimit -aコマンドを実行し、パラメータが正しく設定されていることを発見し、又は同意しない理由は?
ここではそれが必要であり、読者は前記しました。
あなたは、ulimitの-aが良い見ますが、どのように使用されるプロセスは、あなたがそれを設定した値である知っているのですか?
だから、問題を解決し、読者を信じている、人は本当にのulimitを確認する必要があります見ることSDBプロセスが有効であるパラメータ。
二つの方法があります
- ノードの起動時にSDBの新しいバージョンでは、読者は、ログを見て行くことができる、独自のulimitのパラメータを出力します、ログdiaglog
- Linuxのシステムレコードの別の、より直接的な、直視。例えばPIDプロセスが内部の内容を表示するので、知っている必要はありません、11910 123456、直接オープン/ procの/ 123456 / limitsファイルを知られ、免疫があります
- コマンドハンドルとスレッドについて
どのように多くのスレッドの合計を開くためのプロセスを表示することができます
- 猫の/ proc / $ PID /ステータス| grepのスレッド
- pstreeは-p $ PID、その後1と同様に、メインプロセス
- その後、トップ-HP $ PID、およびヘッド「スレッド」パラメータを表示します
- PS HH P $ PID | トイレ-l
現在開いているLinuxのハンドルの総数を見ます
lsofの-n | awkは ' {$ 2印刷} ' | 並べ替え | uniqの -c | ソート -nr | awkは ' {$ 1}印刷' | AWK ' {和+ = $ 1}; END {プリント和} '
オープンのプロセスというハンドルの総数を見ます
lsofの-n | awkは ' {$ 2印刷} ' | 黒 | uniqの -c | 黒 NR | grepの $ PID