2009年06月16日
間違いだらけの Windows チューニング その2 (IoPageLockLimit)
結構昔から、IoPageLockLimit は 有効かどうか物議を醸しているので、ちょっと調査してみました。
調べてみたのは、Windows 2000RTM(5.0.2195.1)とWindows 2000SP4(5.0.2195.7133)とWindows XP SP3(5.1.2600.3427) のカーネルです。
調べてみたのは、Windows 2000RTM(5.0.2195.1)とWindows 2000SP4(5.0.2195.7133)とWindows XP SP3(5.1.2600.3427) のカーネルです。
以下は NTOSKERNELが参照するすべての Session Manager のレジストリ内容です。(プログラムのソースから抜粋したので多分大丈夫でしょう)
*緑背景は、初期設定でWin2000に存在しないレジストリ。
見てのとおり、XPSP3 やWin2000SP4 では IoPageLockLimit は参照されていません。よって、効果はあるはず無いのです。
ちなみに、効果があるRTMにおける設定だとしても、指定値がほとんどのサイトが間違っています。
NTOSKRNL.exeの ソースを見てみると、デフォルト値は 0x200(512)で 512Kが ロードされます。物理メモリが64MB未満の場合は、物理メモリ-7M(7M引いた値)、64〜512Mの場合は物理メモリ-16M、それ以上のシステムでは(物理メモリ - 64M )が最大のLockLimitになっており、意味が無いと書いています。(ほとんどのサイトはこの減算処理を行っていないです)
後、数値演算系ベンチマークで比較測定しているサイトがありますが、計算系のベンチマークはひとたび走ると、ずっとRAM上に乗りっぱなしなので変化は無いか誤差範囲のはずです。
追記:
1.Windows2000 SP4の全バイナリを検索しましたが、IoPageLockLimit は未使用でした。
2.Windows 2000 RTMのソースを追ってみたのですが、デフォルトで読み込んだ値が4K単位で処理されてるらしい、ただしデフォルト値の 0x200 と バイト単位の処理が内部で混同されてるようで、バグの原因になってる感じがしました。(だから、デフォルトが 512kってのが妖しい)
3.気になったので、Windows NT のCDを引っ張り出してきて、SP6をダウンロードして調べてみました。
NT4 SP1ではIoPageLockLimitは未使用。
NT4 SP4/SP6 では デフォルト値が 0x0080000 になっている(つまり、NT4は確実にバイト単位で指定されている。)が、ちゃんと設定値を MmProbeAndLockPages 関数内で使われているのを確認。
4.Win2000 SP4ではどうなのかを検証してみたところ、MmHighestUserAddress を参照してるような感じ。
どうも処理自体が変わってしまっているようだ。
Win2000RTM
Win2000SP4
WinXPSP3
関連記事:
間違いだらけの Windows チューニング その1
関連サイト:
TechNet IoPageLockLimit
IoPageLockLimit値でファイルアクセスの高速化: Automatic
Liga web log: I/Oバッファ・サイズの最適化は効果なし
Thief's Guild Blog: windows(2000,XP)でのパフォーマンス測定
メモ帳 朝の2時間半
电脑所用的185个技巧(中)(转帖)_踏雪_新浪博客
XP终极优化2 - 猫猫的日志 - 网易博客
VistaでIoPageLockLimitの検証:らいっちのPC奮闘記
[IoPageLockLimit]をXPで設定する意味はあるのか?
Windows2000sp4の"IoPageLockLimit"の効果検証: TaMaの日記
IoPageLockLimit: ハイウェイに乗る前に
このページの表示が認められていません: IoPageLockLimitの設定値はやみくもに大きくしないほうがいい
Windows Vista チューニング+高速化 -3 - Windows Live
Windows2000高速化のためディスクキャッシュサイズをいじる。 | 煤式自動連結器
Windows2000のパフォーマンスをアップするメモ:STARDUST can be found
熱湯FAQ:「ファッキュー」と読んだらあきまへん? 少し強引に 〜デバイスドライバが利用できる最大のI/Oバッファサイズをメモリに合わせて最適化〜
ITmedia エンタープライズ:Windows Tips「Windows2000/XPのパフォーマンスを向上させる その2」
PC総合研究所 » Windows XPのメモリチューンアップ
2008-09-12 - ときどき日記(Rev1)
WindowsXP高速化のための設定などを公開してみる - GeekなNooblog
Windows XP、レジストリ、2次キャッシュ - RapidShare
| Session Manager | W2KRTM | W2KSP4 | XPSP3 |
| CriticalSectionTimeout | O | O | O |
| Debugger Retries | O | O | O |
| EnableTimerWatchdog | O | O | O |
| ForceNpxEmulation | O | O | |
| GlobalFlag | O | O | O |
| HeapSegmentReserve | O | O | O |
| HeapSegmentCommit | O | O | O |
| HeapDeCommitTotalFreeThreshold | O | O | O |
| HeapDeCommitFreeBlockThreshold | O | O | O |
| LicensedProcessors | O | O | |
| ObjectSecurityMode | O | O | |
| RegisteredProcessors | O | O | |
| PowerPolicySimulate | O | O | O |
| ProtectionMode | O | O | O |
| ResourceTimeoutCount | O | O | O |
| LUIDDeviceMapsDisabled | O | ||
| ResourceCheckFlags | O |
| Session Manager\Memory Management | W2KRTM | W2KSP4 | XPSP3 |
| ClearPageFileAtShutdown | O | O | O |
| DisablePagingExecutive | O | O | O |
| IoPageLockLimit | O | ||
| LargeSystemCache | O | O | O |
| NonPagedPoolQuota | O | O | O |
| NonPagedPoolSize | O | O | O |
| PagedPoolQuota | O | O | O |
| PagedPoolSize | O | O | O |
| PagingFileQuota | O | O | O |
| SecondLevelDataCache | O | O | O |
| SystemPages | O | O | O |
| AllocationPreference | O | ||
| Mirroring | O | ||
| SystemViewSize | O | ||
| SessionImageSize | O | ||
| DontVerifyRandomDrivers | O | O | O |
| DynamicMemory | O | O | O |
| UnusedFileCache | O | ||
| OverCommitSize | O | O | O |
| ModifiedPageLife | O | O | O |
| PoolTag | O | O | O |
| PoolTagOverruns | O | O | O |
| SnapUnloads | O | O | O |
| ProtectNonPagedPool | O | O | O |
| TrackLockedPages | O | O | O |
| TrackPtes | O | O | O |
| VerifyDrivers | O | O | O |
| VerifyDriverLevel | O | O | O |
| VerifyMode | O | ||
| LargePageMinimum | O | O | O |
| EnforceWriteProtection | O | O | O |
| MakeLowMemory | O | O | O |
| WriteWatch | O | O | |
| SessionViewSize | O | O | |
| SessionPoolSize | O | O | |
| PoolUsageMaximum | O | O | |
| MapAllocationFragment | O | O | |
| NonPagedPoolMaximumPercent | O | O | |
| LargeStackSize | O | ||
| LowMemoryThreshold | O | ||
| HighMemoryThreshold | O | ||
| DeadlockRecursionDepthLimit | O | ||
| DeadlockSearchNodesLimit | O | ||
| MinimumStackCommitInBytes | O | ||
| NodeCount | O | ||
| Affinity | O | ||
| AffinityShift | O | ||
| PageMask | O | ||
| PageShift | O |
| Session Manager\Executive | W2KRTM | W2KSP4 | XPSP3 |
| AdditionalCriticalWorkerThreads | O | O | O |
| AdditionalDelayedWorkerThreads | O | O | O |
| PriorityQuantumMatrix | O | O | O |
| MaxTimeSeparationBeforeCorrect | O | O | O |
| Session Manager\Kernel | W2KRTM | W2KSP4 | XPSP3 |
| DpcQueueDepth | O | O | O |
| MinimumDpcRate | O | O | O |
| AdjustDpcThreshold | O | O | O |
| IdealDpcRate | O | O | O |
| XMMIZeroingEnable | O | ||
| ObUnsecureGlobalNames | O | O | |
| ObTracePoolTags | O | ||
| ObTraceNoDeregister | O | ||
| FastSystemCallDisable | O | ||
| PoCleanShutdownFlags | O | ||
| ObCaseInsensitive | O |
| Session Manager\I/O System | W2KRTM | W2KSP4 | XPSP3 |
| CountOperations | O | O | O |
| IoVerifierLevel | O | O | O |
| LargeIrpStackLocations | O | O | O |
| PerfDecreaseAbsoluteModifier | O | ||
| PerfIncreaseTimeValue | O |
| Session Manager\Configuration Manager | W2KRTM | W2KSP4 | XPSP3 |
| RegistryLazyFlushInterval | O | O | |
| RegistryLogSizeLimit | O | ||
| SelfHealingEnabled | O |
| Session Manager\Power | W2KRTM | W2KSP4 | XPSP3 |
| IdleDefaultMinThrottle | O | ||
| IdleThrottleCheckRate | O | ||
| IdleThrottleCheckTimeout | O | ||
| IdleFrom0Delay | O | ||
| IdleFrom0IdlePercent | O | ||
| Idle0TimeCheck | O | ||
| IdleTimeCheck | O | ||
| IdleTo0Percent | O | ||
| IdleDefaultDemotePercent | O | ||
| IdleDefaultDemoteTime | O | ||
| IdleDefaultPromotePercent | O | ||
| IdleDefaultPromoteTime | O |
| Session Manager\Throttle | W2KRTM | W2KSP4 | XPSP3 |
| PerfTimeDelta | O | ||
| PerfCriticalTimeDelta | O | ||
| PerfCriticalFrequencyDelta | O | ||
| PerfIncreasePercentModifier | O | ||
| PerfIncreaseAbsoluteModifier | O | ||
| PerfDecreasePercentModifier | O | ||
| PerfIncreaseMinimumTime | O | ||
| PerfDecreaseTimeValue | O | ||
| PerfDecreaseMinimumTime | O | ||
| PerfDegradeThrottleMinCapacity | O | ||
| PerfDegradeThrottleMinFrequency | O | ||
| PerfMaxC3Frequency | O | ||
| PerfBusyAdjmentThreshold | O | ||
| PerfEnablePackageIdle | O |
| Session Manager\Debug Print Filter | W2KRTM | W2KSP4 | XPSP3 |
| WIN2000 | O | ||
| SYSTEM | O | ||
| SMSS | O | ||
| TUP | O | ||
| FS | O | ||
| CRASHDUMP | O | ||
| CDAUDIO | O | ||
| CLASSPNP | O | ||
| DBOOK | O |
見てのとおり、XPSP3 やWin2000SP4 では IoPageLockLimit は参照されていません。よって、効果はあるはず無いのです。
ちなみに、効果があるRTMにおける設定だとしても、指定値がほとんどのサイトが間違っています。
NTOSKRNL.exeの ソースを見てみると、デフォルト値は 0x200(512)で 512Kが ロードされます。物理メモリが64MB未満の場合は、物理メモリ-7M(7M引いた値)、64〜512Mの場合は物理メモリ-16M、それ以上のシステムでは(物理メモリ - 64M )が最大のLockLimitになっており、意味が無いと書いています。(ほとんどのサイトはこの減算処理を行っていないです)
後、数値演算系ベンチマークで比較測定しているサイトがありますが、計算系のベンチマークはひとたび走ると、ずっとRAM上に乗りっぱなしなので変化は無いか誤差範囲のはずです。
追記:
1.Windows2000 SP4の全バイナリを検索しましたが、IoPageLockLimit は未使用でした。
2.Windows 2000 RTMのソースを追ってみたのですが、デフォルトで読み込んだ値が4K単位で処理されてるらしい、ただしデフォルト値の 0x200 と バイト単位の処理が内部で混同されてるようで、バグの原因になってる感じがしました。(だから、デフォルトが 512kってのが妖しい)
3.気になったので、Windows NT のCDを引っ張り出してきて、SP6をダウンロードして調べてみました。
NT4 SP1ではIoPageLockLimitは未使用。
NT4 SP4/SP6 では デフォルト値が 0x0080000 になっている(つまり、NT4は確実にバイト単位で指定されている。)が、ちゃんと設定値を MmProbeAndLockPages 関数内で使われているのを確認。
4.Win2000 SP4ではどうなのかを検証してみたところ、MmHighestUserAddress を参照してるような感じ。
どうも処理自体が変わってしまっているようだ。
Win2000RTM
| mov ebx,[L0047EEE0] add ecx,ebx cmp ecx,[L0047EF24] <- ここにIoPageLockLimitの値が入っている。 jbe L0043636C mov cl,[ebp-78h] call [HAL.DLL!KfLowerIrql] inc [L0047EE74] L00436362: push C00000A1h jmp L00436223 |
Win2000SP4
| mov edx,[ebp-74h] jg L004390A1 cmp edx,[MmHighestUserAddress] jbe L004390F8 : L004390F8: inc [L00485C94] L004390FE: mov dl,[ebp-78h] push 00000002h pop ecx call ebx (ebx=KeReleaseQueuedSpinLock) mov dword ptr [ebp-54h],C00000A1h jmp L0043914F |
WinXPSP3
| L0044C794: mov ecx,[ebp-40h] cmp ecx,[MmHighestUserAddress] jc L0044C7E7 : L0044C7E7: push 00000002h pop ecx call [HAL.dll!KeReleaseQueuedSpinLock] inc [L0048F5D4] and byte ptr [ebx+06h],FDh push C00000A1h jmp L0044C899 |
関連記事:
間違いだらけの Windows チューニング その1
関連サイト:
TechNet IoPageLockLimit
IoPageLockLimit値でファイルアクセスの高速化: Automatic
Liga web log: I/Oバッファ・サイズの最適化は効果なし
Thief's Guild Blog: windows(2000,XP)でのパフォーマンス測定
メモ帳 朝の2時間半
电脑所用的185个技巧(中)(转帖)_踏雪_新浪博客
XP终极优化2 - 猫猫的日志 - 网易博客
VistaでIoPageLockLimitの検証:らいっちのPC奮闘記
[IoPageLockLimit]をXPで設定する意味はあるのか?
Windows2000sp4の"IoPageLockLimit"の効果検証: TaMaの日記
IoPageLockLimit: ハイウェイに乗る前に
このページの表示が認められていません: IoPageLockLimitの設定値はやみくもに大きくしないほうがいい
Windows Vista チューニング+高速化 -3 - Windows Live
Windows2000高速化のためディスクキャッシュサイズをいじる。 | 煤式自動連結器
Windows2000のパフォーマンスをアップするメモ:STARDUST can be found
熱湯FAQ:「ファッキュー」と読んだらあきまへん? 少し強引に 〜デバイスドライバが利用できる最大のI/Oバッファサイズをメモリに合わせて最適化〜
ITmedia エンタープライズ:Windows Tips「Windows2000/XPのパフォーマンスを向上させる その2」
PC総合研究所 » Windows XPのメモリチューンアップ
2008-09-12 - ときどき日記(Rev1)
WindowsXP高速化のための設定などを公開してみる - GeekなNooblog
Windows XP、レジストリ、2次キャッシュ - RapidShare
トラックバックURL
この記事へのコメント
1. Posted by Win2k Fan 2009年06月16日 22:43
PC初心者のため、いつもはコメントは控えて
記事読ませてもらって勉強しておりますが、
今回のはすごく自分にも分かりやすかったですw
Io・・の設定はあまり意味なかったのですね。
記事読ませてもらって勉強しておりますが、
今回のはすごく自分にも分かりやすかったですw
Io・・の設定はあまり意味なかったのですね。
2. Posted by koteitan 2009年06月17日 16:14
トラックバック有り難うございます。
>ちなみに、効果があるRTMにおける設定だとしても、指定値がほとんどのサイトが間違っています。(ひどいサイトだと単位がバイトになっている…)
とあるのですが、関連記事のMS公式↓では
http://technet.microsoft.com/en-us/library/cc959494.aspx
0x1–0xFFFFFFFF bytes とありますよね。
これが間違いでソース上はkb指定って意味ですかね。なんにせよややこしいですな。
>ちなみに、効果があるRTMにおける設定だとしても、指定値がほとんどのサイトが間違っています。(ひどいサイトだと単位がバイトになっている…)
とあるのですが、関連記事のMS公式↓では
http://technet.microsoft.com/en-us/library/cc959494.aspx
0x1–0xFFFFFFFF bytes とありますよね。
これが間違いでソース上はkb指定って意味ですかね。なんにせよややこしいですな。
3. Posted by blackwingcat 2009年06月17日 16:41
こんにちは
確かに、公式サイトもそうなってますね(^^;
プログラム上ではKBで処理されてるんでKBで指定するのが正しいと思うんですが、ちょっと自信が・・・。
ついでなので、NTのソースコードも現在どうなってるか検証してみましたが、あの説明内容は NTから引用したみたいで、Win2000のRTMの説明としては微妙なようです。
確かに、公式サイトもそうなってますね(^^;
プログラム上ではKBで処理されてるんでKBで指定するのが正しいと思うんですが、ちょっと自信が・・・。
ついでなので、NTのソースコードも現在どうなってるか検証してみましたが、あの説明内容は NTから引用したみたいで、Win2000のRTMの説明としては微妙なようです。
4. Posted by Y.S.K 2009年06月17日 17:32
今回の記事には目から鱗が落ちました。
まさか意味がないとは露知らず…。
意味がないのであれば設定したレジストリの値はさっさと削除してしまった方が良いのでしょうか?
まさか意味がないとは露知らず…。
意味がないのであれば設定したレジストリの値はさっさと削除してしまった方が良いのでしょうか?
5. Posted by blackwingcat 2009年06月17日 18:34
Windows のレジストリ管理の関係で、レジストリは削除しても、その領域が確保されて、サイズは変わらないんです(単に削除済みというマークがつくだけで、メールソフトみたいな感じです)。
だから、最初から設定しないほうがパフォーマンスは良いのでしょうね(^^;
(レジストリを圧縮できるなら削除したほうが良いですが)
だから、最初から設定しないほうがパフォーマンスは良いのでしょうね(^^;
(レジストリを圧縮できるなら削除したほうが良いですが)
6. Posted by koteitan 2009年06月17日 19:44
レス有り難うございます。
未使用だという記事は海外のフォーラムで原典付で
紹介されていました。
http://www.msfn.org/board/index.php?showtopic=25684
This registry key isn't used in Windows 2000 Datacenter Server and is no longer used in Windows 2000 starting with Windows 2000 Service Pack 1
Source: Inside Windows, Third Edition, chapter 7: Memory Management
まぁ、この原典自体が間違い(公式サイトのように^^;)だと何を信じたらいいのかわからなくなり、そうなるとやっぱりソースが一番なんでしょうねぇ。
追調査おつかれさまでした。
未使用だという記事は海外のフォーラムで原典付で
紹介されていました。
http://www.msfn.org/board/index.php?showtopic=25684
This registry key isn't used in Windows 2000 Datacenter Server and is no longer used in Windows 2000 starting with Windows 2000 Service Pack 1
Source: Inside Windows, Third Edition, chapter 7: Memory Management
まぁ、この原典自体が間違い(公式サイトのように^^;)だと何を信じたらいいのかわからなくなり、そうなるとやっぱりソースが一番なんでしょうねぇ。
追調査おつかれさまでした。
7. Posted by 煤 2009年06月18日 09:36
いつもためになる情報をありがとうございます。
トラックバックをいただいたので、早速読んでみると目玉ボヨヨンでした。
今まで民間療法的にWindows2000の高速化をいろいろと試していましたが、今回のようにきちんと検証された裏づけがあると、納得できますネ。
トラックバックをいただいたので、早速読んでみると目玉ボヨヨンでした。
今まで民間療法的にWindows2000の高速化をいろいろと試していましたが、今回のようにきちんと検証された裏づけがあると、納得できますネ。