尽管这是一个关于 dll 的 .Net 问题,但这是一个 Linux 问题,因为我正在部署到 Linux。
我将数十个不同的 .Net 应用程序部署到一台 Linux 计算机上。
每个单独的应用程序都有多个 .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
[编辑] 为了澄清... AIX 上加载相同 .so 文件的两个进程将共享该 .so 中的只读代码块的物理内存。也就是说,第一个进程从磁盘加载 .so,但第二个进程修复指向同一物理内存的页表。我猜测 Linux 也有类似的优化,但我不确定。
答案1
我可以做什么来将这些文件移动到中央位置,以便将它们加载到共享内存中并减少内存使用量?
这不是共享内存的工作原理/用途。不同进程之间的内存只能通过操作系统的方式共享; mono 根本不怎么参与。在Linux下,凯斯曼可以做到这一点。
为此,mono
必须将其使用的页面注释为MADV_MERGEABLE
,并且您需要启用 KSM(请参阅链接页面)。另请注意,KSM 削弱了进程之间的界限,因此在某些系统上,它可能会出于安全原因而被禁用。
我不知道是否mono
建议内核加载的程序集可以共享(我的猜测是它不会)。我快速检查了源代码是否有任何它知道的指示MADV_MERGEABLE
,但找不到任何指示。这可能是对核心的一个简单而有效的补充,所以我想如果您决定改进它,维护者会欢迎补丁。