Aspnetcore: Asp.net Core๊ฐ€ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2017๋…„ 03์›” 21์ผ  ยท  136์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/aspnetcore

Asp.net ์ฝ”์–ด๊ฐ€ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ์ฃผ์— ์›น ์„œ๋น„์Šค๋ฅผ ๋ฉฐ์น  ๋™์•ˆ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 20GB์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. GC๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋ฌธ์ž์—ด ๋ชจ์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์›น ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 124MB๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์›น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 411MB์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค. ์›น ๋ฉ”์†Œ๋“œ๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ–ˆ๋‹ค๋ฉด ๋” ๋†’์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

`

[HttpGet]
๊ณต๊ฐœ ๋น„๋™๊ธฐ ์ž‘์—…> ํ…Œ์ŠคํŠธGC() {
const ๋ฌธ์ž์—ด ๋ฉ”์‹œ์ง€ = "ํ…Œ์ŠคํŠธ";
๋ฐ˜ํ™˜ Enumerable.Repeat(๋ฉ”์‹œ์ง€, 100000000);
}
`

๋‚ด๊ฐ€ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ... ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด UI๋กœ ์ „์†ก๋œ ํ›„์—๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์Šคํฌ๋ฆฐ์ƒท์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด GC๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„์—๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
netcorescreenshot

๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
์–ด์น˜

investigate

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Net Framework๋ฅผ ํ†ตํ•ด Core 2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. _Controller_๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์ง€๋งŒ ๊ฒฐ์ฝ” ์ค„์–ด๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (_WebApi ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค_)

๋ชจ๋“  136 ๋Œ“๊ธ€

@rynowak

๋‚ด๊ฐ€ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ... ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด UI๋กœ ์ „์†ก๋œ ํ›„์—๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํฐ ๊ฐœ์ฒด ํž™์€ ์—ฌ๊ธฐ์—์„œ ๋‹น์‹ ์„ ๋ฌผ๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ 85KB๋ณด๋‹ค ํฐ ๊ฐœ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋ฉด LOH์— ์ €์žฅ๋˜๊ณ  ๋งค์šฐ ๋“œ๋ฌผ๊ฒŒ ์••์ถ• ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ http://stackoverflow.com/questions/8951836/why-large-object-heap-and-why-do-we-care ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค(๋˜๋Š” https://github.com/dotnet/coreclr/blob/master /Documentation/botr/garbage-collection.md#design-of-allocator๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Asp.net ์ฝ”์–ด๊ฐ€ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ์ฃผ์— ์›น ์„œ๋น„์Šค๋ฅผ ๋ฉฐ์น  ๋™์•ˆ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 20GB์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํฐ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ์„œ๋น„์Šค๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๊ธฐ ์ „์— ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฃผ๋ณ€์— ๋ถ™์–ด ์žˆ๋Š” ๊ฐœ์ฒด์™€ ์œ ์ง€๋˜๋Š” ์ด์œ ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Visual Studio๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋คํ”„ ๋˜๋Š” windbg ๋˜๋Š” perfview์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ๋„๊ตฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ).

Enumerable.Repeat๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜์‹ญ์‹œ์˜ค.
๋˜๋Š” GCSettings.LargeObjectHeapCompactionMode(.Net Standard์—์„œ ์ง€์›)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๋‹ต์žฅ์„ ๋ณด๋‚ด ์ฃผ์‹  @davidfowl ๊ณผ @MhAllan ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์˜ˆ๋Š” ์ธ์œ„์ ์ธ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์„ ์ˆ˜ ์žˆ๋„๋ก ๋ˆˆ์— ๋„๋Š” ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง„์‹ค์€ ๋ฌธ์ œ์˜ ๊ฐœ์ฒด์˜ ํฌ๊ธฐ์— ๊ด€๊ณ„์—†์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด @davidfowl , ๋‚ด ์„œ๋น„์Šค๋Š” dapper๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ฒฐ๊ณผ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ํ•œ ํ–‰์˜ ๋ฐ์ดํ„ฐ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ด๋งŒํผ ์ปค์ง€๋Š” ๋ฐ ๋ฉฐ์น ์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด ํŠน์„ฑ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ์‹ค์ œ๋กœ DB๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ณ„์†ํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•˜๋Š” ์ž‘์€ ์ฝ˜์†” ์•ฑ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@zorthgo ํ™•์‹คํžˆ Dapper๊ฐ€ ์•„๋‹Œ๊ฐ€์š”? PHP์—์„œ์™€ ๊ฐ™์ด SQL ์Šคํฌ๋ฆฝํŠธ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์บ์‹œ๋œ SQL ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งŽ์ด ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Dapper๊ฐ€ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/StackExchange/Dapper/blob/fe5c270aceab362c936456087a830e6fe1603cac/Dapper/SqlMapper.cs
๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋Œ€์ƒ์„ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. Visual Studio 2017์€ ์•ฑ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ผ๋ถ€ ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@zorthgo ๋„ค ์ €๋„ ๋ดค์Šต๋‹ˆ๋‹ค. ๋‚ด .net ์ฝ”์–ด ์ฝ˜์†” ์•ฑ์—์„œ servicestack์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด 50MB ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. VS2017 ๋ฒ„๊ทธ์ธ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ž‘์—…๊ด€๋ฆฌ์ž์—์„œ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์€ ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. zorthgo๊ฐ€ api์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ .NET Core์˜ ASP.NET Core์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด .NET Framework์˜ ASP.NET Core์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

MVC 5(System.Web์—์„œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๊ณ  ๋™์ผํ•œ ๋™์ž‘์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ์ƒํƒœ๋กœ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ง„์ „์‹œํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋Œ€์ƒ ํ”„๋ ˆ์ž„์›Œํฌ .NetCoreApp 1.1๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ์ฝ˜์†” ์•ฑ์€ ๊ณต์œ  ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ์ฒด ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. hellorequest๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ƒ˜ํ”Œ ์•ฑ. ์ด ์•ฑ์—์„œ ์‹œ์ž‘ ๋ฉ”๋ชจ๋ฆฌ๋Š” 85mb์ด๊ณ  ๋ฐ˜๋ณต์ ์ธ ์š”์ฒญ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์•ฝ 145mb๊นŒ์ง€ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ 125mb๋กœ ๋–จ์–ด์ง€์ง€๋งŒ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. .Net Core ์ฝ˜์†” ์•ฑ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์ •์ƒ์ ์ธ ๋™์ž‘์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://drive.google.com/open?id=0B0Gm-m-z_U84TU5keWFTMzc1ZWc

3000-5000๋ช…์˜ ํ™œ์„ฑ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋Š” ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋œ Asp.Net Core ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ œ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 15GB๋กœ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ 3์‹œ๊ฐ„๋งˆ๋‹ค AppPool์„ ์žฌํ™œ์šฉํ•˜๋„๋ก IIS๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์‹ญ์‹œ์˜ค.

๋ˆ„๊ตฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ๊ฐ€์ ธ ์™€์„œ ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธ ํ–ˆ์Šต๋‹ˆ๊นŒ?

@davidfowl @Pinox
์ €๋Š” ํฐ ํšŒ์‚ฌ์—์„œ ์ผํ•˜๊ณ  ์žˆ๊ณ  ASP.NET Core๋กœ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ ์ €๋Š” ๋‘๋ ค์› ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ด๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ASP.NET Core ๋˜๋Š” .NET Core(CoreCLR)์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” Full .NET(4.6)์„ ๋Œ€์ƒ์œผ๋กœ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” @ikourfaln .net ์ฝ”์–ด ์ฝ˜์†” ์•ฑ, servicestack(.net ์ฝ”์–ด ๋ฒ„์ „) ๋ฐ kestrel์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•œ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํ•œ ์ˆ˜์ค€๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋ฉˆ์ถ”๊ณ  ๋‹ค์‹œ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์€ ์ƒ˜ํ”Œ๋กœ ์ธก๋ฉด์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋™์ž‘์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ @zorthgo ๋Š” ๊ทธ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋น„์Šทํ•œ ํ–‰๋™์ด ํŠน์ • ์ˆ˜์ค€๊นŒ์ง€ ์‚ฌ์šฉ๋œ ๋‹ค์Œ ๋‚ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ํ–‰๋™์ด๋ฏ€๋กœ ์ฆ๊ฐ€๋ฅผ ๋ฉˆ์ถ˜๋‹ค๋ฉด ๊ทธ์˜ ํŽธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @zorthgo ์˜ˆ์ œ๋ฅผ ํฌํ•จํ•˜๋„๋ก ์ƒ˜ํ”Œ ์•ฑ์„ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ผ๊ฐ€์ง€๋งŒ ๊ฒฐ๊ตญ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

์†Œ์Šค๋ฅผ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์šฉ ๊ฐ์ฒด Any(TestGC ์š”์ฒญ)
{
const ๋ฌธ์ž์—ด ๋ฉ”์‹œ์ง€ = "ํ…Œ์ŠคํŠธ";
๋ฐ˜ํ™˜ Enumerable.Repeat(๋ฉ”์‹œ์ง€, 100000);
}

@ํ”ผ๋…น์Šค
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜†์—์„œ ํ–‰๋™์„ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2.0์˜ ์ด ๋ฒ„๊ทธ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Net Framework๋ฅผ ํ†ตํ•ด Core 2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹โ€‹โ€‹๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. _Controller_๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์ง€๋งŒ ๊ฒฐ์ฝ” ์ค„์–ด๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (_WebApi ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค_)

์•ˆ๋…•,

ASP.NET Core 2์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ๊ฐ€์ ธ์™€ ๋ถ„์„์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ๋•Œ ๋ฌธ์ œ๋Š” OP๊ฐ€ ๋งํ•œ ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์•ฝ 75MB ํ• ๋‹น์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ~750MB๊นŒ์ง€ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ 608MB๋Š” ".NET์— ํ• ๋‹น๋œ ๋ฏธ์‚ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ"์ž…๋‹ˆ๋‹ค.

์•ฑ ์‹œ์ž‘ ์‹œ ์ฒซ ๋ฒˆ์งธ ์Šค๋ƒ…์ƒท:
image

3๋ถ„ ๋ฐ 100๊ฐœ ์š”์ฒญ ํ›„ ๋‘ ๋ฒˆ์งธ ์Šค๋ƒ…์ƒท:
image

์šฐ๋ฆฌ๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Š” ์ž˜๋ชป๋œ ์„ค๊ณ„์ด๋ฉฐ ๊ณง ๊ต์ฒด๋  ์˜ˆ์ •์ž„). ์ด ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ ๊ฐ ํ˜ธ์ถœ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” 40-50%๋งŒ ๊ฐ์†Œํ•˜์ง€๋งŒ(50Mb ์ฆ๊ฐ€, 30-35Mb ๊ฐ์†Œ) ๊ฐ ํ˜ธ์ถœ์€ ๋งค๋ฒˆ 10-15Mb ๋ฒ”์œ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ์„œ๋น„์Šค ํŒจ๋ธŒ๋ฆญ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ŠคํŒ…๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ์„œ๋น„์Šค(20-100 req/s)์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ASP.NET ์ฝ”์–ด 2.0.4
  • ์„œ๋น„์Šค์Šคํƒ.์ฝ”์–ด 1.0.44
  • ์Šคํ‚ค์•„์ƒคํ”„ 1.59.2
  • Docker v17.09.0-ce, Ubuntu 16.04 x64์—์„œ afdb6d4 ๋นŒ๋“œ
  • x4 ์„œ๋ฒ„ @ 40 CPU, 128GB ๋ฉ”๋ชจ๋ฆฌ
  • ์„œ๋ฒ„ GC๊ฐ€ ์ฐธ
  • ๊ฐ Docker ์ปจํ…Œ์ด๋„ˆ๋Š” 12k(mhz) CPU ๊ณต์œ , 8GB ๋žจ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ํ”„๋ŸฐํŠธ ์—”๋“œ ์›น ์„œ๋ฒ„์™€ ์ž‘์—…์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ๊ทธ๋ž˜ํ”„์— ๊ฐ๊ฐ ํ‘œ์‹œ๋จ).

