Я пытаюсь выделить память для моего приложения.
При переполнении памяти не возникает исключение при запуске приложения в контейнере Linux (на основе «microsoft / dotnet: 2.2-runtime»),
но при запуске докера возникает исключение 137, а при наличии этого исключения докер уничтожается и перестает работать.
my_docker_name завершено с кодом 137
Вышеуказанное поведение происходит, когда память используется почти на 100%, но не на 100%.
Кроме того, я понял, что распределение памяти имеет другое поведение при работе на докерах для Linux. Память выделяется не для новой команды, но выделяется при присвоении этому новому значению.
т.е. :
List<byte[]> Data;
int maxVal = 1024 * 1024 * 1024;
Data = new List<byte[]>();
for (int i = 0; i < 1000; i++)
{
Console.WriteLine("i:{0}", i);
Data.Add(new byte[maxVal]);
}
В приведенном выше коде не хватает памяти для исключения в Windows, но не в linux-контейнере. На Linux это может произойти только при назначении:
byte[] b = new byte[1024L * 1024 * 1024];
byte[] a = b; // cause the 137 error.
Когда я наблюдаю за памятью по команде htop, я вижу, что использование памяти составляет почти 100%, но не 100% (также после выделения).
Я полагаю, что для обработки ядра или системы используется дополнительная память, но я не знаю, как с этим справиться или проверить.
Код неожиданно уничтожается (после выделения памяти> 15G, в то время как на компьютере остается только 16G. Не перехватывается в необработанном исключении ни при try + catch).
Как я могу предотвратить это исключение?
Я пытаюсь проверить доступную память для ядра dot net.
При выполнении следующего:
Process p = Process.GetCurrentProcess();
long l = p.PagedMemorySize64;
Console.WriteLine("mem paged:{0}", l);
l = GC.GetTotalMemory(false);
Console.WriteLine("mem GC total:{0}", l);
В Window я получаю результаты, отличные от Linux (unbuntu).
Первый писатель возвращает в Linux результат 0 (в Windows я получаю реальный размер).
Во второй строке я получил разумное значение, но я хочу знать доступную память (поэтому я бы знал, как обработать код перед выделением памяти).
Память на компьютере Linux составляет 16 Гбайт (но я не знаю жестко запрограммировать это значение - я хочу рассчитать доступную память).
У меня есть несколько проектов, работающих на докерах, поэтому они используют одну и ту же память.
Это не то же самое, что и для dotnet, то есть:
ObjectQuery wql = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wql);
ManagementObjectCollection results = searcher.Get();
foreach (ManagementObject result in results)
{
Console.WriteLine("Total Visible Memory: {0}KB",
result["TotalVisibleMemorySize"]);
Console.WriteLine("Free Physical Memory: {0}KB",
result["FreePhysicalMemory"]);
Console.WriteLine("Total Virtual Memory: {0}KB",
result["TotalVirtualMemorySize"]);
Console.WriteLine("Free Virtual Memory: {0}KB",
result["FreeVirtualMemory"]);
}
Вышеуказанное не подходит для ядра C #.
Также нашел ссылку: Получить доступную память на .NET core
но без посторонней помощи - я получил нулевой результат для PrivateMemorySize64.
Как я могу предотвратить это 137 исключение, и есть ли лучший способ справиться с этим?
В ожидании любой помощи.
Спасибо.