. NET x64 w3wp частный рабочий набор в ~ 3 раза больше, чем x86 w3wp - PullRequest
0 голосов
/ 15 января 2020

Я работаю над изменением проекта API. NET 4.6.1 ASP. NET на x64. Я начал смотреть на потребление памяти при запуске того же GET для нашего API и увидел, что у x64 API есть собственный рабочий набор, который примерно в 3 раза больше, чем сайт x86. У меня сложилось впечатление, что процесс x64 будет примерно в 2 раза больше, но я не ожидал увеличения личного рабочего набора в ~ 3 раза.

Первое, что я сделал, - это создал сценарий powershell для получения частного рабочего установить при использовании приложения, чтобы я мог видеть, как память росла со временем. Вот окончательные результаты использования памяти после выполнения одних и тех же действий на обоих веб-сайтах.

DateTime            Name                   Memory
--------            ----                   ------
2020/01/10 07:56:15 qa_12050_API_Checklist 221367KB
2020/01/10 07:56:15 qa_9210_API_21         700185KB

, а вот скрипт

While($true) 
{ 
    ForEach($process in (gwmi win32_process | Where-Object {$_.Name -eq "w3wp.exe" -and ($_.CommandLine -like "*_21*" -or $_.CommandLine -like "*_checklist*") })) 
    { 
        gwmi Win32_PerfRawData_PerfProc_Process | Where-Object {$_.IDProcess -eq $process.ProcessId }  | Select-Object -Property @{Name='DateTime';Expression={[System.DateTime]::Now.ToString('yyyy/MM/dd HH:mm:ss')}},@{Name='Name';Expression={ $process.CommandLine -match '"(qa_\d+_API_.*)" -v' | Out-Null; $Matches[1]; }},@{Name='Memory';Expression={[string]([int]($_.WorkingSetPrivate / 1028)) + "KB"} }
    }; 
    Sleep -Seconds 5; 
}

Я использовал .\PerfView.exe ForceGC <PID>, чтобы увидеть, если он очистит любую эту память, но это не так. После этого я использовал procdump, чтобы получить дамп памяти каждого из приложений и сравнить их. Я использовал !dumpheap -stat и получил следующее.

x86

0:000> !dumpheap -stat
Statistics:
      MT    Count    TotalSize Class Name
...
00606e00    20352     10890500      Free
72b4fcb0   329142     16147928 System.String
Total 1745592 objects

x64

0:000> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
...
00007ffabd5b9798   564669     31517154 System.String
0000004cbc6b8ac0    32579    161281670      Free
Total 3444975 objects

Из этого я могу сказать, что в ~ 2 раза выжило больше объектов, даже после того, как я заставил вывоз мусора. Я также вижу, что эти объекты примерно в 2 раза больше в x64, что я ожидал из-за большей ширины указателя. Чего я не понимаю, так это того, почему объекты начали переживать сборку мусора, которую я форсирую в процессе x64, и почему я вижу такую ​​большую разницу в количестве объектов.

Может кто-нибудь объяснить, почему мы увидим это ~ 3-кратная разница в объеме памяти, используемой этими процессами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...