์›น ์„œ๋ฒ„(์ตœ๊ทผ 6์‹œ๊ฐ„)
screen shot 2018-01-13 at 1 06 24 pm

์ž‘์—…์ž(์ง€๋‚œ 6์‹œ๊ฐ„)
screen shot 2018-01-13 at 1 07 55 pm

์„œ๋น„์Šค๊ฐ€ ๊ฐœ์ฒด ์ €์žฅ์†Œ ํ”„๋ก์‹œ๋กœ ์ž‘๋™ํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐœ์ฒด๋ฅผ LOH์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ๋‹ค ํฐ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ œ ์งˆ๋ฌธ์€ ์ด๊ฒƒ์ด ํ˜„์žฌ .NET Core์˜ ์•Œ๋ ค์ง„ ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๊นŒ? LOH๊ฐ€ ์™„์ „ํžˆ ์ •๋ฆฌ๋˜๊ฑฐ๋‚˜ ์กฐ๊ฐํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธด ํ•ด๋„ SOH๋Š” ์ผ๋ฐ˜์ ์ธ ์›น API ๊ฐœ์ฒด๊ฐ€ ์ •๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ œ์•ˆ? ๋‚ด ์„ค์ •์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ–ˆ์ง€๋งŒ ๋ˆˆ์— ๋„๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ServiceStack ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ ํŠน๋ณ„ํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@sebastienros - ์ด์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์‹œ์Šคํ…œ์—์„œ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ๊ด€์ฐฐํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ 2.1์—์„œ๋งŒ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. 2.0์—๋„ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์˜๊ฒฌ์€ ์–ธ๊ธ‰๋œ LOH ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉฐ, ์ด๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ํฐ ์–ด๋ ˆ์ด๋ฅผ ํ’€๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@sebastienros , ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ:

  1. Ants ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ธก์ •ํ–ˆ๋Š”๋ฐ ์ด์— ๋”ฐ๋ฅด๋ฉด LOH ์กฐ๊ฐํ™”๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— LOH ์กฐ๊ฐํ™” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  2. .net core 2.1์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Kestrel์ด Span์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ??
  3. ์–ด๋ ˆ์ด๋ฅผ ํ’€๋งํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? GCSettings.LargeObjectHeapCompactionMode.CompactOnce๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

.net core 2.1์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Kestrel์ด Span์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ Kestrel์— ์žˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์–ด๋ ˆ์ด๋ฅผ ํ’€๋งํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? GCSettings.LargeObjectHeapCompactionMode.CompactOnce๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@jkotas @Maoni0 ์กฐ์–ธ์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? @sinapis ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ redgate ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ฅธ LOH๋Š” ๊ฑฐ์˜ ๋น„์–ด ์žˆ์ง€๋งŒ ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ 1GB ์ด์ƒ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ ์„ ์ˆ˜์ง‘ํ•˜๊ณ  perfview๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. Vance์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด .NET ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋งŽ์€ ์ž์Šต์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://www.bing.com/search?q=.NET%20memory%20leak%20perfview .

https://github.com/dotnet/coreclr/blob/master/Documentation/project-docs/linux-performance-tracing.md ์—๋Š” ์ถ”์  ์ˆ˜์ง‘์„ ์œ„ํ•œ Linux ๊ด€๋ จ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์—†๊ณ  GC๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ๋งŒ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Windows ์ž‘์—… ๊ฐœ์ฒด ๋˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. GC๋Š” ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ๊ณ ๋ คํ•˜์—ฌ ์ œํ•œ์— ๊ฐ€๊นŒ์šธ ๋•Œ ๋” ์ ๊ทน์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋˜๋Š” ์„œ๋ฒ„ GC์—์„œ ์›Œํฌ์Šคํ…Œ์ด์…˜ GC๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ GC๊ฐ€ ํ›จ์”ฌ ๋” ๋†’์€ ํ”ผํฌ ์ž‘์—… ์ง‘ํ•ฉ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๋“œ๋ฌธ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. Workstation์€ ๋” ๋†’์€ ํ”ผํฌ ์ž‘์—… ์ง‘ํ•ฉ์ด ๋‚ฎ์ง€๋งŒ ์ฒ˜๋ฆฌ๋Ÿ‰๋„ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•,

ํ”„๋กœ๋•์…˜์—์„œ .Net Core Web API์™€ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ .Net Core 2.0.3์ด ํฌํ•จ๋œ Windows Server 2016์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋จธ์‹ ์€ 28๊ฐœ์˜ CPU ์ฝ”์–ด์™€ 24GB์˜ RAM์ด ์žˆ๋Š” Hyper-V VM์ž…๋‹ˆ๋‹ค. IIS ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ’€์„ ์ถฉ๋ถ„ํžˆ ์ž์ฃผ ์žฌํ™œ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฐ๊ตญ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ(์ „์ฒด ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ์˜ >=95%)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด CPU ์‚ฌ์šฉ๋Ÿ‰๋„ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๋•Œ๋กœ๋Š” 2%์—์„œ 70%๋กœ). OOM ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ํ’€์„ ์žฌํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ๋ณธ ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ dotnet.exe๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ 98%์˜€์Šต๋‹ˆ๋‹ค).

".Net Memory Porfiler"(SciTech Software)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
image

์ด ๋ถ„์„์ด ์ •ํ™•ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์˜ ์•ฝ 95%๊ฐ€ "์˜ค๋ฒ„ํ—ค๋“œ > ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ"์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ํŽธ์ง‘๊ธฐ๊ฐ€ ํฌ๋Ÿผ์—์„œ ์ด ๋ฒ”์ฃผ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
_"Overhead->Unused"๋Š” ๊ด€๋ฆฌ๋˜๋Š” ํž™์— ๋Œ€ํ•ด .NET ๋Ÿฐํƒ€์ž„์—์„œ ์ปค๋ฐ‹๋œ ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ํ–ฅํ›„ ์ธ์Šคํ„ด์Šค ํ• ๋‹น์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์ง€ํ• ์ง€ OS์— ํ•ด์ œํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„์ด ์‚ฌ์šฉํ•˜๋Š” ๋งŽ์€ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ, ํ• ๋‹น ํŒจํ„ด, ํ”„๋กœ์„ธ์„œ ์ˆ˜, ์„œ๋ฒ„ GC ์‚ฌ์šฉ ์—ฌ๋ถ€ ๋“ฑ๊ณผ ๊ฐ™์€ ์š”์ธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค._

@jkotas ์ถ”์ฒœํ•ด์ฃผ์‹  ๋‚ด์šฉ(Windows ์ž‘์—… ๊ฐœ์ฒด ๋ฐ ์›Œํฌ์Šคํ…Œ์ด์…˜ GC๋กœ ์ „ํ™˜)์„ ์ ์šฉํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœ๋•์…˜ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„์—์„œ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌ ํ•ด์š”

@sinapis @ronald7
๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์•ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด์œ ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ์žฌํ˜„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@sebastienros ์•ฑ์„ ๊ณต์œ ํ•  ์ˆ˜ ์—†์ง€๋งŒ PerfView session + memory dump ์—์„œ ์„ธ์…˜์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ค๋ช…: ASP.NET Core 2 Web API๊ฐ€ ์žˆ๊ณ  10์ดˆ์— ๊ฑธ์ณ ๋™์ผํ•œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” 200๋ช…์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด 775๊ฐœ์˜ ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์•ฑ์€ ์ž‘์—… ๊ด€๋ฆฌ์ž์—์„œ ๊ฑฐ์˜ 1GB ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ์ ํ”„ํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋คํ”„๋ฅผ ๋ณด๋ฉด ์•ฝ 18MB๋ฅผ ์…€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

๊ทธ๋ž˜์„œ ์งˆ๋ฌธ์€ ๊ฑฐ์˜ 1GB๊ฐ€ ์–ด๋””๋กœ ๊ฐ”์Šต๋‹ˆ๊นŒ?

@sinapis ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์„ค๋ช…ํ•˜๋Š” ๋™์ž‘์€ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ GC๋Š” ์ตœ๋Œ€ ๋ถ€ํ•˜์—์„œ ํ•„์š”์— ๋”ฐ๋ผ ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค. GC ์„œ๋ฒ„ ๋ชจ๋“œ์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํœด ๊ธฐ๊ฐ„์ด ํ•ด์ œ๋˜๊ณ  ์•ฑ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์˜ˆ์•ฝํ•  ๋ฉ”๋ชจ๋ฆฌ ์–‘์€ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๊ณ„์† ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ํ™•์‹คํžˆ ๋ฌธ์ œ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์•ฑ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•  ๋•Œ๊นŒ์ง€ ๋™์ผํ•œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ๋™์ผํ•œ ๋ถ€ํ•˜๋กœ ์ตœ์†Œํ•œ ์ถฉ๋ถ„ํžˆ ๊ธธ๊นŒ์š”? ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋‹น์‹ ์˜ ํ˜„์žฌ ๋คํ”„๋ฅผ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž‘์—… ์ค‘๊ณผ ์ž‘์—…์ด ๋๋‚  ๋•Œ ๋คํ”„๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @sebastienros

์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„ ์ €๋Š” ์•ฑ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋”๋ฏธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋™์ผํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์ข…์†์„ฑ ์‚ฌ์šฉ)์„ ๋งŒ๋“ค๊ณ  ๋™์ผํ•œ ์‹œ์Šคํ…œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์ด ๋™์ž‘์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„์—์„œ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

ํ•˜๋‚˜์˜ ํ”„๋กœ๋•์…˜ ์„œ๋ฒ„์—์„œ GC ๋ชจ๋“œ๋ฅผ _server_์—์„œ _workstation_์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ง€๊ธˆ๋ถ€ํ„ฐ ๋ช‡ ์‹œ๊ฐ„ ํ›„์— ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 4๊ฐœ์˜ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ํ’€์—์„œ ๋จธ์‹  ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋„ dotnet.exe์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ค„์–ด๋“ค์ง€ ์•Š๊ณ  30๋ถ„์ด ์ง€๋‚˜๋„ ๋™์ผํ•œ ์ˆ˜์ค€์„ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ช‡ ๊ฐ€์ง€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. SCOM์ด 30์ดˆ๋งˆ๋‹ค ๋”๋ฏธ ๋์ ์—์„œ ๋ณด๋‚ธ ํ•˜๋‚˜์˜ ์š”์ฒญ). ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์–ด ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@sinapis ETW ์ถ”์ ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ˆ˜์ˆ˜๊ป˜๋ผ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์œ ๋„๋œ 2์„ธ๋Œ€ GC์—์„œ ๊ฑฐ์˜ ์‚ด์•„๋‚จ์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ปค๋ฐ‹ํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๊ทน๋‹จ์ ์ธ ๊ฒฝ์šฐ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„ LOH ํ• ๋‹น์œผ๋กœ ์ธํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ GC๋งŒ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค) - ๊ฑฐ๊ธฐ์— ์ผ๋ถ€ ํšŒ๊ณ„ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค(๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ ๋ณด๊ณ ๋œ ์ˆซ์ž์˜ ์˜ค๋ฅ˜์ด์ง€๋งŒ ์ด๋ฏธ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์ปค๋ฐ‹ํ–ˆ์Œ์„ ํ™•์ธํ•œ ๊ฒฝ์šฐ ๋” ์ž‘์€ ๊ฐ€๋Šฅ์„ฑ). ๋‚˜์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ™˜์ƒ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด GC์—์„œ ์ผ๋ถ€ ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด(๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ์ปค๋ฐ‹์„ ์ค„ ์ˆ˜ ์žˆ์Œ) ๊ทธ๊ฒƒ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Maoni0 GC ๋กœ๊น…์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•ด์ฃผ์„ธ์š”
ํšŒ๊ณ„ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜์ฆํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ฐ€ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค(๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋„๋ก perfview์— ์ง€์‹œํ• ๊นŒ์š”?)
๋‚˜๋Š” ์ตœ์†Œํ•œ์˜ ์žฌํ˜„์„ ์‹œ๋„ํ•  ๊ฒƒ์ด์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณตํ• ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@sebastienros ๋ฐ”๋ผ๊ฑด๋Œ€ ๋‚˜๋Š” ์˜ค๋Š˜ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋กœ ๋˜ ๋‹ค๋ฅธ ๋คํ”„๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š” @sebastienros @Maoni0 ,

