пятница, 18 декабря 2020 г.

Доступная память в Linux



Объем памяти, доступной на виртуальной машине зависит от выбранного дистрибутива Linux. Точнее, от настроек ядра и драйверов, которые включены по умолчанию.

Я попробовал установить на одну и ту же машину c 2Гб памяти Debian 10, CentOS 8 и Ubuntu 20.

Такой получился объем доступной памяти по умолчанию:

# cat /proc/meminfo | grep MemTotal

Debian
MemTotal:        1993756 kB

CentOS:
MemTotal:        1811096 kB

Ubuntu:
MemTotal:        1986080 kB

На CentOS ситуацию можно улучшить, отключив kdump, который изначально включен и съедает 160 Мб.

Редактируем конфиг grub:
# vi /etc/default/grub

Меняем crashkernel=auto на crashkernel=no в GRUB_CMDLINE_LINUX

Применяем изменения:
# grub2-mkconfig -o /boot/grub2/grub.cfg

Отключаем kdump:
# systemctl disable kdump

Перезагружаемся:
# shutdown -r now

Уже лучше, но все еще хуже, чем в Debian и Ubuntu:
MemTotal:        1974584 kB

Таким образом, из трех данных версий Linux, больше всего памяти, доступной приложениям, оставляет Debian, меньше всего - CentOS.


понедельник, 1 июня 2020 г.

Совмещение логирования и сбора метрик

Как сосчитать количество ошибок и предупреждений в сервисе?
В обертку над логгером встраиваем счетчики, собирающие телеметрию.

class Telemetry
{
	public int Warnings;
	public int Errors;
}

static class Log
{
	public static Telemetry Telemetry = new Telemetry();

	public static void Warning(string msg)
	{
		Telemetry.Warnings++;
		Console.WriteLine($"[Warning] {msg}");
} public static void Error(string msg) { Telemetry.Errors++; Console.WriteLine($"[Error] {msg}"); } }

вторник, 23 октября 2018 г.

Просто взять и сжать массив байтов в C#




К сожалению, .NET имеет API только для сжатия и распаковки потоков данных. А если нужно сжать просто массив байтов в другой массив байтов, приходится использовать внешние библиотеки. Или написать вспомогательный класс, например, такой:

using System.IO;
using System.IO.Compression;
 
namespace Compression
{
    public static class Zip
    {
        public static byte[] Compress(byte[] src)
        {
            using (var input = new MemoryStream(src))
            {
                using (var output = new MemoryStream())
                {
                    using (var compressor = new GZipStream(output, CompressionMode.Compress))
                    {
                        input.CopyTo(compressor);
                    }
                    return output.ToArray();
                }
            }
        }
 
        public static byte[] Decompress(byte[] src)
        {
            using (var input = new MemoryStream(src))
            {
                using (var decompressor = new GZipStream(input, CompressionMode.Decompress))
                {
                    using (var output = new MemoryStream())
                    {
                        decompressor.CopyTo(output);
 
                        return output.ToArray();
                    }
                }
            }
        }
    }
}