토론NET Core 구성이 GC 작업 모드 및 메모리에 미치는 영향

4328 단어
문제 일으키기:Asp.netcore가 Kubernetes에 적용되는 메모리 사용률이 너무 높다는 문제 분석
https://mp.weixin.qq.com/s/PqhUzvFpzopU7rVRgdy7eg
이 글에서는 기본적으로 ASP.NET Core 프로그램은 K8s의 Docker에서 메모리 사용률 > = 600MB를 달려서 Docker 용기를 빈번하게 다시 시작합니다.ASP를 검토하고 만들었습니다.NET Core 프로젝트 구성 시스템.GC.서버가 False로 설정되면 메모리가 <=150MB 미만인 실험이 수행됩니다.
이 글은 주로 System이 무엇인지를 설명한다.GC.서버, GC의 두 가지 모드가 있습니다.
GC 작업 모드의 분류:
.NET Core의 두 가지 GC 모드:
Server GC / Workstation GC 

Server GC :
주로 멀티프로세서 시스템에 적용되며 ASP로 사용됩니다.NET Core 숙주의 기본 구성입니다.각 프로세서에 대해 GC Heap을 생성하고 재활용 작업을 병행합니다.이 모델의 GC는 물동량과 비교적 좋은 수축성을 최대화할 수 있다.이런 모델의 특징은 초기에 분배된 메모리가 비교적 크고 가능한 한 메모리를 회수하지 않기 때문에 회수할 때 시간이 많이 걸리고 메모리 파편 정리 작업을 한다.
Workstation GC :
주로 단일 프로세서 시스템에 적용되며 Workstation GC는 가능한 한 쓰레기 회수 과정에서 프로그램의 정지 횟수를 줄여 성능을 향상시킨다.워크로드가 적고 백그라운드(예: 서비스)에서 작업을 자주 수행하지 않는 어플리케이션은 동시 스팸 수거를 비활성화한 상태에서 워크스테이션 스팸 수거를 사용할 수 있습니다.잦은 회수로 장시간 회수를 막는 것이 특징이다.
Concurrent GC 작동 방법:
GC의 작업 방식입니다. 만약 당신이 단일 프로세서의 기계라면, Concurrent 옵션이 True로 설정되어 있어도 효력이 발생하지 않습니다.Server GC와 Workstation GC는 모두 Concurrent GC를 열 수 있으며 GC를 회수하는 과정에서 대부분의 시간 동안 사용자 스레드가 동시에 실행될 수 있습니다.그러나 0세대 1세대의 시간이 너무 짧기 때문에 2세대 대상 GC의 과정에만 영향을 미칠 수 있다.
5.ASP.NET Core Project GC 구성:
ASP.NET CORE 프로젝트에서 System을 통해GC.Server 구성은 GC 모드를 설정합니다. 프로젝트를 만드는 데 사용되는 기본 GC 모드는 다음과 같습니다. System.GC.Server:true(Server GC Concurrent Mode)는 CPU당 GC를 할당합니다.System.GC.서버:false(Workstation GC Concurrent mode) 및 Concurrent=1.
GC 메모리 할당 지침:
GCheap은 0, 1, 2세대의 대상을 저장할 때 시스템에 신청할 때 기본 단위는 Segment이다. 시스템은 지정한 값 크기의 Segment를 저장 대상에 분배하고 이 값은 프로그램의 실제 실행 상황에 따라 GC에서 동적으로 조정한다.바로 Segment의 개념이 있기 때문에 메모리 파편이 되돌아오는 문제가 발생하기 때문에 GC는 쓰레기 회수 과정에서 메모리 정리를 하여 메모리 파편을 줄이고 메모리 사용률을 높인다.
Segment의 크기는 시스템이 32비트인지 64비트인지, 그리고 시스템이 실행 중인 스팸 컬렉터의 유형에 따라 달라집니다. 다음 표에는 할당 시 시스템이 사용하는 기본값이 나열되어 있습니다.
GC Model
32-bit
64-bit
Workstation GC
16 MB
256 MB
Server GC
64 MB
4 GB
Server GC with > 4 logical CPUs
32 MB
2 GB
Server GC with > 8 logical CPUs
16 MB
1 GB
Segment는 2세대 대상을 포함하고 2세대 대상은 메모리가 허용하는 대로 가능한 한 많이 메모리에 신청하고 여러 세그먼트를 사용하여 메모리를 저장한다.GC에서 방출된 메모리의 양은 Segment의 크기에 한정되지만 Segment가 동적 크기로 분배했기 때문에 방출된 대량의 메모리가 차지하는 위치가 메모리 사용률을 떨어뜨린다. 앞에서 말했듯이 이 문제를 해결하기 위해 GC는 메모리 파편을 정리하고 모든 라인의 처리를 중단해야 한다.
.NET Core GC의 구성 모드는 다음과 같습니다.
Concurrent & Workstation GC
false
true

특징: 처리량과 상응하는 속도에서 균형점을 찾는다. GCHeap 수량은 1이고 GC threads는 공간을 분배하는 라인에서 GC 라인의 우선권과 작업 라인은 같은 우선권을 가진다. 작업 라인(비GC 라인)은 GC 작업 과정에서 짧게 여러 번 걸린다.
Background & Workstation GC
false
false

특징: 처리량을 최대화하고gen2GC의 성능을 최적화한다. GCHeap의 수량은 1이고backgroundGC스레드는 작업스레드와 같은 우선순위를 가지지만 프론트데스크톱GC스레드보다 낮다. 작업스레드(비GC스레드)는 GC작업과정에서 짧게 여러 번 걸리기 때문에 병발성능보다 더(Gen2를 겨냥한) 좋다.
Concurrent & Server GC
true
true

특징: 다중 프로세서 기기에서 같은 유형의 요청을 다중 스레드로 처리하여 서비스 프로그램의 토출량을 극대화하기 위해 GC Heap 수량은 프로세서당 1개이고 프로세서마다 전문적인 GC 스레드가 있다. GC 스레드는 최고 스레드의 우선순위를 가지고 있으며 작업 스레드(비GC 스레드)는 GC 작업 과정에서 끊기기 때문이다.
Background & Server GC
true
false

특징:Concurrent & Server GC를 바탕으로gen2GC의 성능을 최적화한다. GCHeap의 수량은 프로세서당 1개이고 프로세서마다 전문적인 GC백그라운드 라인이 있다. 백그라운드 GC라인은 작업 라인과 같은 우선순위를 가지지만 프론트 GC라인보다 낮다. 작업 라인(비GC라인)은 GC가 작업하는 과정에서 짧게 여러 번 걸리기 때문에병렬 성능이 더 좋은 (Gen2를 겨냥한) ephemeral generation의 프론트 데스크톱 GC는 작업할 때 다른 모든 라인을 마운트합니다.
GC의 몇 가지 모델에 대한 분석(참고자료):
https://blogs.msdn.microsoft.com/seteplia/2017/01/05/understanding-different-gc-modes-with-concurrency-visualizer/
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals
https://github.com/aspnet/Home/issues/2056
널리 보급하다
GitHub:https://github.com/maxzhang1985/YOYOFx스타를 모실 수 있다면 함께 교류하는 것을 환영합니다.
.NET Core 오픈 소스 학습: 214741894
전재 대상:https://www.cnblogs.com/maxzhang1985/p/7836088.html

좋은 웹페이지 즐겨찾기