12์‹œ๊ฐ„ ๋™์•ˆ ์›Œํฌ์Šคํ…Œ์ด์…˜ GC ๋ชจ๋“œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹จ์ผ ํ”„๋กœ๋•์…˜ ๋…ธ๋“œ์—์„œ 1์‹œ๊ฐ„ ๋™์•ˆ .Net 2.1 Preview 2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฏธ 2GB ์ด์ƒ์˜ RAM์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

image

์ด ๋™์ผํ•œ ์ปดํ“จํ„ฐ์—์„œ PerfView๋ฅผ ์‹คํ–‰ ์ค‘์ด๊ณ  GC ๋คํ”„๋ฅผ ์ˆ˜์ง‘ ์ค‘์ž…๋‹ˆ๋‹ค. OneDrive ๋งํฌ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ด๋ฉ”์ผ ์ฃผ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ถˆํ–‰ํžˆ๋„ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ง์ ‘ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋œ๋‹ค๋ฉด ๋” ๋งŽ์€ ๋ฉ”ํŠธ๋ฆญ์ด๋‚˜ GC ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@ronald7 _redacted_ @ Maoni0์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š” @sebastienros @Maoni0 ๋ฐฉ๊ธˆ ๋‘ ๊ฐœ์˜ PerfView gcdump์™€ VMMap ํŒŒ์ผ์ด ํฌํ•จ๋œ ์ด๋ฉ”์ผ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ œ ์ชฝ์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋”๋ฏธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋™์ž‘์„ ์žฌํ˜„ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์Šคํฌ๋ฆฐ์ƒท์€ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•œ dotnet core web api ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ฝ 50๊ฐœ์˜ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

memory-profile2

๋ฐฉ๊ธˆ Ubuntu 16.04์—์„œ ์‹คํ–‰๋˜๋Š” ASP.NET Core ์•ฑ์„ 1.1์—์„œ 2.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฝค ์‹ฌํ•ด์„œ OOM ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ปค๋„์ด ์•ฑ์„ ์ž์ฃผ ์ฃฝ์ด๋Š”๋ฐ 1.x๋กœ ๋‹ค์‹œ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ• ๊นŒ ๊ณ ๋ฏผ์ค‘์ž…๋‹ˆ๋‹ค. ์ „ํ˜€ ๋กœ๋“œํ•  ์ˆ˜ ์—†๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Kestrel์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„์—๋„ ์•ฑ์€ ๋‹จ์ผ ์š”์ฒญ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฆ‰์‹œ ์†Œ์ง„ํ•ฉ๋‹ˆ๋‹ค! ์„œ๋ฒ„ ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ASP.NET Core ์•ฑ์— ๋Œ€ํ•œ ์—ฌ๊ธฐ์˜ ์„ค๋ช…์— ๋”ฐ๋ฅด๋ฉด ๋„์›€์ด ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์Šคํƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ASP.NET MVC Core + EF Core... ๋„ˆ๋ฌด ๋ฉ‹์ง„ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋˜๋ฉด ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ˜ํ”Œ์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์˜ ๋‹จ์ˆœ์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

FWIW, ๋‚ด๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ์‹œ์Šคํ…œ์—๋„ .NET Core ์ฝ˜์†” ์•ฑ์ด ์žˆ์œผ๋ฉฐ 2.0 ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ASP.NET Core ๊ด€๋ จ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ฐ€๋Šฅ์„ฑ: https://github.com/aspnet/KestrelHttpServer/issues/2214

@danports GC.Collect()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰๊ฒฉํžˆ ๊ฐ์†Œํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์…จ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‹จ์„œ๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. GC.Collect()(๋˜๋Š” GC.Collect/GC.WaitingForPendingFinalizers/GC.Collect ์‹œํ€€์Šค)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ด๋Š” GC๊ฐ€ ์ด๋ฅผ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†๋„๋ก ๋ผ์ด๋ธŒ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ทธ๋งŒํผ ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@Maoni0 ์•„์ง ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๊ฐ€ GC์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด .NET Core 2.0 ์•ฑ์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ์™€ ๋น„๊ตํ•˜์—ฌ ๋Œ€๋žต 2-3๋ฐฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .NET ์ฝ”์–ด 1.1. ๐Ÿ˜ž

์ง€๊ธˆ์€ .NET Core 1.1๋กœ ๋‹ค์‹œ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ–ˆ์œผ๋ฉฐ ๋‚˜์ค‘์— ์‹œ๊ฐ„์ด ๋” ์žˆ์„ ๋•Œ, ์•„๋งˆ๋„ .NET Core 2.1์ด ์ถœ์‹œ๋œ ํ›„์— ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ €๋Š” 2.0์—์„œ ๋งŽ์€ ๋ฌธ์ œ์— ๋ถ€๋”ชํ˜”๊ณ  ์ด๊ฒƒ์€ ๊ทธ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.)

GC.Collect() ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 200k int์˜ ์‚ฌ์ „์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ASP.NET Core 2.0 ๋ฐ 2.1 Web API๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ๋” ์ด์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ฐ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ๊ณ„์† ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

