[Users] Resource temporarily unavailable になった時
master @ zio-matrix.net
master @ zio-matrix.net
2014年 11月 30日 (日) 19:27:51 JST
瀧 さん
難波です。
> で、zone.max-swapの方は、swap=VirtualMemory=実質的なメモリ空間 の方な
ので、
> 実際に制限するメモリの事なのですよ。
なるほどです。
/etc/zones/SYSsolaris-kz.xml で
<mcap physcap="2147483648"/>
とあったりします・・・
キャップするのか、まるっと(zone が起動した時点で)渡すのか・・・
渡すみたいですが。
https://docs.oracle.com/cd/E56342_01/html/E54021/goagj.html#scrolltoc
従来の zone なら
<rctl name="zone.max-swap">
<rctl-value priv="privileged" limit="2147483648" action="deny"/>
</rctl>
kernel-zone なら
<mcap physcap="2147483648"/>
という感じなんですかね。
色々弄っていて他に気が付いたのだと
/etc/systems の lwp_default_stksize が効かない、/etc/project だけ?
/etc/project に process.max-stack-size=(basic,67108864,deny) すれば
新規のプロセスについては差し替わる。(再起動しなくていいよ PJ あるから
って Sun/Oracle が言っている奴かな)
prctl -n process.max-stack-size `pgrep named` すると basic が無くて
privileged,system だけ・・・ httpd とかは basic,privileged,system
3つ表示されるのですが、この場合 privileged の縛りなんですかね?
global で process.max-stack-size を上げると、zone も global が
動かしている(同一 kernel)から値が連動している様に見えます。
/etc/systems の rlim_fd_max rlim_fd_cur と同じかな?
zone:/etc/project は無視できるように見えています。
(kernel-zone 出ない限り)
> % swap -sh
> total: 63G allocated + 2.0G reserved = 65G used, 250G available
いいマシン使っていますね。
チューニング系は OS のマニュアルより、ソフトのマニュアルに付帯している
奴の方がいつも詳しい法則は富士通にもありました。
http://software.fujitsu.com/jp/manual/manualfiles/M080091/J2X13110/06Z200/inst03/inst0063.html
# マニュアルにあっても F系の SIer から提案されたことは無い
On 2014/11/29 22:55, 瀧 康史 wrote:
> 瀧です。
>
>
>> 2014/11/29 22:48、master @ zio-matrix.net のメール:
>> リソースじゃぶじゃぶなら、キャッピングなし で良いんですかね。
>> サービスがリソース使い切れるほどチューニング出来てない のが制限かなと。
>> global の swap を食われたのが原因な気がしてきました。
>> SSD なので、物理メモリより swap が小さいので。
>
>
> ここが誤解しやすいのですが、ここでいうswapというのは、
> ディスクとして追加するswapではなくて、
>
> swap=VirtualMemory=実質的なメモリ空間
>
> の事なのですよ。
>
> なので、
>
> swap: 確保されたストレージ
> ではなく、
> swap: 確保されたストレージ+物理メモリ
>
> になるのです。
> たとえば、こんな感じです。
>
> % swap -sh
> total: 63G allocated + 2.0G reserved = 65G used, 250G available
>
> vmstatで出てくるswapはこっちのほうですね。
>
>
>
> 確保されたストレージの方はこちら。
> % swap -lh
> swapfile dev swaplo blocks free
> /dev/zvol/dsk/rpool/swap 287,2 8K 128G 128G
>
>
> ※s10は-hがなかったかもしれませんが。
>
>
>
> で、zone.max-swapの方は、swap=VirtualMemory=実質的なメモリ空間 の方なので、
> 実際に制限するメモリの事なのですよ。
>
>
>
>
>
>> On 2014/11/29 22:37, 瀧 康史 wrote:
>>> 瀧です。
>>>
>>> そっちはダメですね。
>>>
>>>
>>> add capped-memory
>>> set physical=16G
>>> end
>>>
>>> とかですよね。
>>>
>>>
>>> こっちはどうですか?
>>>
>>> add rctl
>>> set name=zone.max-swap
>>> add value (priv=privileged,limit=17179869184,action=deny)
>>> end
>>>
>>> 稼働中のZoneなら、僕が前に書いたブログをみて変えてみてください。
>>> http://kohju.justplayer.com/Tips_Solaris_zones_apply.html
>>>
>>>
>>>
>>>
>>>
>>> capped-memoryってのはrcapdが動いていて、この子がポーリングしながら、メモリの制限をしています。
>>>
>>> たとえば、こんなです。
>>> % rcapadm
>>> state: enabled
>>> memory cap enforcement threshold: 0%
>>> process scan rate (sec): 15
>>> reconfiguration rate (sec): 60
>>> report rate (sec): 5
>>> RSS sampling rate (sec): 5
>>>
>>> で、ポーリング毎に、RSS(レジデントセットメモリ)をみて、
>>> こえていたら、Swapに落としたりするわけです。
>>>
>>> ポーリングである以上、そのポーリング間隔中にメモリを使われてしまったら制限がききませんし、
>>> そもそもSwapに落とされるので、Global側のメモリも使われてしまいます。
>>>
>>>
>>>
>>> Solaris含め、高度なUNIXは、VirtualMemory(=実質的なメモリ)であって、
>>> 物理メモリはその時にテーブルに載っているキャッシュみたいなものです。
>>>
>>> rcapは実質的にはテーブルに載せるものの取捨選択の重み付けをする為のものであって、
>>> 実際にメモリの制限をするためにはswap側(=実質的なメモリ側)の方で制限をかけます。
>>>
>>>
>>>
>>> ・・・・
>>>
>>> っていうか、実際問題、rcapって「よほどの事情」が無い限り「いらない」です。
>>> なぜかというと、全Zoneの間で、1つでも臨界点に達し、rcapdが動き始めたら、
>>> ページスキャナが動き始めて、ものすごくCPUパワーを使い始めます。
>>> その結果、全体が遅くなるので、
>>> 「どうしてもこの子達だけはSwapアウトせずにオンメモリにいて欲しい」
>>> という制御が目的じゃ無い限り、使い道が難しいんですよね。
>>>
>>>
>>>
>>>
>>>
>>>> 2014/11/29 22:24、master @ zio-matrix.net のメール:
>>>>
>>>> 瀧 さん
>>>>
>>>>
>>>> 難波です。
>>>>
>>>> 昔ながらのこれです。
>>>>
>>>> <zone>
>>>> ・・・
>>>> <mcap physcap="17179869184"/>
>>>> ・・・
>>>> </zone>
>>>>
>>>>
>>>> On 2014/11/29 22:21, 瀧 康史 wrote:
>>>>> 瀧です。
>>>>>
>>>>> zonecfgってどうなってます?
>>>>>
>>>>> memory capはどの方法でかけてるんでしょう?
>>>>>
>>>>>
>>>>>> 2014/11/29 19:54、master @ zio-matrix.net のメール:
>>>>>>
>>>>>> 難波です。
>>>>>>
>>>>>>
>>>>>>
>>>>>> 先日 zone 上の Apache 2.4 MPM_worker の cgid に負荷をかけたところ、
>>>>>> global まで波及して?? 大変なことになりました。
>>>>>>
>>>>>> OS : Solaris11.1/SPARC
>>>>>> CGI: 計測用の簡単なもの @ Apache 2.4 MPM_worker cgid
>>>>>> MEM: 16GB を割り当て(zone.cfg でキャップ)
>>>>>>
>>>>>>
>>>>>> (11)Resource temporarily unavailable: apr_thread_create: unable to
>>>>>> create worker thread
>>>>>>
>>>>>> となったので、刺さった か スローダウン だろうな。 という事で
>>>>>> ベンチマークを中断しました。
>>>>>>
>>>>>>
>>>>>> その後、global およびその他の zone で Resource temporarily unavailable
>>>>>> が出るようになって、新規の fork() がほぼ失敗するようになりました。
>>>>>> ほぼ失敗 というのは稀に一部のコマンドは成功する状態です。
>>>>>>
>>>>>> # fork しなくていいプロセス類は応答を返してくれました
>>>>>>
>>>>>>
>>>>>> 調べようとしてもコマンドの応答が Resource temporarily unavailable に
>>>>>> なって出力を得られない 最悪刺さってプロンプトが戻ってこない 自体に
>>>>>> なっていました。
>>>>>>
>>>>>>
>>>>>> Resource temporarily unavailable なのでメモリが枯渇した という方向でも
>>>>>> 調査しましたが、50% の空きがありました。
>>>>>> Resource temporarily unavailable でも時々 top が成功するので
>>>>>> その出力から見ています。
>>>>>>
>>>>>>
>>>>>>
>>>>>> ベンチマークした CGI が無負荷でプロセスが残っていたので、kill
>>>>>> しましたが、改善されず、reboot や shutdown も Resource temporarily
>>>>>> unavailable で受け取らないので -> stop /SYS で止めました。
>>>>>>
>>>>>> # (調べている間に)30分以上待っても解消されませんでした。
>>>>>>
>>>>>>
>>>>>>
>>>>>> kenel-zone にすれば回避できるかな? という感じですが、zone のベンチ
>>>>>> マーク等で似たような経験がある方はいませんか?
>>>>>>
>>>>>> これだと DoS られた挙句、global 巻き添え死 になってしまうので。
>>>>>>
>>>>>>
>>>>>>
>>>>>> 改修案としては
>>>>>>
>>>>>> 1. Solaris11.2 kernel-zone
>>>>>>
>>>>>> 2. zone のメモリキャップ(バグかもしれないので)外す
>>>>>>
>>>>>> 3. MPM_worker をやめる(prefork でも構わないので)
>>>>>>
>>>>>>
>>>>>> と言ったところでしょうか。
>>>>>>
>>>>>>
>>>>>>
>>>>>> Xeon と比べてスレッドの多い SPARC T ですが、いろいろ上手く
>>>>>> 使えていません。
>>>>>>
>>>>>>
>>>>>> たとえば、dnsperf で
>>>>>>
>>>>>> $ /usr/local/nom/bin/dnsperf -c 256 -s SERVER \
>>>>>> -d /usr/local/nom/share/queryfile-example-current_10000
>>>>>>
>>>>>> こんな事すると dnsperf のプロセスが刺さって、延々 LA 256+ という
>>>>>> とてつもない事態になります。(冷却テストにしかならない)
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Users mailing list
>>>>>> Users @ opensolaris.gr.jp
>>>>>> https://mx.opensolaris.gr.jp/mailman/listinfo/users
>>>>>
>>>>
>>>>
>>>
>>
>>
>
Users メーリングリストの案内