2008年06月02日

●同期落ち -2008 PC環境 その2-

姫はいいものです姫は


詳細がそこそこ集まってきたかなーというところですが、特定CPU+特定GPU+特定OSの組み合わせで、ROの同期落ちが発生しています。

いろんなエラーに悩まされている人の相談室 その25
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1206458232/
いろんなエラーに悩まされている人の相談室 その26
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1212043849/
あなたのRO環境を晒してみるスレ 20台目
http://gemma.mmobbs.com/test/read.cgi/ragnarok/1209751727/


○条件概要

まだ上記スレ含めて推測ですが

<CPU>
Intel 45nm版Core2DuO
(Q9550, Q9450, Q9300, E8500, E8400, E8200, E8190等が該当。)
<GPU>
GeForce 8800系・GeForce 9xxx系
<OS>
Windows XP

の組み合わせで、一定時間プレイすると同期落ちで落とされる(1時間~数時間程度)現象が発生している様です。


○項目別ポイントと回避方法

<長時間プレイしない>
・1時間から1時間半程度に境界線があるので、それだけ動けば十分という人なら問題ないみたいです。

<CPUを変える>
・上記の通り45nmプロセスで製造された特定のCPUに限定されています。CPUを変えてしまえば起きません。

<GPUを変える>
・GeForceの9xxx世代を回避すればだいたい大丈夫なようです。一部8xxxでも発生するそうですが、そういう場合にはForceware(ドライバ)を169系等、若干古いのにすると回避できる様です。

<OSを変える>
・XPに限定されている様です。win2000の報告数は十分ではないため不明ですが、XPで発生していたハード組み合わせで、Vistaに変更すると直ったという報告があります。


○げんいん(すこしやさしい せつめい)

ROのクライアントとサーバは、一定間隔で起動してから(ログインしてから?)の経過時間をやりとりしています。
これが大幅にずれると…


クライアント:俺起動してから3分10秒経過!
サーバ:3分11秒経過シテイルハズデス、マァイイデショウ

クライアント:俺起動してから10分35秒経過!
サーバ:10分40秒経過シテイルハズデス、怪シイ!怪シイ!切断シマス!

080602_douki.jpg
あたしのペースに合わせない子はキライよ!

と、なります。


特定のハードウェアとソフトウェアの組み合わせ(ROの起動という行為も条件に含む)で、windowsの時計がだんだん遅れてしまうのです。

その結果上記の様な同期ずれが発生し、サーバからぶちんと切断されてしまうという動きになっております。


○原因(もう少し難しい(そして怪しい)説明)と外からつつく的な改善方式

じゃあなんで遅れるのよ!

って言うと、まぁソフトウェアのバグと言ってしまえばそれまでなんですが、以下に示すサイトの通り、CPUがマルチコアになってから、いわゆるCPU時刻、「お前(ら)は今までに刻んだゼロイチの数を覚えているのか?」というのが怪しくなってしまったのです。


http://www.atmarkit.co.jp/flinux/rensai/watch2005/watch12b.html
12月版 カーネルコンフィグの方法が変わる!?(@IT)
※現状のCPU時間は不正確だ の項を参照


で、マルチコアのせいなら、シングルコアにすればいいじゃない、ってのが以下の話で、

895 名前:(^ー^*)ノ~さん[sage] 投稿日:08/05/24(土) 22:02 ID:i0611RTY0

(中略)

以下の設定では症状は改善された。
・boot.iniに/numproc=1を追加
・boot.iniに/onecpuを追加

しかしこれだとマルチコアの恩恵がまったくなくなってしまいます。


で、どうもROのプロセス(とそこから起こされるスレッド)をCPUコア#0に限定すると時計まわりの話が軽減するみたいで、

954 名前:(^ー^*)ノ~さん[sage] 投稿日:08/05/27(火) 18:27 ID:vbnxctW30

恐らくは、RDTSC絡みのワーカースレッド駆動時に、SetThreadAffinityMask()でも仕込めば良いのではと考えるのは浅慮なのかね。
ただそれと併せて、QueryPerformanceCounter()へ内部処理を移行して貰った方が今後悩まなくて済みそうな気配。
ROのクライアント自体が、未だにWin9xでも一応は動作することも考えると、このあたりのスピードヒャック対策は当時のままなのだろうか。

一応、タイマ関連の参考資料
ttp://mcn.oops.jp/wiki/index.php?Develop%2FTimer

955 名前:(^ー^*)ノ~さん[sage] 投稿日:08/05/27(火) 20:58 ID:iBX04gci0

>>954
もし1コア指定で改善するなら、SetThreadAffinityMaskなりSetProcessAffinityMaskで
いけそうではある。それを手動 or モジュールヘッダ修正でやろうとしたのが>>911と>>945。

で、ragexe.exeが起動される瞬間を外部から監視して、プロセスのaffinity maskを変更すれば
どうかなあ、と思って、簡単に検証コードを書いてみた。実行プロセスを監視して、ragexe.exeを
見つけたらaffinity maskを0x01 (CPUコア#0)に変更するだけのプログラム。
ワーカスレッドは親プロセスの動作出来るコアでしか動作出来ないから、ROプロセスを#0限定にして
しまえばクライアント内ワーカスレッドは全て#0で動作するはず。

結果、CPUコア#0だけ負荷100%、#1はアイドルという状態には出来た。
うちはAthlon64X2 + Radeonなので同期落ち自体の検証は出来ないけど、誰か試してみる?

958 名前:(^ー^*)ノ~さん[sage] 投稿日:08/05/28(水) 00:23 ID:qf/DUItp0

>>956
ここのアプロダに投稿しといた。

http://www.mmobbs.com/uploader/files/4857.zip
pass : douki

http://www.geocities.jp/roaf958/

ソースも入れておいた。exeが怖いって人はソース見てコンパイルして試してくれ。

検証用なので簡単にCUIで作ってある。roaf.exeを実行したままROクライアントを実行。
ragexe.exeを見つけたらaffinity maskを強制で0x01にする(CPUコア#0だけ使用)。
タスクマネージャのCPU負荷で#0だけ100%になればOK。
roaf.exe自体の終了はCTRL+Cで。

affinity maskについての話は以下のページを参照。もちろん上記ツール他設定変更のリスクは自己責任でどうぞ。


http://www.atmarkit.co.jp/fwin2k/win2ktips/862affinity/affinity.html
プログラムの実行に使用するCPUを限定させる(@IT)

※ソースは見てみましたがレスの通りのプログラムです。

# ちょうど後ろに座ってる同期がマルチコアの新しいPCで
# 性能測定するまわりの改造をしてて話が被ったのは秘密です。

Posted by youten at 2008年06月02日 09:51
トラックバックURL

このエントリーのトラックバックURL:
http://b2hs.netgamers.jp/mty-tb.cgi/453

コメント