200K ์ •์ˆ˜(4B)๋ฅผ ๋ฐ˜ํ™˜ ํ•˜๋Š” @Serjster ๋Š” 800KB๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ https://github.com/aspnet/Home/issues/1976#issuecomment -289336916 ์ฃผ์„์— ์„ค๋ช…๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๋ฐฐ์—ด ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ๊ฐ„์— ์žฌ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ์ ์€ ์ฝ”๋“œ๊ฐ€ 64๋น„ํŠธ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด/๋ชฉ๋ก ๋“ฑ์€ 32๋น„ํŠธ์— ๋น„ํ•ด ํฌ๊ธฐ๊ฐ€ ๋‘ ๋ฐฐ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 64๋น„ํŠธ OS์—์„œ ๋ชจ๋“  CPU ์ฝ”๋“œ 32๋น„ํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์‹ค์ˆ˜๋กœ LOH ๋ฌธ์ œ์— ๋ถ€๋”ชํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @Serjster ์™€ ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. asp.net ์ฝ”์–ด(์ตœ์‹  ํ…Œ์ŠคํŠธ์—์„œ 2.1 ์‚ฌ์šฉ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”๋‹๋ผ ์›น API ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ง„๋‹จ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ(๋˜๋Š” ์ฝ”๋“œ์— ์„ค์ •๋œ ํ”„๋กœ์„ธ์Šค ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ ํ™•์ธ) ๋ฐ”์ดํŠธ ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋์ ์— ๋„๋‹ฌํ•˜๋ฉด์„œ ๊ณ„์† ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์ „์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ์ผ ์›น API ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ20,000๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  1. ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 83MB๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ช‡ ์ดˆ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฌธํ•˜๋ฉด 86MB๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ช‡ ์ดˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์„ธ ๋ฒˆ์งธ ๋ฐฉ๋ฌธ์ด 90MB๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‹ค์‹œ - 94MB.
  5. ์ด ์ž‘์—…์„ n๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ๊ฒฐ๊ตญ ์•ฝ 304MB์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ ˆ๋ฒจ์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐœ์ฒด๊ฐ€ ๋‹ค๋ฅธ ํฌ๊ธฐ์˜ ๊ฐœ์ฒด์ธ ๊ฒฝ์šฐ ์œ„์˜ ๋ชจ๋“  ์ˆซ์ž๋Š” ๋” ํฌ๊ฑฐ๋‚˜ ์ž‘์Šต๋‹ˆ๋‹ค(๋ ˆ๋ฒจ ์˜คํ”„ ์–‘ ํฌํ•จ). ๊ทธ๋Ÿฌ๋‚˜ ์„ฑ์žฅ ํŒจํ„ด์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค(์ผ๋ช…, ๋งŽ์€ ์š”์ฒญ ํ›„์— ์ˆ˜ํ‰์ด ๋  ๋•Œ๊นŒ์ง€ ์„ฑ์žฅํ•˜๊ณ  ์„ฑ์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค) .

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— GC.Collect๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด(๊ทธ๋ž˜์„œ ๋ชจ๋“  ๋‹จ์ผ ์š”์ฒญ์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ˆ˜์ค€์€ ํ›จ์”ฌ ๋‚ฎ์ง€๋งŒ ์ˆ˜์ค€์ด ๋–จ์–ด์งˆ ๋•Œ๊นŒ์ง€ ์—ฌ์ „ํžˆ ์„ฑ์žฅ ๊ธฐ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์Šค๋ƒ…์ƒท์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๊ฐœ์ฒด ์ˆ˜์™€ ํž™ ํฌ๊ธฐ๊ฐ€ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ทธ๋ž˜ํ”„๋Š” ๊ณ„์†ํ•ด์„œ ๋” ๋†’์€ ์ˆซ์ž๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(ํ”„๋กœ์„ธ์Šค๋ฅผ ์žก๊ณ  ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ ์„ค์ • ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค).

๊ทธ๋ž˜ํ”„์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์˜์‹ฌ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ(์ด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ผ๋ถ€ asp.net ์ฝ”์–ด ์‚ฌ์šฉ/์ˆ˜์š” ์˜ˆ์ธก ๋…ผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปค์ง) ์ด๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์†Œ๋น„/๋ˆ„์ถœ๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ™•์ธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง€์‹์ด ๋” ๋งŽ์€ ์‚ฌ๋žŒ์ด ์ฐจ์ž„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ - ๋‹ค์‹œ @davidfowl ์˜๊ฒฌ: ๋“œ๋ฌผ๊ฒŒ ์ˆ˜์ง‘๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ๊ณผ ๊ด€๋ จํ•˜์—ฌ... ์ด๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฝ๋‹ˆ๊นŒ? ์š”์ฒญ ์‚ฌ์ด์— 30์ดˆ ์ด์ƒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ GC๋Š” ์ง„๋‹จ ์ฐจํŠธ์˜ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ๋‚ฎ์ถ”์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์— ๋Œ€ํ•ด ๋ฌด์ง€ํ•˜์ง€๋งŒ ๋‹จ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ 2 - ์ด์ œ david๊ฐ€ ์œ„์— ์ž์„ธํžˆ ๊ฒŒ์‹œํ•œ SO ๋งํฌ๋ฅผ ์ฝ์—ˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ํ™•์‹คํžˆ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด(์ €๋ ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ์žˆ์Œ) ์ด๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ 3 - ํ•˜๋‚˜์˜ ๋Š๋ฆฐ ์งˆ๋ฌธ. ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š”๋ฐ LOH ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ํž™ ํฌ๊ธฐ๊ฐ€ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์‹ค ์ด์ œ์•ผ ์ดํ•ด๊ฐ€ ๊ฐ€๊ฒ ๋„ค์š”. ํž™์€ ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์กฐ๊ฐ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๋”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RemyArmstro Dictionary<int, int> ์„ SortedDictionary<int, int> ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ์ „์€ ์•„๋งˆ๋„ ์ง€์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํ•ญ๋ชฉ์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. SortedDictionary๊ฐ€ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์€ ํ•˜๋‚˜์˜ ํฐ ํ• ๋‹น ๋Œ€์‹  ๋งŽ์€ ์ž‘์€ ํ• ๋‹น์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‘๋‹ต ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ์— ์ง์ ‘ ์ง๋ ฌํ™”ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒฝ์šฐ LOH ํ• ๋‹น์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@wanton7 ๊ท€ํ•˜์˜ ์‘๋‹ต์— ์š”์ ์ด ๋ˆ„๋ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „์€ ๋น™์‚ฐ์˜ ์ผ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ชฉ๋ก, ๋ฐฐ์—ด ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ LOH๊ฐ€ ์ด๊ฒƒ์„ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์ด ๋™์ž‘์€ ์•„๋งˆ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์•ฑ์ด ์ถฉ๋Œํ•ฉ๋‹ˆ๊นŒ?

@Serjster ok ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ์–ด๋‚˜๋Š” ์ž‘์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ํฐ ๋ชฉ๋ก, ์ด์™€ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ API ํ˜ธ์ถœ๋กœ ์ด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ด๋ก€์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ผ์ข…์˜ ์›น API๊ฐ€ ์žˆ๊ณ  ๊ทธ๋กœ๋ถ€ํ„ฐ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ๋•Œ ํŽ˜์ด์ง•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก์— 10000๊ฐœ์˜ ํ•ญ๋ชฉ์„ ๋ณด๋‚ด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋งŽ๊ณ  API ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ์ž์‹ ๋งŒ์˜ ์ฒญํฌ ๋ชฉ๋ก ๋ฐ ์‚ฌ์ „ ๊ตฌํ˜„์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํฐ ๋ฐฐ์—ด์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฒญํฌ ๋ชฉ๋ก์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋  ๋•Œ ํ’€๋ง์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ๊ฐ€ ์ด์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฒญํฌ ๊ตฌํ˜„์„ ๋งŒ๋“ค๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

@wanton7 ์•„์ง ์š”์ ์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ํฌ๊ธฐ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํ•ญ๋ชฉ ๋˜๋Š” ์ž‘์€ ๋ชฉ๋ก์ด๋ผ๋„ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@Serjster ์•„๋งˆ๋„ ๋‚˜๋Š” ๋ˆˆ์ด ๋ฉ€์—ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋‹จ์ผ ํ•ญ๋ชฉ์ด๋‚˜ ์ž‘์€ ๋ชฉ๋ก์„ ๋ณด๋‚ด๋ฉด ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋งํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œํ•˜์…จ๋‚˜์š”?

๋˜๋Š” @RemyArmstro ์—์„œ ๊ทธ๋Š” ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ์‚ฌ์ „์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” corefx๋ฅผ ํ™•์ธํ–ˆ๊ณ  Dictionary๋Š” ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ์ด๊ฒƒ๋“ค์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

private struct Entry
{
  public int hashCode;    // Lower 31 bits of hash code, -1 if unused
  public int next;        // Index of next entry, -1 if last
  public TKey key;           // Key of entry
  public TValue value;         // Value of entry
}

85000 ๋ฐ”์ดํŠธ ํ• ๋‹น์€ LOH ํ• ๋‹น์„ ์ผ์œผํ‚ค๋ฏ€๋กœ int ํ‚ค์™€ int ๊ฐ’์˜ 5313 ํ•ญ๋ชฉ์˜ ์šฉ๋Ÿ‰์„ ๊ฐ€์ง„ Dictionary๋Š” LOH ํ• ๋‹น์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์šฉ๋Ÿ‰์ด ์ˆซ์ž๋‚˜ ํ•ญ๋ชฉ๊ณผ ๊ฐ™์ง€ ์•Š๊ณ  ์†Œ์ˆ˜๋กœ ์šฉ๋Ÿ‰์ด ํ™•์žฅ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. private Dictionary์˜ private Resize ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ฐ ๊ตฌ์กฐ์ฒด๋Š” ์ถ”๊ฐ€ ํ• ๋‹น๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํŒจ๋”ฉ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ๋‚ฎ์€ ํ•ญ๋ชฉ๋„ LOH ํ• ๋‹น์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์ „ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด Dictionary.cs

ํŽธ์ง‘: ๊ณ ์ • URL

@wanton7 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊นจ๋‹ฌ์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ์•ˆํƒ€๊นŒ์šด ์ผ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ๋งŽ์ด ์ธ์‹ํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ข€ ๋” ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. :( ๊ฒฐ๊ตญ ์ด ํ• ๋‹น ์ œํ•œ์„ ์‹ค์ œ๋กœ ์œ„๋ฐ˜ํ•˜๋Š” ์˜์—ญ์€ ๋ช‡ ๊ฐœ ๋ฐ–์— ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ ์•ฑ์˜ ํ•ต์‹ฌ์ด๋ฏ€๋กœ ํ˜„์žฌ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ด ํฌ๋ฆฌํ”„๊ฐ€ ๊ฐ์ง€๋˜๋Š” ๋‹ค๋ฅธ ์˜์—ญ์„ ์ฐพ์•„๋‚ด์‹ญ์‹œ์˜ค. ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ๊ณง ๋ฐœ์ƒํ•˜๋ฉฐ ์ฒญํฌ IList<T> ๊ตฌํ˜„์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„ํŠธ ์‹œํ”„ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ์— ์•ฝ๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์‹ฑ์— ๋น„ํŠธ ์‹œํ”„ํŠธ์™€ ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ํฐ ์ฒญํฌ์™€ ๋” ์ž‘์€ ์ฒญํฌ ์ค‘ ์–ด๋Š ๊ฒƒ์ด GC์— ๋” ์œ ์ตํ•œ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. 1KB์—์„œ 64KB ์‚ฌ์ด์˜ ํฌ๊ธฐ. ๋” ์ž‘์€ ์ฒญํฌ๋Š” GC์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ฐธ์กฐ๋ฅผ ์˜๋ฏธํ•˜์ง€๋งŒ ๋” ํฐ ์ฒญํฌ๋Š” ์••์ถ• ๋ฐ ์กฐ๊ฐํ™”์— ๋” ๋‚˜์  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ดํ•ด๋Š” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค - ๋‚˜๋Š” ๋„ˆ๋ฌด ํฌ์ง€ ์•Š์€ ํฌ๊ธฐ๋กœ ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ 4k/8k๋ฅผ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

@Maoni0 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Mono์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋”๋ผ๋„ ๋ถˆ์พŒํ•œ ์ผ์„ ๋‹นํ•˜์ง€ ์•Š๋„๋ก 4KB๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. http://www.mono-project.com/docs/advanced/garbage-collector/sgen/working-with-sgen/ ์„ ์ฝ๊ณ  LOH ์ž„๊ณ„๊ฐ’์ด Mono์—์„œ 8000๋ฐ”์ดํŠธ์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํž™ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€(๋˜๋Š” ๊ฐ์†Œ)ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@sebastienros ์ด๊ฑฐ ํ•œ ๋ฒˆ ๋” ๋ณผ ์ˆ˜ ์žˆ๋‚˜์š”? ์‚ฌ๋žŒ๋“ค์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋” ์ž์„ธํžˆ ์กฐ์‚ฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž์„ธํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋‹ค์Œ์€ ์šฐ๋ฆฌ์˜ ์ƒํ™ฉ์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

  • 1000๊ฐœ์˜ ์ •์ˆ˜ ๊ฐ’์ด ์ €์žฅ๋œ Dictionary<int, int> ๊ฐœ์ฒด๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์ƒ์€ ์—†์Šต๋‹ˆ๋‹ค.
  • .NET Core 2.0 --> 2.1์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • MS Visual Studio 2017์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ:

    public async Task<IActionResult> SampleAction()
    {
        var list = new Dictionary<int, int>();
        for (int n = 0; n < 1000; n++) list.Add(n, n);
        return Ok(list);
    }

์žฌํ˜„ํ•˜๋ ค๋ฉด ์ ๋‹นํ•œ ๋ถ€ํ•˜ ํ˜•ํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Postman์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํด๋ฆญํ–ˆ๊ณ  ์ด ๋™์ž‘์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ค‘๋‹จํ•˜๊ณ  ํž™ ํฌ๊ธฐ๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(GC๋ฅผ ๊ฐ•์ œ ์ ์šฉํ•œ ๊ฒฝ์šฐ์—๋„).

๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ๋„ ์ด๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์ง€๋งŒ .Net Core 2.1(SDK 2.1.302)์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด .net Core API์—์„œ ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Visual Studio 15.8.0 Preview 4๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ์ƒ˜ํ”Œ API ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด .net ์ฝ”์–ด ์ฝ˜์†” ์•ฑ์ด 0.5์ดˆ๋งˆ๋‹ค ๊ธฐ๋ณธ๊ฐ’ GET ๋์ ์— ๋„๋‹ฌํ•˜์—ฌ 2๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ๋Š๋ฆฌ์ง€๋งŒ ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

screenshot
WebApplication1.zip

์Šคํƒ ๊ตํ™˜์—์„œ ์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

https://stackoverflow.com/questions/48301031/why-doesnt-garbage-collector-in-net-core-2-0-free-all-memory

์ด ๋™์ž‘์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœํŒŒ์ผ๋งํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ค๋Š˜ ํ•œ ๋ฒˆ ์‹œ๋„ํ•ด ๋ณด๊ณ  ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ฌ์ง€์–ด ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ GC์—๊ฒŒ ๊ฐ•์ œ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

image

@chrisaliotta ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์— ๋งํฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ํ–‰๋™์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์ด ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์€ ์ฐธ์œผ๋กœ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Eilon @chrisaliotta ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์ด ํ† ๋ก ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š๋Š” .NET์€ ์ž˜ ์•Œ๋ ค์ง„ ๋™์ž‘์ด๋ฉฐ ์ด๊ฒƒ์ด ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„(๋ฐ ์ž ์žฌ์ ์ธ ๋ˆ„์ˆ˜)๋งŒ ์ธก์ •ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ๋„ ์„œ๋ฒ„ GC ๋ชจ๋“œ๋กœ ์ธํ•ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋Š ์ •๋„ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์˜ˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์•„๋ฌด ๊ฒƒ๋„ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

@sebastienros @beef3333 ๊ณผ ๋‚ด๊ฐ€ ๊ด€์ฐฐํ•˜๊ณ  ์žˆ๋Š” ๋™์ž‘์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ? ์ฆ‰, ํž™ ํฌ๊ธฐ๊ฐ€ ๊ฐ์†Œํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Private Bytes๊ฐ€ ๋†’๊ฒŒ ์œ ์ง€๋˜๋Š” ๊ณณ์€ ์–ด๋””์ž…๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ์œ  ํž™ ๊ณต๊ฐ„์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ ์ฆ๋ถ„ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ๊ฐœ์ธ ๋ฐ”์ดํŠธ๊ฐ€ ๊ณ„์† ์ปค์ง€๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์˜ค๋žซ๋™์•ˆ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌดํ•œ์ • ์ฆ๊ฐ€ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žฌํ™œ์šฉ๋˜๋ฉด(์ƒ๋‹นํ•œ ์–‘์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋”๋ผ๋„) ๊ท€ํ•˜์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์ฒจ๋ถ€ํ•œ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ–ˆ๋Š”๋ฐ ๋™์ผํ•œ ์ •ํ™•ํ•œ ๋™์ž‘์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@beef3333 ์ด ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ 2์‹œ๊ฐ„ ๋™์•ˆ ๋กœ์ปฌ์—์„œ 5K RPS์˜ ์†๋„๋กœ ์‹คํ–‰ํ–ˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค(32GB๊ฐ€ ์žˆ๋Š” ์ปดํ“จํ„ฐ์—์„œ 400MB์—์„œ ์ „์ฒด์ ์œผ๋กœ 1MB ์ฐจ์ด). GC๋Š” ์ •๊ธฐ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ดˆ๊ณผ ๊ทผ๋ฌด ์‹œ๊ฐ„์— ์—ฌ๋Ÿฌ ๋คํ”„๋ฅผ ๊ฒ€์‚ฌํ–ˆ์œผ๋ฉฐ ์˜ˆ์ƒ๋Œ€๋กœ ๋‹ค์–‘ํ•œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ˆ˜์ง‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 2.1.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@sebastienros ์ฐพ์•„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์˜ ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” .NET Core ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ผ๋ฐ˜ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์ดˆ๋‹น ํ•จ์ˆ˜ ์š”์ฒญ(RPS)์œผ๋กœ ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„์— ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์šฉ ๋ฐ”์ดํŠธ์˜ ์ฆ๊ฐ€๊ฐ€ ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋น ๋ฅธ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด .NET Core๊ฐ€ ํ‰๊ท  ์š”์ฒญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๊นŒ? true์ธ ๊ฒฝ์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ’€์ด ์žฌ์„ค์ •๋  ๋•Œ๊นŒ์ง€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ RPS๊ฐ€ ๊ฐ์†Œํ•˜๋ฉด ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
asp.net webapi ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์Šคํƒ์€ asp.net mvc, autofac, automapper, castle.dynamicproxy, ์—”ํ‹ฐํ‹ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”์–ด์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋จน์€ ๋‹ค์Œ ์„œ๋น„์Šค ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „์€ 2.1.0์ž…๋‹ˆ๋‹ค.

@atpyk 2.1.1๋กœ ์—…๋ฐ์ดํŠธ. ๊ทธ๊ฒƒ์ด ๋„์›€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ ๊ธฐ์–ต์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ •๋ง๋กœ ํ”„๋กœํŒŒ์ผ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” https://www.jetbrains.com/dotmemory/ ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์•„๋งˆ๋„ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. LOH(Large Object Heap)์— ์‹ค์ œ๋กœ ํ• ๋‹น๋œ ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

32๋น„ํŠธ ๋ชจ๋“œ๋กœ ์‹คํ–‰ ์ค‘์ด์‹ ๊ฐ€์š”? ๋Œ€ํ˜• ๊ฐœ์ฒด ํž™ ํ• ๋‹น(~85000๋ฐ”์ดํŠธ ์ด์ƒ)์€ ์กฐ๊ฐํ™”๋กœ ์ธํ•ด 32๋น„ํŠธ ๋ชจ๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ˆ์™ธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Dictionary๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ํ•œ๊ณ„๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.. ์ด ๋Œ“๊ธ€์„ ํ™•์ธ ํ•˜์„ธ์š” https://github.com/aspnet/Home/issues/1976#issuecomment -393833505

์ „์ฒด .Net Framework์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๋™์ž‘์€ 32๋น„ํŠธ ๋ชจ๋“œ์—์„œ ๋ชจ๋“  CPU ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค์ •์—์„œ 32๋น„ํŠธ ์„ ํ˜ธ๋ฅผ ์„ ํƒ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ์ผ๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •์„ ๊ธฐ๋ณธ 64๋น„ํŠธ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@wanton7 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

2.1.2๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  win-x64๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Microsoft Azure ์›น์•ฑ์— ๋ฐฐํฌํ–ˆ์ง€๋งŒ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. @wanton7
dotnetcorememory

@atpyk ๋ฉ”๋ชจ๋ฆฌ ์Šค๋ƒ…์ƒท(dump_)์„ ๋งŒ๋“ค๊ณ  ๋ถ„์„(Visual Studio, MemoScope)ํ•˜์—ฌ ์–ด๋–ค ๊ฐœ์ฒด๊ฐ€ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋˜๋Š” ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋‘ ๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋น„๊ตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@sabastienros ์ถฉ๋ถ„ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์ด์— ๋Œ€ํ•ด ์šฐ๋ ค๋ฅผ ์ œ๊ธฐํ•˜์—ฌ ๊ท€ํ•˜/MS๊ฐ€ ์‹ค์ œ๋กœ ์ง์ ‘ ๋ถ„์„์„ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ๋””์ž์ธ์— ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์•ฑ์€ ๊ฒฐ๊ตญ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ๊ณผ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋ฉฐ ์ด ๋ชจ๋“  ๊ฒƒ์ด ํ”„๋กœ๋•์…˜ Azure ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@atpyk ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. @sebastienros ๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ณด๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜์‹ญ์‹œ์˜ค.

ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์€ ASP.NET Core๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ฒซ ๋ฒˆ์งธ ๋Œ“๊ธ€์„ ๋‹ค์‹œ ์ฝ๊ณ  ASP.NET MVC์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ASP.NET MVC์™€ ASP.NET Core๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์™€ ASP..NET Core์— ๋Œ€ํ•œ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋ฒ„์ „ ๋ฒˆํ˜ธ์—์„œ ASP.NET Core๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” .net ์ฝ”์–ด MVC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. @wanton7
๊ธฐ์–ต์„ ๋ถ„์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Castle Dynamic Proxy๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
memroy1
memroy2
memroy3
dynamicproxy

@Serjster ํ”„๋กœ๊ทธ๋žจ์ด 32๋น„ํŠธ .NET Core์—์„œ ์‹คํ–‰๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ˆ์™ธ๋กœ ์ธํ•ด ์ถฉ๋Œํ•ฉ๋‹ˆ๊นŒ? ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ LOH ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐํ™”๊ฐ€ ์›์ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
32๋น„ํŠธ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ LOH๋ฅผ ํ”ผํ•˜๊ฑฐ๋‚˜ 64๋น„ํŠธ ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.

์ €๋Š” Azure์— ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ ํ›„์— https://blogs.msdn.microsoft.com/webdev/2018/01/09/64-bit-asp-net-core-on-azure-app ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

@Serjster ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ๋ณด๊ณ ์„œ๊ฐ€ ๋™์ผํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ ๊ฐ๊ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋ก€์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. "๋‚ด ์•ฑ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ๊ฒƒ์€ ํ”„๋ ˆ์ž„์›Œํฌ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๊ฐ ๊ฒฝ์šฐ๊ฐ€ ์‹ค์ œ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹น์‹ ์˜ ๊ธฐ์–ต์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด "๋‚˜๋Š” ๋ฏฟ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋Œ€๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ์„ค๋ช… ํ›„์— ํ•ด๊ฒฐ๋˜์…จ๋‚˜์š”? ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@sebastienros ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ ์ฐพ์€ ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๊ณ„์† ์ฆ๊ฐ€ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ASP.NET ์ฝ”์–ด๊ฐ€ ๋” ๋งŽ์€ ๊ฒƒ์„ ์žก์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ฒฝํ—˜์  ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ์ง€์†์ ์œผ๋กœ ๋” ๋งŽ์€ ๊ฒƒ์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ ์—์„œ ๊ฑฐ์˜ ๋‚˜์—๊ฒŒ ํƒ์š•์Šค๋Ÿฌ์›Œ ๋ณด์ด์ง€๋งŒ ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , @Serjster ์š”์ ์€ ์—ฌ๊ธฐ์— ๋ถ„๋ช…ํžˆ ์•ฝ๊ฐ„์˜ ํ˜ผ๋ž€์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณ„์† ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ ASP.NET ๋žœ๋“œ(์ฝ”์–ด 1 ์ด์ „)์—์„œ๋Š” ์ด ๋™์ž‘์„ ๋ณผ ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ ์ด ์ •๋„๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฒ„๊ทธ/๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์›์ธ์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์งˆ๋ฌธ์„ ๊ณ„์†ํ•ด์„œ ๋˜์ง‘๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์›๋ž˜๋Œ€๋กœ ์ˆœํ™˜ํ•˜๋Š” ๋Œ€์‹  ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹ค์ œ๋กœ ๋‹ค๋ฃจ๋Š” ๊ณต์‹ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ช…ํ™•ํžˆํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์›๋ž˜๋Œ€๋กœ ์ˆœํ™˜ํ•˜๋Š” ๋Œ€์‹  ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹ค์ œ๋กœ ๋‹ค๋ฃจ๋Š” ๊ณต์‹ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ช…ํ™•ํžˆํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‘ ๋ฒˆ์งธ. .NET Core 2.1์ด ์ด์ „ ๋ฒ„์ „๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ๋” "๊ธฐํšŒ์ "์ธ ์ด์œ ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@sebastienros ์—ฌ๊ธฐ์—์„œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์š”์•ฝ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? 81๊ฐœ์˜ ๋Œ“๊ธ€์ด ์žˆ์Šต๋‹ˆ๋‹ค - ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ „๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ธ์ƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๊ธฐ์— ๋ชจ๋“  ๊ณ ์œ ํ•œ ๋ฌธ์ œ๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์žฌํ˜„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ์–ธ๊ธ‰ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์ถฉ๋ถ„ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์žฌํ˜„์„ ์–ป๊ณ  ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹ ํ•˜๋Š”. ํ˜„์žฌ ์ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ฐ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ๋” ์ด์ƒ ์ง€์† ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ณ  ๊ฐ ๋ณด๊ณ ์„œ์— ์ค‘์ ์„ ๋‘” ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ ํŒ”๋กœ์šฐํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๋งํฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— ๋ชจ๋“  ๊ถŒ์žฅ ์‚ฌํ•ญ, ์•Œ๋ ค์ง„ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ(LOB, HttpClient, ...) ๋ฐ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์—ด๋œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋‚œ 6๊ฐœ์›” ๋™์•ˆ Linux ๋ฐ Windows ๋ชจ๋‘์—์„œ Azure์—์„œ ASP.NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ 24์‹œ๊ฐ„ ๋ฐ 7์ผ ๋™์•ˆ ๊ณ„์† ์‹คํ–‰ํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋งค์ผ ๋˜๋Š” ๋งค์ฃผ ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ์ตœ์‹  ASP.NET ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. RPS, ๋Œ€๊ธฐ ์‹œ๊ฐ„, CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ EF Core, MVC ๋ฐ Razor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ƒ๋‹นํ•œ ๋ถ€ํ•˜๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด 50% CPU๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ (๋งค์ผ ๋ณด๊ณ ์„œ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ์ฐพ์•„๋ณด๊ธฐ)์ด ์‚ฌ์ดํŠธ์— ๊ณต๊ฐœ์ ์œผ๋กœ ์—ฌ๊ธฐ์— ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค https://msit.powerbi.com/view?r=eyJrIjoiYTZjMTk3YjEtMzQ3Yi00NTI5LTg5ZDItNmUyMGRlOTkwMGRlIiwidCI6IjcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0NyIsImMiOjV9&pageName=ReportSectioneeff188c61c9c6e3a798

์ด๋ฅผ ํ†ตํ•ด ๊ณผ๊ฑฐ์˜ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ํ˜„์žฌ ์‹œ์Šคํ…œ์— ๊ทผ๋ณธ์ ์ธ ๋ˆ„์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ํ™•์‹ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉฐ ์‹๋ณ„ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋คํ”„ ๋ฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@sebastienros ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์ƒˆ๋กœ์šด "ํƒ์š•์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น" ๋ฌธ์ œ์— ๋” ๊ฐ€๊น๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ตœ์ ํ™” ์ถ”๋ก ์ด ํ›จ์”ฌ ๋” ๊ณต๊ฒฉ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ํ•˜์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์‹ค์ œ๋กœ ํ‰๊ฐ€ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋ณด๊ณ /์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ†ตํ•ฉ๋œ ์„ค๋ช…/์š”์•ฝ์„ ์ œ์‹œํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ธธ์„ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค!

๋ชจ๋“  ๊ฐœ๋ณ„ ๋ณด๊ณ ์„œ๋Š” ๊ฒฉ๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ ๊ฐœ๋ณ„ ํ›„์† ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๊ฒฝ์šฐ ๋‹ซํž™๋‹ˆ๋‹ค. ๋ฃจํ”„์— ๋ณด๊ด€ํ•˜๋ ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ๊ตฌ๋…ํ•˜์‹ญ์‹œ์˜ค.

๋™์‹œ์— ๋ชจ๋“  ๊ถŒ์žฅ ์‚ฌํ•ญ, ์•Œ๋ ค์ง„ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ(LOB, HttpClient, ...) ๋ฐ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‚˜์—ด๋œ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์—„์ฒญ๋‚œ +1์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ ๋‹ค์Œ _๋ฌด์—‡์ด_ ๋ฌธ์ œ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” '๋Š๋‚Œ'์ž…๋‹ˆ๋‹ค. (i) ์ˆ˜์ง‘, (ii) ์ž๊ฐ€ ์ง„๋‹จ ์‹œ๋„ ๋ฐ (iii) ๋คํ”„/๊ฒฐ๊ณผ๋ฅผ MS ํŒ€์— ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ง€์นจ์„ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๋ฌธ์„œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์— ์‹ค์ œ๋กœ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์šธํƒ€๋ฆฌ์˜ ์ธก๋ฉด.

์šฐ๋ฆฌ(๊ฐœ๋ฐœ์ž)๊ฐ€ ์ •๋ณด๋ฅผ ๋” ์ž˜ ์ง„๋‹จ ๋ฐ/๋˜๋Š” ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋Š” ๋ชจ๋‘์—๊ฒŒ ์œˆ-์œˆ(win-win)์ž…๋‹ˆ๋‹ค.

@sebastienros ๋ฅผ ๋“ค์–ด์ฃผ์…”์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์˜ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋™์ผํ•œ ํ”Œ๋žœ ๋‚ด์—์„œ 4๊ฐœ์˜ WebApp์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” B1์ด์—ˆ๊ณ  S2๋กœ ํ™•์žฅ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐ๊ณ ํ”ˆ webapp csproj๋กœ ์„ค์ •ํ•  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

<ServerGarbageCollection>false</ServerGarbageCollection>

๋˜ํ•œ Application Insights๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์œ„์˜ ์„ค์ •์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์—ฌ์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ณ์€?
  2. ์ œ์‹œ๋œ ํ–‰๋™์€ ์ •์ƒ์ž…๋‹ˆ๊นŒ?

memory eaten up

@alexiodan ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ microsoft/dotnet :2.1-runtime AS ๊ธฐ๋ฐ˜์—์„œ Kube์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ์ผ๋ถ€ IHostedServices๋ฅผ ์‹คํ–‰ํ•˜๋Š” .net core 2.1 ์ฝ˜์†”์ด ์žˆ์Šต๋‹ˆ๋‹ค. HealthChecks๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด HealthChecks ๋ฏธ๋“ค์›จ์–ด๋งŒ์œผ๋กœ asp.net์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ microsoft/ dotnet:2.1-aspnetcore-runtime์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” OOM์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์•ˆ์ •ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.๊ฑฐ์ง“ csproj์—์„œ

์šฐ๋ฆฌ์˜ ๋ถ„์„์€ asp.net ์•ฑ์—์„œ GC๊ฐ€ ๋œ ์ž์ฃผ ์ˆ˜์ง‘ํ•˜๊ณ  Finalizer Queue๋„ ๋œ ์ž์ฃผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ GC๊ฐ€ ์ข…๋ฃŒ์ž ๋Œ€๊ธฐ์—ด์„ ์ˆ˜์ง‘ํ•˜๊ณ  ํ†ต๊ณผํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋ฉด

System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();

๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์˜ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋™์ผํ•œ ํ”Œ๋žœ ๋‚ด์—์„œ 4๊ฐœ์˜ WebApp์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” B1์ด์—ˆ๊ณ  S2๋กœ ํ™•์žฅ๋˜์—ˆ์œผ๋ฉฐ ๋ฐฐ๊ณ ํ”ˆ webapp csproj๋กœ ์„ค์ •ํ•  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

<ServerGarbageCollection>false</ServerGarbageCollection>

๋˜ํ•œ Application Insights๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์œ„์˜ ์„ค์ •์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์—ฌ์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ณ์€?
  2. ์ œ์‹œ๋œ ํ–‰๋™์€ ์ •์ƒ์ž…๋‹ˆ๊นŒ?

memory eaten up

์•ˆ๋…•ํ•˜์„ธ์š” @alexordan

AI(net core 2.1์˜ ์›น ์•ฑ)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํ•„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” ์•ฑ์— AI๋ฅผ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜์ง€๋งŒ ์œ„๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ์ค‘์ง€๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? true๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฐ€์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•˜์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

์ด ์Šค๋ ˆ๋“œ์— ์„ค๋ช…๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค๋Š” ์˜๋„๋ฅผ ๋ฐœํ‘œํ•œ ์งํ›„์— ์‹ค์ œ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/sebastienros/memoryleak

์ฐจํŠธ์˜ ํŒจํ„ด์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ์ž‘์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ๊ฒƒ์„ false๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜๋ฅผ ์œ„ํ•ด ์ค‘์ง€๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? true๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฐ€์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•˜์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

ํด๋ผ์ด์–ธํŠธ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘(๋งŽ์€ ์•ฑ๊ณผ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ  ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์—ฌ์œ  ์œ ์ง€์— ์ตœ์ ํ™”๋จ)์€ ์„œ๋ฒ„ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘(์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฐ ๋™์‹œ์„ฑ์— ์ตœ์ ํ™”๋จ)๋ณด๋‹ค ๋” ๊ณต๊ฒฉ์ ์ž…๋‹ˆ๋‹ค.

SGC๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ๋‚ด asp.net ํ•ต์‹ฌ API๊ฐ€ 150mb์—์„œ 48mb๋กœ ๋–จ์–ด์กŒ๊ณ  ๊ทธ ์ดํ›„์—๋Š” ๊ฐ ์š”์ฒญ์— ๋”ฐ๋ผ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ๋กœ์„œ๋Š” ์ด๊ฒƒ์ด ํ”„๋กœ๋•์…˜์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์„ค์ •์ž…๋‹ˆ๊นŒ?

@kgrosvenor ์‹ค์ œ๋กœ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์šฐ์ˆ˜ํ•œ @sebastienros ๊ธฐ์‚ฌ์—์„œ ์ธ์šฉ:

์ผ๋ฐ˜์ ์ธ ์›น ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” CPU ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ GC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์„œ๋ฒ„ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” Workstation GC์— ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋˜๋Š” ์—ฌ๋Ÿฌ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ณ ๋ฐ€๋„).

๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋” ๋งŽ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ €๋Š” asp.net ์ฝ”์–ด๋ฅผ ์ ˆ๋Œ€์ ์œผ๋กœ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค. :)

