이것은 dll에 관한 .Net 질문이지만 Linux에 배포 중이므로 Linux 질문입니다.
저는 단일 Linux 시스템에 수십 개의 다양한 .Net 애플리케이션을 배포합니다.
각 개별 응용 프로그램에는 응용 프로그램 간에 동일한 여러 .dll 파일이 있습니다.
내 질문은 다음과 같습니다. .Net/Mono는 별도의 파일임에도 불구하고 동일하다는 것을 인식하여 자동으로 메모리 사용량을 최적화합니까?
이러한 파일을 공유 메모리에 로드하고 메모리 사용량을 줄일 수 있도록 중앙 위치로 이동하려면 어떻게 해야 합니까?
내 질문은 다양한 UNIX 기반 시스템에서 .so 파일이 처리되는 방식에 대한 내 경험을 바탕으로 작성되었습니다.
참고로 다음은 한 애플리케이션의 .dll 덤프입니다.
docroot@machine:~/Deployment/PrimaryApp_2023-07-12_01-16-59$ file *.dll */*.dll
AppConfigSdk.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
AppLoginSdk.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Dapper.Transaction.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Dapper.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
DataAccess.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.AspNetCore.Mvc.Razor.Extensions.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.AspNetCore.Razor.Language.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.CodeAnalysis.CSharp.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.CodeAnalysis.Razor.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.CodeAnalysis.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Microsoft.Extensions.DependencyModel.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
NLog.Extensions.Logging.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
NLog.Web.AspNetCore.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
NLog.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
Newtonsoft.Json.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
System.Data.SqlClient.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
PrimaryApp.dll: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows
cs/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
cs/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
de/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
de/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
es/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
es/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
fr/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
fr/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
it/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
it/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
ja/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
ja/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
ko/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
ko/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
pl/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
pl/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
pt-BR/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
ru/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
ru/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
tr/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
tr/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
zh-Hans/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
zh-Hant/Microsoft.CodeAnalysis.resources.dll: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
[편집] 명확히 하려면... 동일한 .so 파일을 로드하는 AIX의 두 프로세스는 해당 .so의 읽기 전용 코드 블록에 대한 물리적 메모리를 공유합니다. 즉, 첫 번째 프로세스는 디스크에서 .so를 로드하지만 두 번째 프로세스는 동일한 물리적 메모리를 가리키는 페이지 테이블을 수정합니다. Linux에도 비슷한 최적화 기능이 있는 것 같지만 확실하지 않습니다.
답변1
이러한 파일을 공유 메모리에 로드하고 메모리 사용량을 줄일 수 있도록 중앙 위치로 이동하려면 어떻게 해야 합니까?
이것은 공유 메모리가 작동/사용되는 방식이 아닙니다. 서로 다른 프로세스 간의 메모리는 운영 체제를 통해서만 공유될 수 있습니다. 모노는 전혀 참여하지 않습니다. 리눅스에서는,케이스먼이것은 가능합니다.
이렇게 하려면 mono
사용하는 페이지에 주석을 달아야 하며 MADV_MERGEABLE
KSM을 활성화해야 합니다(링크된 페이지 참조). 또한 KSM은 프로세스 간의 경계를 약화시키므로 일부 시스템에서는 보안상의 이유로 비활성화될 수 있습니다.
커널 로드 어셈블리를 공유하는 것이 권장 되는지는 모르겠습니다 mono
(제 생각에는 그렇지 않을 것 같습니다). 소스 코드를 빠르게 확인하여 알고 있는 징후가 있는지 확인했지만 MADV_MERGEABLE
아무것도 찾을 수 없었습니다. 이는 핵심에 간단하면서도 효과적인 추가가 될 수 있으므로 이를 개선하기로 결정하면 관리자가 패치를 환영할 것이라고 생각합니다.