๋˜ํ•œ .net core 2.1 ์ฝ˜์†” ์•ฑ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช์Šต๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์„ฑ์žฅ. ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‚ฎ์€ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ ์ค‘ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค.

์ด์ชฝ์— ์†Œ์‹์ด ์žˆ๋‚˜์š”? ASP.Net Core v2.1์—์„œ๋„ ๋™์ผํ•œ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹ https://github.com/aspnet/AspNetCore/commit/659fa967a1900653f7a82f02624c7c7995a3b786 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด v3.0์—์„œ ์ˆ˜์ •๋  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

@flo8 2.2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ๋™์ž‘์„ ํ™•์ธ ํ–ˆ์Šต๋‹ˆ๊นŒ? https://dotnet.microsoft.com/download

์ตœ์‹  2.2๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 100๋งŒ int ๋ชฉ๋ก์„ ๋งŒ๋“ค๊ณ  emptyResult()๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์งˆ ๋•Œ๊นŒ์ง€ ์š”์ฒญ๋งˆ๋‹ค ํž™์ด ์ˆ˜๋ฐฑ MB ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ServerGarbageCollection์„ false๋กœ ์„ค์ •ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์ •์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์ง€๋งŒ...

@dre99gsx ์‰ฝ๊ฒŒ ์žฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ๋กœ์ปฌ์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ์ ํŠธ์™€ ๋‹จ๊ณ„๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด ๊ฒฝ์šฐ LOB๋ฅผ ์ฑ„์›Œ์•ผ ํ•˜์ง€๋งŒ gen2์—์„œ ์ˆ˜์ง‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ, OS, ๋ฉ”๋ชจ๋ฆฌ, ๋กœ๋“œ๋ฅผ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค.

์• ๋งคํ•œ ๋‹ต๋ณ€ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ฝค ์‰ฌ์šด:
(Windows 7 64๋น„ํŠธ, 16GB ๋žจ, http ์š”์ฒญ์šฉ Google ํฌ๋กฌ, VS2017 ์ปค๋ฎค๋‹ˆํ‹ฐ) - ์ด ์Šค๋ ˆ๋“œ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ์ต์ˆ™ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒˆ .NET Core 2.2 ์›น ์•ฑ ์‹œ์ž‘
  • ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ์ž์— ๋ฒ”์œ„๊ฐ€ ์ง€์ •๋œ(ํŠน๋ณ„ํ•˜์ง€ ์•Š์€..) ์„œ๋น„์Šค ํด๋ž˜์Šค๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ์˜ Index() ์ž‘์—…์ด ์ด ์„œ๋น„์Šค ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ ์†์„ฑ์œผ๋กœ ๋ชจ๋ธ ํด๋ž˜์Šค(DumbClass)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. public int ID {get; ์„ธํŠธ;}
  • ์„œ๋น„์Šค ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์—์„œ ๋ชฉ๋ก์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์ฑ„์›๋‹ˆ๋‹ค.
    var lst = ์ƒˆ ๋ชฉ๋ก();
    for (i=0; i<10000000; i++) <--- ์ฐธ๊ณ : ์ฒœ๋งŒ ๋ฒˆ ๋ฐ˜๋ณต
    {
    lst.add(์ƒˆ๋กœ์šด DumbClass(){ID=i});
    }
  • ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ๋‹ค์‹œ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ํ•ด๋‹น ๋ชฉ๋ก๋„ ๋‹ค์‹œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...
  • index()๋Š” ์ƒˆ๋กœ์šด EmptyResult()๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ 8์ดˆ๋งˆ๋‹ค ์ž‘์—…์„ ํ˜ธ์ถœํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ์ง€์ผœ๋ณด์‹ญ์‹œ์˜ค. ๋‚ด ์‹œ์Šคํ…œ์—์„œ Private Bytes์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘: 155MB
์ฒซ ๋ฒˆ์งธ http ์š”์ฒญ ๋ฐ›๊ธฐ: 809MB
๋‘ ๋ฒˆ์งธ: 1.2GB
3์œ„: 1.4GB
4์œ„: 1.8GB
5์œ„: 2.1GB... 2.3GB.. 2.6GB...

์ด์ œ ์–ด๋Š ์‹œ์ ์—์„œ GC๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด ์˜ˆ์—์„œ๋Š” 3GB ์•„๋ž˜๋กœ ๋–จ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ServerGC๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด 1GB ์ด์ƒ์œผ๋กœ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ์˜ฌ๋ผ๊ฐ€์„œ 1GB์— ๋จธ๋ฌผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๋Š”์ง€, ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์˜ค, ๋‚˜๋Š” ๋‹น์‹ ์˜ github ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค: "ASP.NET Core์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐ ํŒจํ„ด", ํ™˜์ƒ์ ์ธ ๊ธ€, ๊ธฐ๊ณ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@dre99gsx ๐Ÿ‘‹

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค :) ์งˆ๋ฌธ: ์ „์ฒด ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ GitHub (๋ฌด๋ฃŒ ์ €์žฅ์†Œ) ๋˜๋Š” ์œ ์‚ฌํ•œ ๊ณณ์— ์‹ค์ œ๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ๋†€์•˜๋˜ _์ „์ฒด_ ์ •ํ™•ํ•œ ์ƒ˜ํ”Œ ์•ฑ/๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณต์ œ/๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ TaskManager ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ์Šคํฌ๋ฆฐ์ƒท์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค(Windows์˜ ๊ฒฝ์šฐ - ๋˜๋Š” *nix์˜ ๊ฒฝ์šฐ .. top ๋ช…๋ น ??)

์ง€๊ธˆ๊นŒ์ง€ ๋Œ€๋‹จํ•œ ๋…ธ๋ ฅ!

/me๋Š” ์กฐ์šฉํžˆ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ์‹œ์ฒญํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

https://github.com/sebastienros/memoryleak ์Šค๋ ˆ๋“œ์— ์„ค๋ช…๋œ ๋ชจ๋“  ์ฆ์ƒ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋ฐ๋ชจ ๋ฐ ์„ค๋ช…์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์•Œ๋ฆผ

๋˜ํ•œ ์ด๋Ÿฌํ•œ ๊ฐ ๋ฌธ์ œ๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ dotnet core __์ง€๊ธˆ๊นŒ์ง€__์—์„œ ๋ฒ„๊ทธ๋กœ ์ž…์ฆ๋œ ๊ฒƒ์€ ์—†์ง€๋งŒ ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์ž…๋‹ˆ๋‹ค.

@dre99gsx ์ด์ œ ์ตœ๊ทผ ๋Œ“๊ธ€๋กœ ๋Œ์•„๊ฐ€์„œ ์ด ์Šค๋ ˆ๋“œ์™€ ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•  ๊ฒƒ์„ ์ด‰๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ „ํ™”์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "์ด๊ฒƒ"์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค ;). ๊ท€ํ•˜์˜ ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ์—์„œ ๊ท€ํ•˜๋Š”

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๊นŒ์ง€

๊ทธ๋ž˜์„œ ๋‚˜๋Š” OutOfMemory ์˜ˆ์™ธ๋ฅผ ์˜ˆ์ƒํ•  ๊ฒƒ์ด๊ณ , ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์žฌํ˜„์„ ์š”์ฒญํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์˜๊ฒฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์–ด๋Š ์‹œ์ ์—์„œ GC๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ด ์˜ˆ์—์„œ๋Š” 3GB ์•„๋ž˜๋กœ ๋–จ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งŽ์€ ์ฝ”์–ด์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. GC๋Š” ๊ด€๋ฆฌ๋˜๋Š” ํž™์„ ํ•ด์ œํ•˜์ง€๋งŒ ์ปค๋ฐ‹์„ ์ทจ์†Œํ•  ์ด์œ ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ปค๋ฐ‹๋ฉ๋‹ˆ๋‹ค(์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์Œ). ์ด๊ฒƒ์€ .NET์˜ ํ‘œ์ค€ ๋™์ž‘์ด๋ฉฐ ๋‚ด๊ฐ€ ์ง€์ ํ•œ ๊ธฐ์‚ฌ์—์„œ ์ด๋ฅผ ์‹œ์—ฐํ•ฉ๋‹ˆ๋‹ค. https://blogs.msdn.microsoft.com/maoni/2018/11/16/running-with-server-gc-in-a-small-container-scenario-part-0/ ๋„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ํŒ€์€ ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ๊ตฌ ์ค‘์ด๋ฏ€๋กœ ์ผ๋ถ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 3.0์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šค์Šค๋กœ ์•Œ์•„๋‚ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉด ์›Œํฌ์Šคํ…Œ์ด์…˜ GC ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. "๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ"์ด๋ผ๊ณ  ๋งํ–ˆ์„ ๋•Œ Windows Private Working Set(์ž‘์—… ๊ด€๋ฆฌ์ž)๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ˆ์™ธ"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์˜ณ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘๊ณผ ์ ์  ๋” ์œ ์‚ฌํ•ด์ง€๋ฉฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ! ์•Œ๊ฒ ์–ด. ๋‹ค๋ฅธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ œํ•œ๋˜์ง€ ์•Š๋„๋ก GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๋˜‘๋˜‘ํ•œ ํ•œ ์ €๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ์ œ ์—ญํ• ์„ ํ•˜๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” Asp.net core 2.2์—์„œ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ–ˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆด๋ฆฌ์Šค์™€ ๊ด€๋ จ๋œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ฐ ํ˜ธ์ถœ์€ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ๋งˆ๋‹ค 40-50Mb ๋ฒ”์œ„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

๋˜ํ•œ ์–ธ๊ธ‰๋œ ํƒœ๊ทธ ServerGarbageCollection>false ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
50๋ช…์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ In-Process ๋ชจ๋“œ์—์„œ ์•ฝ 2GB RAM์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(w3wp iis ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค)

๋„์™€์ฃผ์„ธ์š”.

๋„์™€์ฃผ์„ธ์š” !! ankitmori14 ์™€ ๋™์ผํ•œ ๋ฌธ์ œ

@ankitmori14 , @ikourfaln - https://github.com/aspnet/AspNetCore/issues/1976#issuecomment -449675298์—์„œ @sebastienros ์˜ ์˜๊ฒฌ์„ ์ฝ์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์„ธ์š”. ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ž์„ธํ•œ ๋‹จ๊ณ„์™€ ํ•จ๊ป˜ ํ•ด๋‹น ๋™์ž‘์— ๋Œ€ํ•œ ๊ธฐํƒ€ ์ •๋ณด ๋ฐ ์ถ”์  ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•ฑ/ํ”„๋กœ์„ธ์Šค์— ์‹ค์ œ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์ง€ ์•Š๋Š” ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋Š” ์•Š์Œ). ๊ธฐ๋ณธ '์„œ๋ฒ„' ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋ถ€์กฑํ•  ๋•Œ์™€ ๊ฐ™์ด ํ•„์š”ํ•  ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์€ ์•ฑ์ด๋ผ๋„ 2GB ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ 4GB์˜ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•,

์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: https://stackoverflow.com/questions/53868561/dotnet-core-2-1-hoarding-memory-in-linux

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ตฌ์„ฑ๋œ ์ œํ•œ 512Mb์— ๋„๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Kubernetes๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฉฐ์น  ๋™์•ˆ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ž‘์—… ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ์กฐ์‚ฌํ•˜๋ฉด์„œ ๋ฃจํŠธ๊ฐ€ ์—†๋Š” ๋งŽ์€ ๊ฐœ์ฒด๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์–ด์ œ ๋™์‹œ GC(์ฆ‰, ๋ฐฑ๊ทธ๋ผ์šด๋“œ GC)๋„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ๊ณ  ์ง€๊ธˆ์€ ๋” ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ํ™•์ธํ•˜๋ ค๋ฉด ์ ์–ด๋„ ์ผ์ฃผ์ผ์€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<PropertyGroup>
  <ServerGarbageCollection>false</ServerGarbageCollection>
  <ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
</PropertyGroup>

@vtortola ์งˆ๋ฌธ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด 512Mb ์ œํ•œ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๋™์‹œ ์š”์ฒญ ์ˆ˜์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์—ˆ๊ฑฐ๋‚˜ ์•ฑ์ด ๋„˜์–ด์ง€๊ธฐ ์ „์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ ์š”์ฒญ ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋น„ ๋ฐ ๋Œ€๋žต์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  512Mb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋“œ๋‹น 500๊ฐœ์˜ ๋™์‹œ ์›น ์†Œ์ผ“์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 150Mb ๋ฏธ๋งŒ์ธ ์ƒํƒœ์—์„œ 2๊ฐœ์˜ ํฌ๋“œ์™€ 1000๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ๋กœ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 2๊ฐœ์˜ ํฌ๋“œ๊ฐ€ ์žˆ๋Š” ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ 150~300๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ์„ ๊ฐ€์ง€๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ฒ˜์Œ ๋ฉฐ์น  ๋™์•ˆ 100Mb ๋ฏธ๋งŒ์—์„œ ์•ฝ 2์ฃผ ํ›„์— 512Mb์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ˆ˜์™€ ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์—๋Š” ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์˜ 70% ์ด์ƒ์ด 10๋ถ„ ๋™์•ˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

100MB์™€ 512MB์ผ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„์ง ์‚ด์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฟ ํ‚ค, ํ† ํฐ ๋ฐ ๋งŽ์€ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋คํ”„๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ˜„์ง€์—์„œ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ๊ฐœ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๊ฐœ์ฒด์˜ ์ˆ˜๊ฐ€ ๋ถ€ํ•˜์™€ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š”์ง€ ์—ฌ๋ถ€์™€ ๊ด€๋ จํ•˜์—ฌ. 300๊ฐœ์˜ ์—ฐ๊ฒฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ 3K ์—ฐ๊ฒฐ ๊ฐœ์ฒด๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ <ConcurrentGarbageCollection>false</ConcurrentGarbageCollection> ์„ค์ • ํ…Œ์ŠคํŠธ๋Š” ๋„์›€์ด ๋˜์ง€ ์•Š์•˜๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น„์ถ•ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค์˜ Linux ๋คํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋ถ„์„ํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ๋„๊ตฌ๋Š” lldb์ด๊ณ  ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋งค์šฐ ๋ฉ์ฒญํ•ฉ๋‹ˆ๋‹ค.

๋ฒจ์ด ์šธ๋ฆด ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(lldb) eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x00007F8481C8D0B0
generation 1 starts at 0x00007F8481C7E820
generation 2 starts at 0x00007F852A1D7000
ephemeral segment allocation context: none
         segment             begin         allocated              size
00007F852A1D6000  00007F852A1D7000  00007F853A1D5E90  0xfffee90(268430992)
00007F84807D0000  00007F84807D1000  00007F8482278000  0x1aa7000(27947008)
Large object heap starts at 0x00007F853A1D7000
         segment             begin         allocated              size
00007F853A1D6000  00007F853A1D7000  00007F853A7C60F8  0x5ef0f8(6222072)
Total Size:              Size: 0x12094f88 (302600072) bytes.
------------------------------
GC Heap Size:            Size: 0x12094f88 (302600072) bytes.

๊ทธ๋ฆฌ๊ณ  dumpheap -stat ์˜ ๊ฒฐ๊ณผ : https://pastebin.com/ERN7LZ0n

https://stackoverflow.com/questions/53868561/dotnet-core-2-1-hoarding-memory-in-linux ์—์„œ Grafana๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์›น ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” dotnet ์ฝ”์–ด์˜ ๋˜ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@vtortola ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋ถ„๊ธฐํ•˜์ง€ ์•Š๋„๋ก ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? WebSocket์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๊ทธ๊ฒƒ์„ ๋…ํŠนํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ ์–ด๋„ ๋‹น์‹ ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ณ  ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ฃผ๋Š” ์ƒ˜ํ”Œ ์•ฑ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›น ์†Œ์ผ“์œผ๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€, ์›น ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‹œ๊ฐ„์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์™€ ๊ฐ™์€ ์•ฑ์„ ์„ค์ •ํ•˜๊ณ  ๋ฉฐ์น  ๋™์•ˆ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ GC๊ฐ€ ํฌ๋“œ ์ œํ•œ์— ๊ฐ€๊น๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ GC์™€ Kubernetes ๊ฐ„์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@richlander ๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Rich๋Š” ์ด ๊ฒฝ์šฐ(๋งˆ์ง€๋ง‰ 6๊ฐœ์˜ ๋Œ“๊ธ€๋งŒ ์ฝ์œผ์‹ญ์‹œ์˜ค)๊ฐ€ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ์ž‘์—…๊ณผ ๊ด€๋ จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ(๋˜๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ) ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์ปค์—์„œ ์‹คํ–‰๋˜๋Š” 12๊ฐœ ์ด์ƒ์˜ .net ์ฝ”์–ด 2.1 ๋ฐ 2.2 ์ฝ˜์†” ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ปจํ…Œ์ด๋„ˆ์—๋Š” 512mb ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๊ณ  ์›น ์†Œ์ผ“(ํด๋ผ์ด์–ธํŠธ)๋„ ์‚ฌ์šฉํ•˜๋ฉฐ ์•ฑ์€ ~3์ผ๋งˆ๋‹ค ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ์ธ์ฆ๋œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ…Œ์ŠคํŠธ ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ƒฅ --memory ๋˜๋Š” --memory-swap ?

ํ…Œ์ŠคํŠธํ•  ๋•Œ 16MiB์™€ ๊ฐ™์€ ์ดˆ์ €ํ•œ๋„์—์„œ๋„ ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๊ณ  ์•„์ฃผ ์ž˜ ๊ณ ๋ ค๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ๋””์Šคํฌ์—์„œ ๋ฏธ์นœ ๋“ฏ์ด ์Šค์™‘๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  db ์ฟผ๋ฆฌ(EF) ๋ฐ Razor ๋ณด๊ธฐ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•ฑ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@sebastienros ์ ˆ๋Œ€์ ์œผ๋กœ, ๋‚˜๋Š” https://github.com/aspnet/AspNetCore/issues/6803 ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜์—์„œ ํ•œ ์‹œ๊ฐ„ ํ›„์— ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋Š” w3wp.exe ํ”„๋กœ์„ธ์Šค(.NET Core InProcess ์‹คํ–‰)์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. GC๋ฅผ Workstation์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋คํ”„๋ฅผ ๋ถ„์„ํ•œ ํ›„ ์ด์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ( https://github.com/aspnet/AspNetCore/issues/6102)๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์‹  .NET Core ๋Ÿฐํƒ€์ž„(ํ˜„์žฌ 2.2.3)์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ์˜ค๋Š˜ ๋‚˜์ค‘์— ํ”„๋กœ๋•์…˜์—์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด Linux ์ปจํ…Œ์ด๋„ˆ์— ์ œํ•œ์„ ์„ค์ •ํ•˜๋ฉด OOM์ด ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. Visual Studio์˜ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ํ•œ ๊ฐ€์ง€ - Core 2.1 ๋ฐ 2.2๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. Core 2.0์€ ์•„๋‹ˆ์ง€๋งŒ EOL์ž…๋‹ˆ๋‹ค :(

์œ„ ์ฐธ์กฐ

๋Ÿฐํƒ€์ž„ ํŒ€์€ ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” .NET ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ๊ตฌ ์ค‘์ด๋ฏ€๋กœ ์ผ๋ถ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 3.0์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šค์Šค๋กœ ์•Œ์•„๋‚ธ ๊ฒƒ์ฒ˜๋Ÿผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉด ์›Œํฌ์Šคํ…Œ์ด์…˜ GC ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„ ์›Œํฌ์Šคํ…Œ์ด์…˜ ๋ชจ๋“œ๋Š” ์ „ํ˜€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šฌํ”„๊ฒŒ๋„ ์ €๋Š” 3.0 ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‹œ๋„ํ•  ์œ„์น˜์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@PrefabPanda System.Runtime.GCSettings.IsServerGC ์ด false ์ธ์ง€ ํ™•์ธํ•˜์—ฌ ์‹ค์ œ๋กœ ์›Œํฌ์Šคํ…Œ์ด์…˜ GC ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ง„์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋‹จ๊ณ„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@wanton7 - ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ™•์ธํ–ˆ๋Š”๋ฐ ํ™•์‹คํžˆ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@DallanCarr - ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๊ฑฐ์˜ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. Docker ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•œ๋„์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— GC๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 3.0์ด ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋„์ž…ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@richlander ์ด ๋ฌธ์ œ๊ฐ€ 2.2์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๊นŒ?

@PrefabPanda ์‚ฌ์šฉ ์ค‘์ธ ์ •ํ™•ํ•œ ๋„์ปค ๋ฒ„์ „๊ณผ ๋„์ปค ์ž‘์„ฑ ํŒŒ์ผ์„ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์žฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ docker์™€ docker-compose ๋ฒ„์ „ ๊ฐ„์— ์ด ๋ฌธ์ œ๋ฅผ ๋กœ์ปฌ๋กœ ๋ณต์ œํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@sebastienros , @richlander - ๋‹ค์‹œ ์ฐพ์•„์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌ.

๋‚ด Docker ๋ฒ„์ „:

๋„์ปค ๋ฐ์Šคํฌํ†ฑ ์ปค๋ฎค๋‹ˆํ‹ฐ
๋ฒ„์ „ 2.0.0.2(30215)

์—”์ง„: 18.09.1
์ž‘์„ฑ: 1.23.2

์ฒจ๋ถ€๋œ ์ „์ฒด ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ์ฐธ์กฐ:
WebApplication1.zip

ํ…Œ์ŠคํŠธ ์ปฌ ์š”์ฒญ.zip

๋งŒ์ผ์„ ๋Œ€๋น„ํ•˜์—ฌ ๋‚ด Dockerfile:

mcr.microsoft.com/dotnet/core/aspnet:2.2 AS ๊ธฐ๋ฐ˜์—์„œ
WORKDIR /์•ฑ
๋…ธ์ถœ 80
๋…ธ์ถœ 443

mcr.microsoft.com/dotnet/core/sdk:2.2 AS ๋นŒ๋“œ์—์„œ
์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ /src
๋ณต์‚ฌ ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
dotnet ๋ณต์› "WebApplication1/WebApplication1.csproj" ์‹คํ–‰
๋ณต์‚ฌ . .
์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ "/src/WebApplication1"
dotnet ๋นŒ๋“œ "WebApplication1.csproj" ์‹คํ–‰ -c ๋ฆด๋ฆฌ์Šค -o /app

FROM ๋นŒ๋“œ AS ๊ฒŒ์‹œ
RUN dotnet publish "WebApplication1.csproj" -c ๋ฆด๋ฆฌ์Šค -o /app

FROM ๋ฒ ์ด์Šค AS ์ตœ์ข…
WORKDIR /์•ฑ
๋ณต์‚ฌ --from=๊ฒŒ์‹œ /app .
ENTRYPOINT ["๋‹ท๋„ท", "WebApplication1.dll"]

docker-compose.yml:

๋ฒ„์ „: '2.4'

์„œ๋น„์Šค:
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜1:
์ด๋ฏธ์ง€: ${DOCKER_REGISTRY-}์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜1
mem_reservation: 128m
mem_limit: 256m
memswap_limit: 256m
CPU: 1
์ง“๋‹ค:
๋ฌธ๋งฅ: .
dockerfile: WebApplication1/Dockerfile

docker-compose-override.yml:

๋ฒ„์ „: '2.4'

์„œ๋น„์Šค:
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜1:
ํ™˜๊ฒฝ:
- ASPNETCORE_ENVIRONMENT=๊ฐœ๋ฐœ
- ASPNETCORE_URLS=https://+:443;http://+:80
- ASPNETCORE_HTTPS_PORT=44329
- DOTNET_RUNNING_IN_CONTAINER=์ฐธ
- DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=์ฐธ
- ASPNETCORE_preventHostingStartup=true
ํฌํŠธ:
- "50996:80"
- "44329:443"
๋ณผ๋ฅจ:
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/ https:ro
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/us ersecrets:ro

@sebastienros - GC๊ฐ€ ๋ณด๋„๋ก ๋ณ„๋„์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋”๋ผ๋„ ์ €์—๊ฒŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์—์„œ ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ์ปจํ…Œ์ด๋„ˆ/๋จธ์‹ ์˜ ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์—ฌ์ „ํžˆ ํ‘œ์‹œ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@PrefabPanda ๊ฐ€ "๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ–ˆ์„ ๋•Œ ์ •ํ™•ํžˆ ๋ฌด์Šจ ๋œป์ธ์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? GC๋Š” ์ž์—ฐ์ ์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ์œ ๋„๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ง€์ •๋œ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. GC.Collect()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ „์ฒด ์ฐจ๋‹จ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. GC.Collect(2, GCCollectionMode.Default, true, true) ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ „์ฒด ์••์ถ• GC๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ œํ•œ์ด๋‚˜ ๋‹ค๋ฅธ ๊ฒƒ์— ๊ด€๊ณ„์—†์ด ํž™์ด ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ํฌ๊ธฐ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Maoni0 - GC.Collect(2, GCCollectionMode.Default, true, true)๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

256MB๋Š” 2.2์—์„œ๋Š” ๋„ˆ๋ฌด ์ž‘์ง€๋งŒ 3.0์—์„œ๋Š” '๊ณ ์ •'๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋˜ ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ข€ ๋” ์‹คํ—˜์„ ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

GC.Collect(2, GCCollectionMode.Default, true, true)๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๊ฐ์†Œํ•˜์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ํ™˜๊ฒฝ์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. sos ๋ช…๋ น์„ ์ „ํ˜€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์œ ๋„๋œ GC ํ›„์— ํž™์— ๋ฌด์—‡์ด ๋‚จ์•„ ์žˆ๋Š”์ง€ ํ•ญ์ƒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Maoni0 ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Visual Studio์—์„œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ๋ง ๊ทธ๋Œ€๋กœ ๋‚ด๊ฐ€ ์ฒจ๋ถ€ํ•œ ์ด ํ…Œ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์—๋Š” ๋‚ด ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๋ฝ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@Maoni0 - ๋” ๋†’์€ ํ•œ๋„๋ฅผ ์„ค์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. 3.0 ํ”„๋ฆฌ๋ทฐ ํ•ด๋ด์•ผ ์•Œ๋“ฏ

์ด ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์‚ฌ๋ก€๊ฐ€ ๋ณ„๋„์˜ ๋ฌธ์ œ๋กœ ์ฒ˜๋ฆฌ๋œ ์•„์ฃผ ์˜ค๋ž˜๋œ ๋ฌธ์ œ์ด๋ฏ€๋กœ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์ž ๊ทธ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. https://github.com/aspnet/AspNetCore/issues/10200 ์— ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์‹ค์ˆ˜๋กœ ์ด๊ฒƒ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