Сообщество - Лига Сисадминов

Лига Сисадминов

2 297 постов 18 813 подписчиков

Популярные теги в сообществе:

67

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями

Дисклеймер. в редакторе пикабу нет редактора кода поэтому картинки и вырвиглазное форматирование. Но на гитхабе лежит полноценная статья. Вы можете почитать тут, а примеры копировать из гитхаб

В предыдущей части мы исследовали конвейеры и абстрактные объекты процессов. Теперь давайте применим наши знания о конвейере и объектах к одной из частых задач пользователя или администратора — работе с файловой системой. В PowerShell эта работа построена на тех же принципах: команды возвращают объекты, которые можно передавать по конвейеру для дальнейшей обработки.


1. Концепция PowerShell Drives (PSDrives)

Прежде чем начать работать с файлами, важно понять концепцию PowerShell-дисков (PSDrives). В отличие от cmd.exe, где диски — это только буквы C:, D: и так далее, в PowerShell "диск" — это абстракция для доступа к любому иерархическому хранилищу данных.

> Get-PSDrive

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Результат покажет не только физические диски, но и псевдо-диски:

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Эта унификация означает, что вы можете "зайти" в реестр (Set-Location HKLM:) и получить список его ключей той же командой Get-ChildItem, которой получаете список файлов на диске C:. Это невероятно мощная концепция.

Примеры работы с различными провайдерами

  • Хранилище сертификатов (Cert:) Позволяет работать с цифровыми сертификатами так, будто это файлы в папках.

    Задача: Найти все SSL-сертификаты на локальной машине, срок действия которых истекает в ближайшие 30 дней.
    > Set-Location Cert:\LocalMachine\My
    > Get-ChildItem | Where-Object { $_.NotAfter -lt (Get-Date).AddDays(30) } | Select-Object Subject, NotAfter, Thumbprint

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Переменные окружения (Env:) Предоставляет доступ к переменным окружения Windows (%PATH%, %windir% и т.д.) как к файлам.

Задача: Получить путь к системной папке Windows и добавить к нему путь к System32.

Получаем значение переменной windir:
> $windowsPath = (Get-Item Env:windir).Value
Собираем полный путь
> $system32Path = Join-Path -Path $windowsPath -ChildPath "System32"
> Write-Host $system32Path

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Реестр Windows (HKCU: и HKLM:) Представьте, что реестр — это просто еще одна файловая система. Ветки — это папки, а параметры — свойства этих папок.

Задача: Узнать полное название установленной версии Windows из реестра.
Переходим в нужную ветку реестра:
> Set-Location "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
Получаем свойство (параметр реестра) с именем "ProductName"
> Get-ItemProperty -Path . -Name "ProductName"

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Переменные сессии (Variable:) Позволяет управлять всеми переменными ($myVar, $PROFILE, $Error и т.д.), определенными в текущей сессии.

Задача: Найти все переменные, связанные с версией PowerShell ($PSVersionTable, $PSHOME и др.).
Находим все переменные, начинающиеся с "PS":
> Get-ChildItem Variable:PS*

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Получаем значение конкретной переменной:
> Get-Variable -Name "PSVersionTable"

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

2. Навигация и анализ

Основы навигации
- Узнать, где мы находимся (возвращает объект PathInfo):
> Get-Location # Псевдонимы: gl, pwd

- Переход в корень диска C:
> Set-Location C:\ # Псевдонимы: sl, cd

- Переход в домашнюю папку текущего пользователя:
> Set-Location ~

Показать содержимое текущей папки (возвращает коллекцию объектов):
> Get-ChildItem # Псевдонимы: gci, ls, dir

- Рекурсивный поиск. Найти файл hosts в системе, игнорируя ошибки "Доступ запрещен":
> Get-ChildItem C:\ -Filter "hosts" -Recurse -ErrorAction SilentlyContinue

Ключ -Recurse (Рекурсивно): Заставляет командлет работать не только с указанным элементом, но и со всем его содержимым.

Ключ -ErrorAction SilentlyContinue: Инструкция игнорировать ошибки и продолжать работу молча.

Анализ дискового пространства

Классический пример мощи конвейера: найти, отсортировать, отформатировать и выбрать.

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост


Подсказка как вводить длинные команды.

PowerShell позволяет разбивать их на несколько строк для удобства чтения.

  • После оператора конвейера (|): Это самый частый и удобный способ. Просто нажмите Enter после символа |. PowerShell увидит, что команда не завершена, и будет ждать продолжения на следующей строке.

  • В любом другом месте: Используйте символ обратной кавычки (backtick) ` в конце строки, а затем нажмите Enter. Этот символ говорит PowerShell: "Команда продолжится на следующей строке".

  • В редакторах (ISE, VS Code): Сочетание клавиш Shift+Enter обычно автоматически вставляет перенос строки, не запуская команду.

Фильтрация содержимого и операторы логики

- Найти все .exe файлы. Параметр -Filter работает очень быстро:
> Get-ChildItem C:\Windows -Filter "*.exe"

Get-ChildItem возвращает коллекцию объектов. Мы можем передать ее по конвейеру в Where-Object для дальнейшей фильтрации.

> Get-ChildItem C:\Windows | Where-Object { $_.PSIsContainer -eq $false }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Эта команда знакомит нас с одним из фундаментальных понятий в скриптах PowerShell: операторами сравнения.

Операторы сравнения и логики

Это специальные ключи для сравнения значений. Они всегда начинаются с дефиса (-) и являются основой для фильтрации данных в Where-Object и построения логики в if.

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Тема операторов логики - очень обширная и я ей посвящу отдельную часть (или даже две). А пока вооружившись этими операторами, мы можем фильтровать, сортировать и выбирать нужные нам файлы и папки, используя всю мощь объектного конвейера.

Примеры использования в файловой системе

  • Найти файл по точному имени (с учетом регистра):

    > Get-ChildItem C:\Windows\System32 -Recurse | Where-Object { $_.Name -eq "kernel32.dll" }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все файлы, начинающиеся с "host", но не являющиеся папками:

    > Get-ChildItem C:\Windows\System32\drivers\etc | Where-Object { ($_.Name -like "host*") -and (-not $_.PSIsContainer) }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все файлы журналов (.log), размер которых превышает 50 мегабайт:

    > Get-ChildItem C:\Windows\Logs -Filter "*.log" -Recurse | Where-Object { $_.Length -gt 50MB }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все временные файлы (.tmp) и файлы бэкапов (.bak) для очистки: Оператор -in здесь гораздо элегантнее, чем несколько условий с -or.

    > $extensionsToDelete = ".tmp", ".bak", ".old" Get-ChildItem C:\Temp -Recurse | Where-Object { > $_.Extension -in $extensionsToDelete }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все файлы Word (.docx), созданные за последнюю неделю:

    > $oneWeekAgo = (Get-Date).AddDays(-7) Get-ChildItem C:\Users\MyUser\Documents -Filter "*.docx" -Recurse | Where-Object { $_.CreationTime -ge $oneWeekAgo }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти пустые файлы (размером 0 байт), которые не являются папками:

    > Get-ChildItem C:\Downloads -Recurse | Where-Object { ($_.Length -eq 0) -and (-not $_.PSIsContainer) }

  • Найти все исполняемые файлы (.exe), которые были изменены в этом году, но НЕ в этом месяце. Этот сложный пример демонстрирует мощь комбинирования операторов.

    > Get-ChildItem C:\Program Files -Filter "*.exe" -Recurse |
    Where-Object {
    ($_.LastWriteTime.Year -eq (Get-Date).Year) -and ($_.LastWriteTime.Month -ne (Get-Date).Month)
    }

Примечание: скобки () вокруг каждого условия используются для группировки и улучшения читаемости, особенно в сложных случаях.

Будьте внимательны с рекурсией:

  • Если очень много файлов/папок — -Recurse может рекурсивно заходить в десятки тысяч элементов.

  • Символические ссылки / циклические ссылки — могут вызывать бесконечную рекурсию.

  • Файлы без прав доступа — могут блокировать выполнение.

4. Создание, управление и безопасное удаление

Создание, копирование и перемещение:


> New-Item -Path "C:\Temp\MyFolder" -ItemType Directory
> Add-Content -Path "C:\Temp\MyFolder\MyFile.txt" -Value "Первая строка"
> Copy-Item -Path "C:\Temp\MyFolder" -Destination "C:\Temp\MyFolder_Copy" -Recurse

Безопасное удаление

Remove-Item — потенциально опасный командлет, поэтому в PowerShell есть встроенные механизмы защиты. Ключ -WhatIf (Что если?): Ваш лучший друг. Он не выполняет команду, а лишь выводит в консоль сообщение о том, что бы произошло.

> Remove-Item C:\Temp\MyFolder -Recurse -Force -WhatIf

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Только убедившись, что все верно, убираем -WhatIf и ВЫПОЛНЯЕМ команду
> Remove-Item C:\Temp\MyFolder -Recurse -Force


Введение в функции

Когда одна строка кода превращается в сложный набор команд, который вы хотите использовать снова и снова, наступает время для создания функций.

Как использовать и сохранять функции

Существует три основных способа сделать ваши функции доступными:

Способ 1: Временный (для тестов) Вы можете набрать в консопли или просто скопировать и вставить весь код функции в консоль PowerShell. Функция будет доступна до закрытия этого окна.

Способ 2: Постоянный, но ручной (через .ps1 файл) Это самый распространенный способ для организации и обмена инструментами. Вы сохраняете функцию в файл .ps1 и загружаете ее в сессию, когда она вам нужна.

Способ 3: Автоматический (через профиль PowerShell) Это самый мощный способ для ваших личных, часто используемых инструментов.

Что такое профиль PowerShell? Это специальный скрипт .ps1, который PowerShell автоматически запускает каждый раз при старте. Все, что вы поместите в этот файл — псевдонимы, переменные и, конечно, функции — будет доступно в каждой вашей сессии по умолчанию.

Пример 1: Поиск дубликатов файлов

Давайте пройдем все шаги на примере функции Find-DuplicateFiles.

Шаг 1: Определяем код функции

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Шаг 2 (Вариант А): Сохраняем в отдельный файл для ручной загрузки

Сохраняем
> Set-Content -Path ".\Find-DuplicateFiles.ps1" -Value $functionCode
Загружаем
> . .\Find-DuplicateFiles.ps1

Dot Sourcing (. .\Find-DuplicateFiles.ps1): Эта специальная команда выполняет скрипт в текущем контексте, делая все его функции и переменные доступными в вашей консоли.

Вызываем:
> Find-DuplicateFiles -Path "C:\Users\$env:USERNAME\Downloads"

  1. Шаг 2 (Вариант Б): Добавляем в профиль для автоматической загрузки Сделаем эту функцию доступной всегда.

    Что такое профиль PowerShell? Это специальный скрипт .ps1, который PowerShell автоматически запускает каждый раз при старте. Все, что вы поместите в этот файл — псевдонимы, переменные и функции — будет доступно в каждой вашей сессии по умолчанию.

  2. Находим путь к файлу профиля. PowerShell хранит его в переменной $PROFILE.

    1. > $PROFILE

    Создаем файл профиля, если он не существует:

    > if (-not (Test-Path $PROFILE)) { New-Item -Path $PROFILE -Type File -Force }

  3. Добавляем код нашей функции в конец файла профиля.

    Add-Content -Path $PROFILE -Value $functionCode

  4. Перезапустите PowerShell (или выполните . $PROFILE), и теперь ваша команда Find-DuplicateFiles будет доступна всегда, как и Get-ChildItem.

Пример 2: Создание ZIP-архива с резервной копией

Код для файла Backup-FolderToZip.ps1:

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Детальный разбор функций я сделаю следующих частях.


Справочник командлетов для работы с файловой системой

1. Основные командлеты

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Нужно прочитать содержимое текстового файла? Используйте Get-Content. Нужно полностью перезаписать файл новым содержимым? Используйте Set-Content. Нужно добавить строчку в лог-файл, не стирая старые данные? Используйте Add-Content. Нужно проверить, существует ли файл перед записью? Используйте Test-Path.

2. Специализированные командлеты для продвинутых задач

Когда базовых командлетов недостаточно, PowerShell предлагает более специализированные инструменты. Они не дублируют базовые, а расширяют ваши возможности.

  • Работа с путями (Path)

    • Join-Path: Безопасно объединяет части пути, автоматически вставляя \.

    • Split-Path: Разбивает путь на части (папка, имя файла, расширение).

    • Resolve-Path: Преобразует относительный путь (например, . или ..\files) в полный, абсолютный.

  • Работа со свойствами и содержимым (Item Properties and Content)

    • Get-ItemProperty: Получает свойства конкретного файла (например, IsReadOnly, CreationTime).

    • Set-ItemProperty: Изменяет свойства файла или папки.

    • Clear-Content: Удаляет всё содержимое из файла, но оставляет сам файл пустым.

  • Продвинутая навигация (Location Stack)

    • Push-Location: "Запоминает" текущую директорию и переходит в новую.

    • Pop-Location: Возвращается в директорию, которую "запомнил" Push-Location.

  • Управление правами доступа (ACL)

    • Get-Acl: Получает список прав доступа (ACL) для файла или папки.

    • Set-Acl: Устанавливает права доступа для файла или папки (сложная операция).

Нужно изменить атрибут файла, например, сделать его «только для чтения»? Используйте Set-ItemProperty. Нужно полностью очистить лог-файл, не удаляя его? Используйте Clear-Content. Нужно временно перейти в другую папку в скрипте, а потом гарантированно вернуться назад? Используйте Push-Location и Pop-Location. Нужно узнать, кто имеет права на доступ к папке? Используйте Get-Acl.

В следующей части мы узнаем, как работать с другими хранилищами данных, такими как реестр Windows, используя те же самые подходы, углубимся в понятие функций, рассмотрим операторы логики и научимся интерактивно взаимодействовать с оболочкой

Философия PowerShell на github:

История и первый командлет

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов. Исходники ко второй части:
system_monitor.ps1

Часть 3: Навигация и управление файловой системой.
Исходники к третьей части:
Find-DuplicateFiles.ps1
Backup-FolderToZip.ps1

Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

UPD:

Вышла четвертая часть Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

Показать полностью 19
47

Переход на Proxmox (Proxmox GmbH, Vienna, Austria) с Hyper-V by Microsoft и VMware by Broadcom

Переход на Proxmox (Proxmox GmbH, Vienna, Austria) с Hyper-V by Microsoft и VMware by Broadcom. Часть первая из многих.

Для лиги лени: общеизвестное.

В связи с событиями 2023 года, точнее закрытием сделки по покупке VMware в ноябре 2023 года и переходу на новую (дорогую и избыточную) модель лицензирования, мой текущий работодатель посчитал доходы-расходы, и решил – едем на что-то еще.
Выбор был не так широк.
Во первых, очень хотелось сохранить модель «маленького гиперскейлера» - то есть, держать диски на серверах.

Для тех, кто не очень понимает, в чем проблема.

Если у вас один сервер, то вы можете застраховаться от отказа одного, ну двух дисков, отказа одного блока питания, отказа одного порта или одного SFP модуля сетевой карты (если их всего два), одного порта FC (если их всего два), или и единичной ошибки памяти, которую исправит ECC. И то, нет гарантий что исправит, потому что некоторые базы очень грустят даже при корректируемой одиночной ошибке.
Любой сбой по процессору, RAID контроллеру (если он отдельной картой), материнской платы, единичной сетевой платы или отказ всей стойки по питанию, и все, получаем отказ в обслуживании.

Решений несколько.
Решение первое. Держать данные на отдельной системе хранения данных (СХД), причем на нормально резервированной – два контроллера, по 2-4 порта на каждом контроллере, а еще лучше две СХД, собранные в территориально разнесенный кластер.
Но это достаточно дорого в разовой покупке, и требует кое-каких прочих движений, начиная от поиска на рынке вменяемых сетевых инженеров. Для РФ это нерешаемая задача, у нас (вне РФ) еще так-сяк, хотя тоже с вопросами, дешевые индусики это клиника.
По физическому месту и емкости проблем нет – даже младшие системы хранения данных позволяют поставить 24 – 36 SSD NVME диска на систему с 2 (двумя) контроллерами, и дальше вопросы останутся только к вашей сети. 100G карты и порты на коммутаторе 100G стали дешевые, можно смело ставить.
HPE Mellanox StoreFabric SN2100M 100GbE 8QSFP28 Switch стоит меньше 2000$.
36 дисков по 30 терабайт – это петабайт, причем петабайт без учета встроенной, и нормально работающей дедупликации и компрессии.

Решение второе. Хранить данные на локальных дисках тех же серверов, где выполняется виртуализация.
Это Storage space direct, vSAN,  и, с оговорками, Nutanix и Linstor.
К первым двум нет вопросов по настройке, производительности, спискам совместимого оборудования, программе обучения и кадрам.
К Nutanix есть вопросы по наличию кадров на открытом рынке. Не знаю как в РФ, а в мире эта система вспыхнула, работает, но специалисты не так часты.
К Linstor есть вопросы по совместной работе на нагруженной системе, но про это позже.

Решение третье, это обеспечение отказоустойчивости средствами самого приложения. Для баз данных это отлично делает Oracle RAC, Microsoft SQL, Tibero. Так себе, но сойдет – PostgreSQL,MySQL и все решения вокруг них и их форков. Veritas Infoscale Availabilty и Red Hat Cluster Suite не смотрел.

Решение четвертое – это програмно определяемые системы хранения, как Ceph и подобные.
Проблем с ними полно, но основных две:
Невозможность держать одновременно нагрузку виртуализации и нагрузку хранения на сколько-то нагруженной системе.
Плохая производительность – на том же железе Microsoft и Broadcom «из коробки» дадут в 2-3 раза больше скорости (IOPS), и быстрее запустятся, и без проблем с настройками.
Да, есть лимиты - Storage Spaces Direct сейчас это максимум 4 петабайта на кластер, и 400 терабайт на хост, vSAN Max – 360 терабайт на хост и 8 петабайт на кластер.

5-10 лет назад, если у вас была задача постройки «медленного, но объемного хранилища петабайт на 10-20», то дешевого выбора можно сказать и не было. Сейчас скорости и объемы выросли, цены на SSD упали, поэтому вернулся вопрос что выгоднее – купить систему хранения данных и один раз заплатить за покупку, гарантию, пуско-наладку и сопровождение, или держать штат дорогих и редких специалистов. При оценке совокупной стоимости владения за три года все не так очевидно.
Неочевидная в русскоязычном (да и не только, кроилово не имеет национальности) проблема в том, что последние лет .. 25, идет пропаганда «Linux и любые решения вокруг него дешевле и лучше». Ну ..
BundesTux – Германия, 2001 – 2002. Порекламировали и все.
LiMux – переезд администрации Мюнхена на Linux в 2004 году. Переезд обошелся в 43 миллиона евро, в 2017 переехали обратно на Windows.
Open-Source-Software in öffentlichen Einrichtungen – постоянно идущее движение «давайте переедем».
GendBuntu тоже как-то живет.
В России движение «давайте Linux» началось, в том числе, с подачи представительство IBM в России и его Центра компетенции Linux в 2004 году. Цитата:

Своего апогея идея использования в школах свободного ПО достигла осенью 2007 г., когда Федеральным агентством по образованию был проведен открытый конкурс по выбору подрядчика на разработку и пилотное внедрение пакета свободного программного обеспечения для школ (Школьного Линукса), победителем которого стала группа компаний Армада.

Теория теорией, а практика практикой. Рыночек порешал, и СПО живет там, где живет.
Ничего удивительного –
1) На западе сменилось поколение времен молодого Столлмана,
2) Бесплатная разработка чего-то сложного оказалась не нужна работникам,
3) если «вроде как бесплатный продукт + кадры + железо плюс поддержка» обходятся дороже, чем «платный продукт + кадры + железо + поддержка», то зачем он нужен, такой «бесплатный»?

Отсюда возникает проблема «не говорить про слона в комнате».
С такими вводными коллектив и я и начали проработку идеи «в Бристоль опенсорс, друзья»

Документация.

С базовыми вещами проблем нет, документация в открытом доступе на http://pve.proxmox.com/wiki/

Recommended Hardware: в наличии в очень усеченном виде. Но, есть большой плюс, прямо там и написано:
For Ceph or ZFS additional memory is required, approximately 1 GB memory for every TB used storage.

Проблемы начинаются чуть дальше.
В ESXi ты можешь без проблем включить пересылку логов на внешний syslog в две кнопки. 
В Hyper-v ты можешь сделать хоть пересылку логов, хоть указать размещение логов на другом диске.

В Proxmox ? Цитата:
For pveproxy, taking a look at the source, the log file is hard-coded in line 106 to be written to /var/log/pveproxy/access.log
тред
тред на реддите.

Деление диска.
Аналогично, в ESXi у тебя есть резерв в 138 гигов, и дальше делай с диском что хочешь.
В Proxmox? Не описано, и с разделами на выходе какая-то фигня. Посмотреть я, конечно, могу, но хотелось бы очевидные вещи видеть в документации, да и в мастере установки не помешает.

Сети.

Тот же уровень проблем. Нет, сами сети описаны, но управление ими или недостаточно или избыточно. Например, раздел Linux Bond описывает сценарии:
Round-robin
Active-backup
XOR
Broadcast
IEEE 802.3ad Dynamic link aggregation
Adaptive transmit load balancing
Adaptive load balancing

Режим Round-robin. Ок, случайная балансировка , LB и FT в наличии. Никаких указаний на настройку коммутатора, что хорошо.
Active-backup. Сомнительно, но окей.
XOR. Тоже ок.
LACP. Чем плох – тем, что требует настройки со стороны коммутатора и сложен в отладке при плавающих проблемах.
Adaptive transmit load balancing  и Adaptive load balancing. Все перечисленные там действия вызывают вопрос «зачем».
Рекомендованным является LACP, что довольно странно для 2025 года, когда в Hyper-V и ESXi давно используется простой и понятный Switch Embedded Teaming (SET) или active-active конфигурация.  То есть Linux Bridge как виртуальное устройство поддерживает режимы балансировки, но почему-то тут вот так.
Почему-то не описан аналог режима active-passive для ESXi, когда первая сетевая карта активна в первом коммутаторе, вторая во втором, но в Proxmox аналог сущности Vmkernel еще надо поискать, чтобы такая настройка заработала

Есть SDN - Software-Defined Network, но он какой-то избыточный, чтоли.

Литература.

Storage Spaces Direct hardware requirements in Windows Server
vSAN Max
Исследование российского рынка СПО
Changing the default size of the ESX-OSData volume in ESXi 7.0
Расширение корневого раздела (LVM) в Proxmox
Network Configuration
Software-Defined Network 1.
Software-Defined Network 2
Linux Bridge
Performance Best Practices for VMware vSphere 8.0
Перенос (миграция) виртуальных машин с VMware ESXi на Proxmox
Run Hyper-V in a Virtual Machine with Nested Virtualization

В следующих частях:

Смежные сервисы
Диски локальные и не локальные.

PS.
Рассматривался  переход на какой-то вариант Openstack и Open Nebula. Оба признаны избыточно сложными  на данном этапе. Не в смысле «сложно развернуть», с этим проблем нет. В эксплуатации опыта не так много.

Показать полностью
15

Кадры, прогнозы и итоги. Теперь для ИТ на 08-2025

Для ЛЛ: ничего нового. Взлом МТС, СДЭК, теперь Аэрофлота учит только одному: безответственность и простои не наказываются. Кадры не нужны.

Вместо предисловия

26.04.2018 Управление демографическими сдвигами станет одной из тем для дискуссий на ПМЭФ-2018. Согласно нашим расчетам, численность трудоспособного населения России, в соответствии с прогнозами, должна сократиться со 100 млн человек в 2015 году до 89 млн человек к 2030 году
Форбс: Редкие кадры: экономику России тормозит дефицит трудоспособного населения

27.04.2022 Позитивную новость представил Росстат: в России стало больше граждан трудоспособного возраста. По данным на 1 января 2022 года, их насчитывалось 83,2 млн человек. РГ

15.06.2025 По данным на первый квартал 2025 года, численность работников в российских организациях достигла 43,6 миллиона человек, сообщает TAdviser.
Институт статистических исследований и экономики знаний НИУ ВШЭ

30.07.2025 В 2025 году в России 45 тысяч 428 граждан получали заработную плату, размеры которой превышали миллион рублей.
При этом:
зарплату до двух миллионов рублей получали 34 399 человек;
от двух до трех — 5 728;
более трех — 5 301.
Стало известно количество россиян с зарплатой от миллиона рублей в месяц

Очень мне интересно, чего позитивного в новости «планировали 89 миллионов к 2030, получили 83.2 миллиона к 2022». И это на апрель 2022, еще без учета убыли трудоспособного населения в сторону, которую нельзя называть, и эмиграции активного трудоспособного населения.

Но, к теме. Найм в ИТ в РФ, июль 2025.

Как я уже писал, у коллег из РФ и у меня есть и фейковые резюме, и самостоятельный сбор статистики по найму в РФ, и мнение иных коллег, и мнения HR. Потому что рынок всегда надо оценивать самому.

Как выяснилось из сбора мнений, HR (и наши тоже, ленивые стали – увольнять пора) вообще не ведут количественную оценку рынка. Почему? Им и не надо, и инструментов нет.
Для linkedin, myworkdayjobs и остальных картина та же.
Можно только заказать на 100% высосанный, и хорошо если из пальца, «отчет по статистике все равно кого». Понять по этому отчету, «сколько будет стоить вот такой специалист», конечно, невозможно. Нет в ИТ единой тарифной сетки.
Это не надо и нашему, и не только нашему бизнесу – найм через социальную сеть намного эффективнее, в то время как hh иногда выносит абсолютно некомпетентных людей. Я думал, что «пришел на интервью с мамой, мальчик 30 годиков» - это шутка, но нет.

Статистику портят и фейковые вакансии, с их «знать все, оплата веткой», и фейковые специалисты после кратких курсов «умею docker run».

Отдельно статистику портит и передача поиска от hh к разного рода API и краулерам. То есть функция «поставить сотрудника на мониторинг на hh» была всегда, как только ты открывал резюме, то через пару часов в кадровый отдел прилетало оповещение. Сейчас системы поиска и всех свои внутренние, с кучей пометок  (на hh тоже).
Кто там интересовался, есть ли черные списки в крупном найме – да, есть. Есть как публичные оценки во внутренних системах, так и не публичные.

Отдельная проблема, это наступившее переименование еще одного сегмента рынка.
Devops – был подход, стал системный администратор Linux.
SRE – был подход, стал .. тоже системный администратор Linux, но дороже.
Первый перевод книги от Гугля «Site Reliability Engineering: How Google Runs Production Systems» вышел в 2018, сама книга вышла 2016, всего 10 лет спустя в РФ стали переименовывать отделы и вакансии . Магия слов, все по классике – начать с двигания кроватей, закончить переименованием отдела  сисадминов в департамент SRE. И покрыть все «метриками», за которыми потом не следить.

Остается единственный метод оценки – платежеспособный спрос на реальных специалистов на рынке. Но этот спрос, конечно, нужно строго сегментировать – в каком секторе рынка, про какие деньги речь. И какие кадры ищут.

Снизу на рынок давит масса выпускников краткосрочных курсов. Они и так были не нужны, а сейчас, с массовым внедрением AI – не нужны вообще.

Сбоку рынок добивает мозаичное мнение руководства, и это очень интересная тема.

Надо понимать, что начальство (что в крупном западном бизнесе, что в российском) – не собственник, а назначенный сотрудник. Только в западном бизнесе он нанят, исходя из каких-то задач (и то, судя по Brian Krzanich из Intel, это не дает гарантий), в крупном и среднем российском – скорее, «назначен». Отсюда постоянно возникает дисбаланс, когда у начальства свои задачи и цели, и, если начальство предпочитает что-то делать в своих интересах, а не в интересах фирмы, особенно как их видит сотрудник на линейной, или не на линейной позиции – значит, вы чего-то не знаете, и вам не говорят. Возможно, вам не говорят специально.
В том числе, при вопросе «почему так в статистике» или «почему так в найме», ответ простой. Потому что в таком состоянии дел кто-то заинтересован. Или наоборот, кто-то не заинтересован в изменениях, и в наведении порядка. HR творят фигню, прибыль падает, но для начальника и HR это не имеет значения, если их премия не привязана к KPI по прибыли. Или даже если и привязана, то рост прибыли за счет сокращения расходов, в том числе на персонал, это мировая практика.
Более того, сокращение капитальных расходов и снижение отчислений на амортизацию, или прочий бардак, могут иметь под собой различные обоснования, от «не имеет значения» до «поставлена задача снизить расходы, в том числе и через снижение покупки нового оборудования».
Это все вопрос баланса – насколько можно снизить качество сервиса без последствий для руководителей?

Сколько потеряло Домодедово 26 декабря 2010?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию?

Сколько потеряла МТС от простоя с 17 марта 2024 года?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию? Не те, кто чего-то не сделал, потому что не умел, а те, кто решил нанять тех, кто не умел, но был дешевле?

Сколько потерял СДЭК?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию? Не те, кто чего-то не сделал, потому что не умел, а те, кто решил нанять тех, кто не умел, но был дешевле?

Сколько потерял Аэрофлот?
И сколько потеряли сотрудники, принимавшие управленческие решения, приведшие к этому состоянию? Не те, кто чего-то не сделал, потому что не умел, а те, кто решил нанять тех, кто не умел, но был дешевле?

Если руководство ничего не потеряло, то какая разница, что там потеряли пассажиры, заказчики, "бизнес" итд?  
В новостях в РФ все эти события подаются как последствия непреодолимых внешних сил. Прорвало дамбу – не потому, что на постройке скроили, а потому что очень сильный дождь.
Пилот не смог посадить самолет на ручном управлении – не потому, что его не учили, а виноват пилот.
Злые хакеры взломали (МТС, СДЭК, Аэрофлот, и еще вопрос, сколько не попало в прессу)– не потому, что кроили на сотрудниках, а потому что злые хакеры прокрались, и никто не виноват.

Случаи 1:1 как новогодний коллапс в Домодедово в 2010 – виновата погода, а не конкретные лица.

Получается, что есть только два класса: пролетариат и буржуазия.

Есть только два параметра, по которым можно оценить рынок. Это:
1) Число релевантных приглашений на интервью.
2) Число стадий \ время до найма.

Согласно мнению коллег, да и моему тоже, рынок ИТ в РФ сейчас встал. Реального поиска кандидатов нет, время простоя до найма 2-3 месяца, то есть найма нет. И это для квалифицированных специалистов.

Но и специалистов требуемой квалификации на рынке нет.

Выглядит так, что часть руководителей поверила (а часть сделала вид, что поверила) мнению с разных "больших форумов для больших начальников", и мнению прессы (точнее, заказных статей в прессе), что вот-вот на рынок попадет огромное число квалифицированных ИТ специалистов всех видов.

В то же время, на рынок действительно попала масса специалистов. Но есть нюанс, это масса не просто без ИТ образования или опыта, а масса без понимания, что они делают. Ну да, кнопочки нажимают, контейнер поднялся, все заработало. Логин пароль – админ \пароль, внутри всем можно все.

Вопрос, когда все сломается, даже не стоит – сломается вместе с первым сотрудником, сделавшим что-то «не то». Вся экономия на кадрах уйдет на компенсацию простоя. Но, это если экономию  будут считать честно. Может, наоборот, почти и не потеряли, даже и выиграли.

На это намазывается, таким толстым, жирным слоем, натуральное импортозаместительное .. ну, не масло*, а  точнее два его вида:
Качество импортозаместительного ПО.
Качество поддержки этого ПО, а точнее атаки на цепь поставок.
Это и непрямые атаки, как:

1) 2020 год, взлом SolarWinds Orion.
2) 2021 год, найденная, спустя десяток лет использования везде, уязвимость Log4j также известна как Log4Shell или CVE-2021-44228
3) 2023 год, последний случай из публичных:
Известный производитель чистящих средств Clorox подал в суд на своего IT-провайдера Cognizant после того, как выяснилось, что компания просто передала хакерам, выдававшим себя за сотрудников, доступ к корпоративной сети. Согласно отчету NBC News, этот инцидент позволил хакерской группе Scattered Spider, специализирующейся на атаках на сервисные службы компаний, заразить системы Clorox ransomware-вирусом в августе 2023 года. По данным иска, этот провал в IT-поддержке нанес Clorox ущерб и убытки на сумму около 380 миллионов долларов (~30,4 млрд рублей). Rutab.net
4) 2024 год, атака на xz/liblzma

И прямые атаки. Судя по опросу оставшихся в РФ коллег, в российском бизнесе забыт, как не бывший, результат EternalBlue \ Linux SambaCry \ CVE-2017-7494.
Точно так же, как забыт Conficker, (Downup, Downadup , Kido).

Можно считать, что завершилась сегментация рынка ИТ в РФ на:

Мелкий бизнес: который отлично себя чувствует на аутсорсе. 90% времени техника работает нормально и без постоянного присутствия специалиста, выдергивать и включать обратно хоть кассу, хоть карточный терминал, уже все научились. Зарплаты там низкие, квалификация соответствующая.

Средний бизнес: не заинтересованный в каких-то развитых технологиях. Я удивился, когда посмотрел на цифры производительности современных consumer SSD NVME – да, на нагрузке 24x7 они умрут, но на нагрузке «иногда днем» – выдают вполне достойные цифры. Enterprise SSD NVME опять подешевели. Квалификация в этом секторе разная, зарплаты тоже не высоки.

И, наконец, крупный бизнес. Найм туда остановлен организационно, обсуждать причины остановки найма нет смысла.

Найм в РФ стоит, зато те, кто уехал или работает на аутсорсе не из РФ, не то, чтоб в шоколаде (все же значимый процент бизнеса крутился через РФ), но не грустят.

Прогнозы

Ничего ставить не буду, разумеется, но бабка Ванга внутри меня говорит, что для РФ ИТ инфраструктуры в целом, включая сюда железо, сервисы, разработку – достигнут какой-то предел. Или рубеж. Или барьер. Потому что можно сколько угодно игнорировать проблему качества кадров, но она уже тут.

Но.

Проблемы с кадрами в авиастроении и в эксплуатации обсуждают, но не решают.
Проблемы с кадрами где угодно, начиная от врачей, и учителей обсуждают, но не решают.
Почему с ИТ кадрами, проблемы с которыми громко обсуждают, будет иначе?

Итого.

Судя по открытым вакансиям, и по реальным зарплатам на рынке, ситуация следующая.

Выпускник курсов, даже с враньем про опыт работы: не нужен. HR такой выпусник курсов пройдет. На техническом интервью завалится, потому что на курсах, ни на каких, не дают реального опыта работы. Дают опыт «как наврать в резюме». В мире, кстати, та же картина.

Начинающий специалист с хоть каким-то опытом, и, что очень важно, соответствующим мировоззрением.

Предлагаемая на рынке Москвы зарплата: от 50..80к до 100к. рублей. Практическая зарплата: 120-150к. разрыв с открытыми вакансиями x1.5 – x2 . Это не значит, что невозможно найти специалиста на 100к. Это значит, что такого специалиста надо полгода доучивать, и его совокупная стоимость составит:
100к (плюс налоги) плюс 25% времени от специалиста с окладом 150к за 6 месяцев, которого назначат «доучивать».
Потом этот доученный специалист через год еще и уйдет на 150к.
То есть, это все те же 1500$, что и 5, и 10, и 15 лет назад, с учетом инфляции по доллару.
Примечание. 1500 USD на 2025 год – это 1000 USD на 2010.
Инфляция за период: 50.42 %, используемый индекс: USCPI31011913 (Bureau of Labor Statistics).

Средний специалист на рынке. Здесь проблема в делении рынков, и определения середины.
HR меряют «середину» как «середину зарплаты по их мнению», но. Эта «середина по их мнению» никак не коррелирует с реальными зарплатами.
И, средняя и медианная зарплаты, это не одно и то же.
HR видят зарплаты, не закрываемые годами, в том числе не закрываемые потому, что там указана заниженная относительно рынка зарплата, читают новости «да сейчас точно 100.000.000.000 сотрудников выйдет на рынок и будет работать за большую честь работать в динамично развивающемся  лидере рынка за еду, выбирают из новостей «приятные», и дальше получают свою зарплату, не выполняя декларируемую бизнес задачу «найм». Если бизнес устраивает такое состояние найма, точнее «если, и когда», бизнес устраивает такое состояние найма и ИТ блока, когда на найм и удержание кадров можно не обращать внимания, то эта ситуация становится стабильной на годы. Растет технический долг, растут дыры, а потом случается Аэрофлот.

Более того, ИТ инфраструктура в целом, это проект с достаточно длительным развитием проблемы с регулированием, и с длительной амортизацией. То есть, нормально настроенная система (любая) предусматривает в себе требуемый бизнесом уровень надежности и скорости, и в ИТ не нужна ежедневная работа по закручиванию некой гайки или доливки смазки в кулер. Поэтому при увольнении даже 100% ИТ штата, системы не откажут (скорее всего не откажут) ни на следующий день, ни через неделю, ни, может, даже через месяц. Это ж какая экономия на кадрах.

Но, к теме.

Средний ИТ специалист на рынке Москвы, без разделения по направлениям и категориям, уже смотрит на западный рынок, и поэтому верхняя граница задрана.
По объявлениям это 100 - 200к, по факту это 250 – 750к.  Повторюсь, верхняя планка задрана потому, что хороший специалист среднего уровня по прежнему ориентируется на рынок Европы, а там МРОТ в районе 4000 евро до налогов, и 3000 евро после налогов. Да, снять квартиру в Лимассоле или Берлине встанет в 1000 евро, но и в Москве сравнимая квартира стоит 60-80 тысяч рублей плюс коммунальные платежи.
Примечание. МРОТ там ниже, но визовый порог плюс практический смысл для нанимающей стороны где-то так и выходит.
Конечно, если у специалиста в Москве есть еще мелкий побочный доход в виде пары квартир «от бабок», то ему западный рынок не интересен. В остальных случаях специалисты склонны сравнивать совокупные доходы, расходы, перспективы, и риски.
Разброс «предлагаемого» и «реального» рынка – в 2-3 раза. Повторюсь, все это идет от бизнеса, которого такое состояние устраивает, по каким-то бизнес-причинам.

Как там сказали на днях?

Женщина с фамилией Кузьминых ответила в комментариях пользователю, который пожаловался, что удаленщики могут потерять работу. «На СВО всем работы хватит», — написала она.
Также она процитировала пост Котюкова и предложила жителям края «радоваться чистому небу и не жужжать».
Источник РБК

Или как до этого:
Видеозаписи дочери Шевцовой заметили в сети в середине мая. На них девушка в агрессивной форме заявляла, что ее мама — мэр и может повлиять на призыв в армию. Одно из видео сопровождалось словами: «Ты что, фраер, попутал? Знаешь, кто моя мама? Мэр. Мы тебя на СВО отправим»./
Источник лентару

Или до того:
«Я вам могу составить меню исходя из тех магазинов, которые я посещаю, со скидками, и вы поймете, что жить можно! Сбалансированное, но диетическое! Вы станете моложе, красивее и стройнее! Макарошки всегда стоят одинаково!» — заявила министр труда.
Источник бизнес онлайн

Вот это мнение людей (и их детей), принимающих кадровые решения, без цензуры и открытым текстом. Кто-то их поставил на должности, с таким мнением и подходом, эти люди не в кабинетах самозародились.

Страннее всего с рынком «сеньоров», «тим лидов» и выше.
Это и в мире, и в РФ, всегда или переходная позиция «к менеджменту», или больше менеджерская.
Поэтому на ней можно выделить две совершенно разных группы.
Группа 1. Технические сеньоры без задач управления, консультанты.
HR в РФ их ищут как «сеньоров», расписывая при этом на них несколько технических задач из не связанных блоков, добавляя управленческие задачи, и добавляя, чтобы точно никого не найти, «наставничество». При этом оклад выставляется на уровне мидл плюс.
Выставляемый оклад: 250-500к рублей, но фактически там минимальный уровень 400-450к, а в итоговом годовом окладе уже имеются KPI, и премия там легко может быть и в 6, и в 9, и в 12 месячных окладов.
Группа 2. Менеджеры с минимальным техническим бекграундом.
После серии про эффективную сову тут уже нечего добавить.

Отдельной жизнью живут вакансии по информационной безопасности. В ней разброс окладов еще выше, особенно там, где эта безопасность нужна, и приносит прибыль.

Повторюсь еще раз.
Проблемы с наймом растут не от HR или hh. Проблемы растут от бизнеса, которого устраивает такое положение дел. На это накладывается откат от 4---- технологического уклада в РФ на уровень 3+++, а местами и на уровень 2++, с соответствующим откатом мотивации и агитации на уровень СССР, с  его «План - закон, выполнение - долг, перевыполнение - честь!» и «это не про зарплату, а про призвание». ИТ это затрагивает ничуть не меньше остального рынка труда.
Надо заметить, эта агитация работает, часть коллектива уже поверила, что «надо работать на хорошее резюме, чтобы HR не ругались на то, что я работал на последнем месте меньше года / трех лет / пяти лет / всю жизнь». Но есть интересная корреляция, когда люди, поверившие в длительность стажа на месте работы, уже не учатся чему-то новому. То есть, на словах они готовы учить английский и немецкий, учить новый стек, новые технологии и подходы, а по факту откладывают это на понедельник, следующий месяц, отпуск, как только так сразу.
Рекорд поставила одна из бывших коллег, которая собиралась пойти учить английский в 2019 году. Потом работа, потом ковид, потом новая работа, а потом вроде уже и не надо. И с остальными знаниями у нее то же самое. Теперь сидит и ноет, что новая работа «не очень», но менять ее не будет, потому что «ну как же я HR в глаза смотреть буду, я же не отработала тут 3\5\10 лет».

PS. На западном рынке, США и Европы, тоже ноют про кадры.
Внешне ноют «похоже», но с другим содержанием. Поэтому без анализа я уже давно не удивляюсь обратному карго-культу, когда в РФ ноют «как же так, их самолеты тоже из навоза, инфа 100%, что они тоже не летают, просто лучше притворяются».

Литература

50 Famous CEOs Who Got Fired From Their Job
5 взломов ИБ-компаний за неделю, в которых фигурировали EDR и средства аутентификации Сайт Алексей Лукацкого "Бизнес без опасности", 2025

SolarWinds урегулировала дело о скандальном взломе пятилетней давности, который затронул тысячи компаний и госслужбы
Время сверить версии: в Linux выявлена изощрённая атака на цепочку поставок
Атаки на цепочки поставок: как уязвимости распространяются через зависимости
SambaCry к нам приходит
https://ru.wikipedia.org/wiki/Карго-культ
Обратный карго-культ (Ведомости)
Human Resource Management in a Recession

*
Встречается Брежнев с советскими учёными.
-Товарищи! В Советском Союзе острая нехватка сливочного масла! Нужно срочно создать ему замену.
-А чего в Советском Союзе много, Леонид Ильич?
-А много у нас только говна.

-Хорошо, будем работать.
Выделили 50 миллионов рублей и установили срок в четыре года. Через два года Брежнев возвращается.
-Ну что, как идёт дело, товарищи учёные?
-Полдела сделано, Леонид Ильич. На хлеб легко мажется, но на вкус пока не очень.

Показать полностью
12

Забавная дилемма

Забавная дилемма Картинка с текстом, Мемы, IT юмор, Языки программирования, HTML, Логотип, Программист

Ирония заключается в том, что этот символ является фундаментальным элементом синтаксиса HTML, который, как утверждают программисты, не является языком программирования. 

#comment_361465366 - в дополнение

27

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов

Дисклеймер. в редакторе пикабу нет редактора кода. Поэтому картинки и вырвиглазное форматирование. В конце статьи я дам ссылки на гитхаб . Там полноценная статья. Вы можете почитать тут, а примеры копировать из гитхаб

❗ Важно: Я пишу про PS7 (PowerShell 7). Он отличается от PS5 (PowerShell 5). Начиная с седьмой версии ps стал кросплатформенным. Из-за этого изменилось поведение некоторых команд.

В первой части мы установили ключевой принцип: PowerShell работает с объектами, а не с текстом. Этот пост посвящен некоторым важным инструментам PowerShell: научимся передавать объекты по конвейеру, анализировать их с помощью Get-Member, сохранять результаты в переменные и автоматизировать все это в файлах скриптов (.ps1) с экспортом результатов в удобные форматы.


1. Что такое конвейер (|)?

Конвейер в PowerShell это механизм передачи полноценных .NET объектов (а не просто текста) от одной команды к другой, где каждый следующий командлет получает структурированные объекты со всеми их свойствами и методами.

Символ | (вертикальная черта) — это оператор конвейера. Его задача — взять результат (вывод) команды, стоящей слева от него, и передать его на вход команде, стоящей справа.

Команда 1 (создает объекты) → | → Команда 2 (получает и обрабатывает объекты) → | → Команда 3 (получает обработанные объекты) → | ...

Классический UNIX-конвейер: Поток текста

В bash по конвейеру передается поток байтов, который обычно интерпретируется как текст.

Найти все процессы 'nginx' и посчитать их количество
> ps -ef | grep 'nginx' | wc -l

Здесь `ps` выводит текст, `grep` фильтрует этот текст, а `wc` считает строки. Каждая утилита ничего не знает о "процессах", она работает только со строками.

PowerShell-конвейер: Поток объектов

Пример: Давайте получим все процессы, отсортируем их по использованию CPU и выберем 5 самых "прожорливых".

> Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Здесь Get-Process создает объекты процессов. Sort-Object получает эти объекты и сортирует их по свойству CPU. Select-Object получает отсортированные объекты и выбирает первые 5.

Вы наверняка заметили в команде слова, начинающиеся с дефиса (-): -Property, -Descending, -First. Это параметры. Параметры — это настройки, переключатели и инструкции для командлета. Они позволяют управлять тем, КАК команда будет выполнять свою работу. Без параметров команда работает в режиме по умолчанию, а с параметрами вы даете ей конкретные указания.

Основные типы параметров:

  • Параметр со значением: требует дополнительной информации.

    -Property CPU: Мы говорим Sort-Object, по какому свойству сортировать. CPU — это значение параметра.

    -First 5: Мы говорим Select-Object, сколько объектов выбрать. 5 — это значение параметра.

  • Параметр-переключатель (флаг): Не требует значения. Само его наличие в команде включает или выключает определенное поведение.

    -Descending: Этот флаг говорит Sort-Object изменить порядок сортировки на обратный (от большего к меньшему). Ему не нужно дополнительное значение — он сам по себе инструкция.

> Get-Process -Name 'svchost' | Measure-Object

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Эта команда отвечает на очень простой вопрос: "Сколько именно процессов с именем svchost.exe сейчас запущено в моей системе?"

Разбор по шагам

Шаг 1: Get-Process -Name 'svchost'

Эта часть команды обращается к операционной системе и просит найти все без исключения запущенные процессы, у которых имя исполняемого файла — svchost.exe. В отличие от процессов типа notepad (которых обычно один или два), процессов svchost в системе всегда много. Команда вернет массив (коллекцию) объектов, где каждый объект — это отдельный, полноценный процесс svchost со своим уникальным ID, использованием памяти и т.д. PowerShell нашел в системе, например, 90 процессов svchost и теперь держит в руках коллекцию из 90 объектов.

Шаг 2: | (Оператор конвейера)

Этот символ берет коллекцию из 90 объектов svchost, полученную на первом шаге, и начинает передавать их по одному на вход следующей команде.

Шаг 3: Measure-Object

Поскольку мы вызвали Measure-Object без параметров (таких как -Property, -Sum и т.д.), он выполняет свою операцию по умолчанию — просто считает количество "предметов", которые ему передали. Раз, два, три ... После того как все объекты посчитаны, Measure-Object создает свой собственный объект-результат, в котором есть свойство Count, равное итоговому числу.

Count: 90 — это и есть ответ на наш вопрос. Запущено 90 процессов svchost. Остальные поля пустые, потому что мы не просили Measure-Object выполнять более сложные вычисления.

Пример с svchost и параметрами

Давайте изменим нашу задачу. Теперь мы хотим не просто посчитать процессы svchost, а узнать, сколько всего оперативной памяти (в мегабайтах) они потребляют вместе.

Для этого нам понадобятся параметры:

  • -Property WorkingSet64: Эта инструкция говорит Measure-Object: "Из каждого объекта svchost, который к тебе придет, возьми числовое значение из свойства WorkingSet64 (это использование памяти в байтах)".

  • -Sum: Эта инструкция-флаг говорит: "Сложи все эти значения, которые ты взял из свойства WorkingSet64".

Наша новая команда будет выглядеть так:

> Get-Process -Name 'svchost' | Measure-Object -Property WorkingSet64 -Sum

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
  1. Get-Process найдет количество объектов svchost.

  2. Конвейер | передаст их в Measure-Object.

  3. Но теперь Measure-Object работает по-новому:

    • Он берет первый объект svchost, смотрит его свойство .WorkingSet64 (например, 25000000 байт) и запоминает это число.

    • Берет второй объект, смотрит его .WorkingSet64 (например, 15000000 байт) и прибавляет к предыдущему.

    • ...и так далее для всех объектов.

  4. В итоге Measure-Object создаст объект-результат, но теперь он будет другим.

  • Count: 92: Количество объектов.

  • Sum: 1661890560: Это общая сумма всех значений WorkingSet64 в байтах.

  • Property: WorkingSet64: Это поле теперь тоже заполнено, оно информирует нас, какое именно свойство было использовано для вычислений.

2. Переменные (Обычные и специальная $_)

Переменная — это именованное хранилище в памяти, которое содержит какое-либо значение.

Этим значением может быть что угодно: текст, число, дата или, что самое важное для PowerShell, целый объект или даже коллекция объектов. Имя переменной в PowerShell всегда начинается со знака доллара ($). Примеры: $name, $counter, $processList.

Специальная переменная $_?

$_ — это сокращение для "текущий объект" или "вот эта штука". Представьте себе конвейер на заводе. По нему едут разные детали (объекты).

$_ — это та самая деталь, которая находится прямо сейчас перед вами (или перед роботом-обработчиком).

Источник (Get-Process) — высыпает на конвейер целую коробку с деталями (всеми процессами).

Конвейер (|) — заставляет эти детали двигаться по ленте по одной.

Обработчик (Where-Object или ForEach-Object) — это робот, который смотрит на каждую деталь.

Переменная $_ — это та самая деталь, которая сейчас находится в "руках" у робота.

Когда робот закончит с одной деталью, конвейер подает ему следующую, и $_ теперь будет указывать уже на нее.

Давайте посчитаем, сколько всего памяти используют процессы svchost, и выведем результат на монитор.

1. Выполняем команду и сохраняем ее сложный объект-результат в переменную $svchostMemory

> $svchostMemory = Get-Process -Name svchost | Measure-Object -Property WorkingSet64 -Sum

2. Теперь мы можем работать с сохраненным объектом. Достаем из него свойство Sum

> $memoryInMB = $svchostMemory.Sum / 1MB

3. Выводим результат на экран, используя новую переменную

> Write-Host "Все процессы svchost используют $memoryInMB МБ памяти."

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
  • Write-Host — это специализированный командлет, чья единственная задача — показать текст непосредственно пользователю в консоли.

  • Строка в двойных кавычках: "..." - текстовая строка, которую мы передаем командлету Write-Host в качестве аргумента. Почему двойные, а не одинарные кавычки?

    В PowerShell есть два типа кавычек:

    • Одинарные ('...'): Создают буквальную строку. Все, что внутри них, воспринимается как обычный текст, без исключений.

    • Двойные ("..."): Создают расширяемую (или подстановочную) строку. PowerShell "сканирует" такую строку на предмет переменных (начинающихся с $) и подставляет на их место их значения.

  • $memoryInMB. Это переменная, в которую мы на предыдущем шаге нашего скрипта положили результат вычислений. Когда Write-Host получает строку в двойных кавычках, происходит процесс, называемый "подстановка переменных" (String Expansion):

    1. PowerShell видит текст "Все процессы svchost используют ".

    2. Затем он натыкается на конструкцию $memoryInMB. Он понимает, что это не просто текст, а переменная.

    3. Он заглядывает в память, находит значение, хранящееся в $memoryInMB (например, 1585.52).

    4. Он подставляет это значение прямо в строку.

    5. Затем он добавляет оставшуюся часть текста: " МБ памяти.".

    6. В итоге, в Write-Host передается уже готовая, собранная строка: "Все процессы svchost используют 1585.52 МБ памяти.".

Запустите блокнот!

  1. Находим процесс Блокнота и сохраняем его в переменную $notepadProcess

> $notepadProcess = Get-Process -Name notepad

  1. Обращаемся к свойству 'Id' этого объекта через точку и выводим его

> Write-Host "ID процесса 'Блокнот' равен: $($notepadProcess.Id)"

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

❗ Важно: Write-Host "ломает" конвейер. Текст, выведенный им, нельзя передать дальше по конвейеру для обработки. Он предназначен только для отображения.


3. Get-Member (Инспектор объектов)

Мы знаем, что по конвейеру "текут" объекты. Но как узнать, из чего они состоят? Какие у них есть свойства и какие действия (методы) с ними можно совершать?

командлет Get-Member (псевдоним: gm) главный инструмент для исследования. Прежде чем работать с объектом, пропустите его через Get-Member, чтобы увидеть все его возможности.

Давайте проанализируем объекты, которые создает Get-Process:

> Get-Process | Get-Member

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Разберем каждую часть вывода Get-Member.

TypeName: System.Diagnostics.Process - Это полное, официальное "имя типа" объекта из библиотеки .NET. Это его "паспорт". Эта строка говорит вам, что все объекты, которые возвращает Get-Process, являются объектами типа System.Diagnostics.Process. Это гарантирует, что у них у всех будет одинаковый набор свойств и методов. Вы можете загуглить "System.Diagnostics.Process", чтобы найти официальную документацию Microsoft с еще более подробной информацией.

  • Колонка 1: Name

Это простое, человекочитаемое имя свойства, метода или другого "члена" объекта. Именно это имя вы будете использовать в своем коде для доступа к данным или выполнения действий.

  • Колонка 2: MemberType (Тип объекта)

Это самая важная для понимания колонка. Она классифицирует, чем является каждый объект. Это его "должность", которая говорит вам, КАК его использовать.

  • Property (Свойство): характеристика или порция данных, хранящаяся внутри объекта. Вы можете "прочитать" ее значение.

    • Примеры на скриншоте: BasePriority, HandleCount, ExitCode. Это просто данные, которые можно посмотреть.

  • Method (Метод): ДЕЙСТВИЕ, которое можно совершить с объектом. Методы всегда вызываются с круглыми скобками ().

    • Примеры на скриншоте: Kill, Refresh, WaitForExit. Вы бы написали $process.Kill() или $process.Refresh().

  • AliasProperty (Псевдоним свойства): дружелюбный псевдоним для другого, более длинного свойства. PowerShell добавляет их для удобства и краткости.

    • Примеры на скриншоте: WS — это короткий псевдоним для WorkingSet64. Name — для ProcessName. VM — для VirtualMemorySize64.

  • Event (Событие): УВЕДОМЛЕНИЕ о том, что что-то произошло, на которое можно "подписаться".

    • Пример на скриншоте: Exited. Ваш скрипт может "слушать" это событие, чтобы выполнить какое-то действие сразу после того, как процесс завершится.

  • CodeProperty и NoteProperty: специальные типы свойств, часто добавляемые самим PowerShell для удобства. CodeProperty вычисляет свое значение "на лету", а NoteProperty — это простое свойство-заметка, добавленное к объекту.

  • Колонка 3: Definition (Определение)

Это техническое определение или "подпись" члена. Она дает вам точные детали для его использования. Ее содержимое зависит от MemberType:

  • Для AliasProperty: Показывает, чему равен псевдоним. Это невероятно полезно!

    • Пример на скриншоте: WS = WorkingSet64. Вы сразу видите, что WS — это просто короткая запись для WorkingSet64.

  • Для Property: Показывает тип данных, который хранится в свойстве (например, int для целого числа, string для текста, datetime для даты и времени), и что можно с ним делать ({get;} — только читать, {get;set;} — читать и изменять).

    • Пример на скриншоте: int BasePriority {get;}. Это целочисленное свойство, которое можно только прочитать.

  • Для Method: Показывает, что метод возвращает (например, void — ничего, bool — true/false) и какие параметры (входные данные) он принимает в скобках.

    • Пример на скриншоте: void Kill(). Это значит, что метод Kill ничего не возвращает и может быть вызван без параметров. Также есть вторая версия void Kill(bool entireProcessTree), которая принимает логическое значение (true/false).

В виде таблицы

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Пример: Работа с окнами процессов

1. Проблема:

"Я открыл много окон Блокнота. Как мне программно свернуть все, кроме главного, а затем закрыть только то, у которого в заголовке есть слово 'Untitled'?"

Откройте несколько экземпляров блокнота (Windows Notepad) на компьютере

2. Исследование с Get-Member:

Нам нужно найти свойства, связанные с окном и его заголовком.

> Get-Process -Name notepad | Get-Member

Анализ результата Get-Member:

  • Листая свойства, мы находим MainWindowTitle. Тип string. Отлично, это заголовок главного окна!

  • В методах мы видим CloseMainWindow(). Это более "мягкий" способ закрыть окно, чем Kill().

  • Также в методах есть WaitForInputIdle(). Звучит интересно, возможно, это поможет дождаться, пока процесс будет готов к взаимодействию.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Get-Member показал нам свойство MainWindowTitle, которое является ключом к решению задачи и позволяет взаимодействовать с процессами на основе состояния их окон, а не просто по имени.

3. Решение:

Теперь мы можем построить логику, основанную на заголовке окна.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Пример: Найти родительский процесс

1. Проблема:

"Иногда я вижу в системе много дочерних процессов chrome.exe. Как мне узнать, какой из них является главным, "родительским" процессом, который их всех запустил?"

2. Исследование с Get-Member:

Нам нужно найти что-то, что связывает один процесс с другим.

> Get-Process -Name chrome | Select-Object -First 1 | Get-Member

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Анализ результата Get-Member:

  • Внимательно просматривая список, мы находим свойство типа CodeProperty с именем Parent.

  • Его определение (Definition) — System.Diagnostics.Process Parent{get=GetParentProcess;}. Это вычисляемое свойство, которое при обращении к нему возвращает объект родительского процесса.

3. Решение:

Теперь мы можем написать скрипт, который для каждого процесса chrome будет выводить информацию о его родителе.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Мы сразу видим, что процессы с ID 4756, 7936, 8268 и 9752 были запущены процессом с ID 14908. Также можно заметить интересный случай с процессом ID: 7252, у которого родительский процесс не определился (возможно, родитель уже успел завершиться к моменту проверки). Модификация скрипта с проверкой if ($parent) аккуратно обрабатывает этот случай, не вызывая ошибки. Get-Member помог нам обнаружить "скрытое" свойство Parent, которое предоставляет мощные возможности для анализа иерархии процессов.

4. Файл .ps1 (Создание скриптов)

Когда ваша цепочка команд становится полезной, вы захотите сохранить ее для многократного использования. Для этого и нужны скрипты — текстовые файлы с расширением .ps1.

Разрешение на запуск скриптов

По умолчанию в Windows запрещен запуск локальных скриптов. Чтобы это исправить для текущего пользователя, выполните один раз в PowerShell от имени администратора:

> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Это безопасная настройка, которая разрешает запускать ваши собственные скрипты и скрипты, подписанные доверенным издателем.

Пример скрипта system_monitor.ps1

Создайте файл с таким именем и вставьте в него код ниже. Этот скрипт собирает информацию о системе и генерирует отчеты.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Примечание: функция Export-Results будет определена в следующем разделе как пример хорошей практики.

5. Экспорт результатов

Чистые данные — это хорошо, но часто их нужно представить в удобном для человека или другой программы виде. PowerShell предлагает множество командлетов для экспорта.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Дополнение к скрипту: функция экспорта

Давайте добавим в наш скрипт system_monitor.ps1 функцию, которая будет заниматься экспортом. Поместите этот код перед вызовом Export-Results.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

код на github

Теперь наш скрипт не просто собирает данные, но и аккуратно сохраняет их в двух форматах: CSV для анализа и HTML для быстрого просмотра.

Заключение

  1. Конвейер (|) — главный инструмент для объединения команд и обработки объектов.

  2. Get-Member — анализ объектов, который показывает, из чего они состоят.

  3. Переменные ($var, $_) позволяют сохранять данные и обращаться к текущему объекту в конвейере.

  4. Файлы .ps1 превращают команды в переиспользуемые инструменты автоматизации.

  5. Командлеты экспорта (Export-Csv, ConvertTo-Html) Экспортируют данные в соответствующем формате.

В следующей части мы применим эти знания для навигации и управления файловой системой, исследуя объекты System.IO.DirectoryInfo и System.IO.FileInfo.

К первой части

Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

UPD:

Статья на github:
https://github.com/hypo69/1001-python-ru/blob/master/articles/Философия PowerShell/02.md

Исходники:
system-monitor.ps1:
https://github.com/hypo69/1001-python-ru/blob/master/articles/Философия PowerShell/code/02/system_monitor.ps1


Третья часть:
Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

А давайте встроим ии в powershell

Показать полностью 19
2

Новый ноутбук 2: скорость, плюсы-минусы, DiskSPD, Hyper-V и далее

Для лиги лени: привыкание к новому и бесполезные тесты часть следующая. И немного powershell

Начало тут:

Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 1 - общая
Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 2 - виртуализация
Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 3 – цифры и предварительные итоги
Тестирование локальных дисков и систем хранения данных: подводные камни. Часть 4 – что там изнутри виртуализации
Новый ноутбук: скорость, плюсы-минусы, DiskSPD, Hyper-V и продолжение про методику тестирование скорости

Решил я доделать сбор статистики перед тем, как что-то смотреть изнутри виртуалки, тем более вложенной виртуализации.

Предупреждение еще раз. Все данные ниже можно принимать во внимание, но не стоит рассматривать как какой-то эталон.

Что получил:

Один тред, один файл, блок 4k на чтение.

1 Влияние длины очереди. Тут была таблица, но не вставилась, поэтому просто цифрами:

После очереди == 4, нагрузка не растет, около 90k IOPS

2 Влияние числа тредов и числа файлов в работе на общий IOPS

Примечание: для 2 и 3 файлов – один файл был размещен на другом логическом диске

Тут тоже была таблица, но мне лень вставлять ее даже картинкой. На картинке опечатка, везде k, тысячи IOPS.

Новый ноутбук 2: скорость, плюсы-минусы, DiskSPD, Hyper-V и далее Windows, Статистика, Жесткий диск, IT, Импортозамещение, Microsoft, Опыт, Длиннопост

IOPS

Затем общий IOPS не рос.

До 10 тредов IOPS на поток падало – с 40 тысяч при 1 треде на каждый файл.
При соотношении 2 файла \ 3 треда, всего 6 тредов, и 3 файла \ 2 треда – выйдя на примерно 40k IOPS на поток, при 4 тредах и 3 файлах просев до 33-35 k IOPS на поток

На 14 (7\2) и 15 (5\3) тредах начинает падать IOPS\thread – с 35 до 17.
На 14 – 10 по 35k, 4 по 17k
на 15 – 9 треда по 35k, 3 треда по 17k.
Что отлично укладывается в логику 12 тредов CPU, из которых 9 работают на один тред, генерируя по 35k, и 3 CPU потока обрабатывают по 2 дисковых треда по 17k.
На 24 тредах (2 файла \ 12 тредов и 3 файла \ 8 тредов)  картинка та же – все треды примерно по 17.5 IOPS
На 26 тредах (2\13 и 3\12) -4-6 потоков падают до 10k IOPS \ thread. Суммарно те же 40k

И для записи, пиковое значение было получено при 2 тредах на каждый их 3 файлов, 240k IOPS итого, по 40k IOPS на тред. Затем было только хуже –

Например, на казалось бы ПОЧТИ то же самое, 3 треда на два файла – производительность упала до 20k на тред, 120k IOPS.

На 4 потоках на файл, 12 файлах – производительность вроде бы была 210k, но есть разброс – от 15 до 20k IOPS на тред, перемерять надо.

На этом обзор физики можно и закончить, с выводами:
AMD потоки работают интереснее, чем у Intel, в именно этой реализации.
Максимальная производительность по чтению по дисковым операциям на физическом хосте достигается на числе потоков данных = числу потоков CPU
Производительность на чтение от очереди зависит достаточно слабо, то есть на очереди 8 выжало не 430, а 440k IOPS, на очереди 16 и 32 – 450k IOPS.

Внезапно, наловил ошибок – удалил старые файлы тестов, а новые, с тем же именем, не создаются!
There has been an error during threads execution
Error generating I/O requests
Оказалось, в какой-то момент в середине ночи удалил параметр с размером файлов.  Случайно. И даже не заметил. Поправил и завелось.

И, наконец, влияние read-modify-write для любителей дисков потолще.

Показать не удалось, потому что:
Картина на файле 10 гигабайт и длительности записи 10 секунд и прогреве W=10

Новый ноутбук 2: скорость, плюсы-минусы, DiskSPD, Hyper-V и далее Windows, Статистика, Жесткий диск, IT, Импортозамещение, Microsoft, Опыт, Длиннопост

Картина приплыли на файле 200 гигабайт при прогреве W=2

До этого прогрев был W=10. И, в таблице ниже, 3.5k это не опечатка, 3500 IOPS

Новый ноутбук 2: скорость, плюсы-минусы, DiskSPD, Hyper-V и далее Windows, Статистика, Жесткий диск, IT, Импортозамещение, Microsoft, Опыт, Длиннопост

Везде забыл проставить k, это тысячи IOPS

Как бы так сказать, что при таком разбросе данных, это не тестирование, а полная и беспросветная лажа?

Потому что ничего не понятно, кроме того, что не зря замерял при разных параметрах. Получить лажу и увидеть ее полезно.

Перейдем к SQLsim.
Для опытов был взят Microsoft® SQL Server® 2019 Express,
Будете ставить – не забывайте сразу качать SQL Server Management Studio, пригодится.

файл отдельно не качается (я не нашел), поэтому скачал, поставил и вот -
C:\Program Files\Microsoft SQL Server\MSSQLXX.<InstanceName>\MSSQL\Binn

В GUI варианте теста «по умолчанию» ничего сложного – размеры файлов, размещение, число циклов, длина теста. Просто, наглядно.

Одна проблема – по умолчанию на 1 цикл поставлено 600 секунд (10 минут), и 12 циклов – то есть базовый тест – это два часа.

В конце теста генерируется sqliosim.log.xml.

Вторая проблема: тест не выдает в итоге каких-то цифр, типа «вы молодец, давайте дальше» - только таблицу

Display Monitor ********** Final Summary for file sqliosim.ldx ********** CLogicalFile::OutputSummary fileio.cpp

Display Monitor File Attributes: Compression = No, Encryption = No, Sparse = No CLogicalFile::OutputSummary fileio.cpp

Display Monitor Target IO Duration (ms) = 100, Running Average IO Duration (ms) = 0, Number of times IO throttled = NN, IO request blocks = NN CLogicalFile::OutputSummary fileio.cpp

Display Monitor Reads = NN, Scatter Reads = 0, Writes = NN, Gather Writes = 0, Total IO Time (ms) = NN CLogicalFile::OutputSummary fileio.cpp

Display Monitor DRIVE LEVEL: Sector size = 512, Cylinders = NN, Media type = NN, Sectors per track = 63, Tracks per Cylinders = 255 CLogicalFile::OutputSummary fileio.cpp

Display Monitor DRIVE LEVEL: Read cache enabled = Yes, Write cache enabled = Yes CLogicalFile::OutputSummary fileio.cpp

Display Monitor DRIVE LEVEL: Read count = BB, Read time = BB, Write count = BB, Write time = NN, Idle time = NN, Bytes read = NN, Bytes written = NN, Split IO Count = 0, Storage number = NN, Storage manager name = VOLMGR  CLogicalFile::OutputSummary fileio.cpp

Я молодец, ок, а дальше что?

Конечно, если вы молодец (как я), то будете смотреть не только в окно самой программы, а запустите resmon и будете смотреть нагрузку по дискам, очереди, задержки, etc.

Перейду к hammerdb .. но это уже другая история.

В следующих сериях, теперь уже точно!
Опыты на виртуальной машине на 3 ядра.

CPU affinity
Опыты на Debian внутри Hyper-V, опыты с Proxmox nested. Stay tuned!

Литература

Performance benchmark test recommendations for Azure NetApp Files
Azure NetApp Files regular volume performance benchmarks for Linux
Hidden Treasure Part 1: Additional Performance Insights in DISKSPD XML
Hidden Treasure Part 2: Mining Additional Insights

Command line and parameters
Customizing tests
Use an XML file to provide DiskSpd parameters
Use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem

SQL Server I/O Basics, Chapter 2
Use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem on Linux
SQLIOSim Create a realistic I/O load for stress-testing SQL Server 2005

about_Comparison_Operators
about_Assignment_Operators

hammerdb Documentation

PS

И немного powershell.

Часть 1, которую вы уже видели

$pciStats = (Get-WMIObject Win32_Bus -Filter 'DeviceID like "PCI%"').GetRelated('Win32_PnPEntity') |

foreach {

# request connection properties from wmi

[pscustomobject][ordered]@{

Name = $_.Name

ExpressSpecVersion=$_.GetDeviceProperties('DEVPKEY_PciDevice_ExpressSpecVersion').deviceProperties.data

MaxLinkSpeed  =$_.GetDeviceProperties('DEVPKEY_PciDevice_MaxLinkSpeed'  ).deviceProperties.data

MaxLinkWidth  =$_.GetDeviceProperties('DEVPKEY_PciDevice_MaxLinkWidth'  ).deviceProperties.data

CurrentLinkSpeed  =$_.GetDeviceProperties('DEVPKEY_PciDevice_CurrentLinkSpeed'  ).deviceProperties.data

CurrentLinkWidth  =$_.GetDeviceProperties('DEVPKEY_PciDevice_CurrentLinkWidth'  ).deviceProperties.data

} |

# only keep devices with PCI connections

Where MaxLinkSpeed

}

$pciStats | Format-Table -AutoSize


Get-CimInstance -ClassName Win32_Volume | Select-Object DriveLetter, FileSystem, BlockSize| Format-Table -AutoSize


$Path001 = 'C:\DiskSpd\amd64\'

$Sp = $Path001 + "diskspd.exe"

cd $Path001

$Rn = Get-Random -Minimum 1 -Maximum 10

$Version = "070_" + $Rn


$Drives = @("C")

$FilesTemp = "Data4del"

$File001 = "deleteme_01a.dm"

$File002 = "deleteme_02a.dm"

$File003 = "deleteme_03a.dm"

$Out021 = $Drives[0] + ':\' + $FilesTemp + '\' + $File001

$Out022 = $Drives[0] + ':\' + $FilesTemp + '\' + $File002

$Out023 = "D" + ':\' + $FilesTemp + '\' + $File003

# $OutsFilesAA = @("$Out021", "$Out023", "$Out021 $Out022","$Out021 $Out023","$Out021 $Out022 $Out023") - не работает вот так и все.

$OutsFilesAA = @( "$Out022")

$Logs = @()

$Threads = @("-t1","-t2", "-t3", "-t4","-t5","-t6","-t7","-t8","-t9","-t10","-t11","-t12","-t13","-t14","-t15")

# $Threads = @("-t1")

# $Write = ("-w0","-w30", "-w100")

$Write = @("-w100")

#$BlockSize = ("-b4k","-b8k")

$BlockSize = @("-b4k")

# $Outstanding = @("-o2","-o4","-o8","-o16","-o32")

$Outstanding = @("-o2")

$Size = "-c200G"

$Time = "-d10"


foreach ($OutFilesGr in $OutsFilesAA){

foreach ($Drv in $Drives){

foreach ($Bl in $BlockSize) {

foreach ($Wr in $Write) {

foreach ($Outs in $Outstanding){

foreach ($T1 in $Threads){


$TimeNow = get-date -UFormat "-%d-%m-%Y-%R" | ForEach-Object {$_ -replace ":","-"}

Write-Host "TT " $TimeNow

$Out001 = $Drv + ':\' + $FilesTemp + '\' + $File001

$Out002 = $Drv + ':\' + $FilesTemp + '\' + $File002

$Out003 = "D" + ':\' + $FilesTemp + '\' + $File003


$Stat1 = $Drv + ':\' + $FilesTemp + '\' + $Version + $TimeNow + "_" + $T1 + $Drv + $Outs + $T1 +'_1.log'

$Stat2 = $Drv + ':\' + $FilesTemp + '\' + $Version + $TimeNow + "_" + $T1 + $Drv + $Outs + $T1 +'_2.log'

$Stat3 = $Drv + ':\' + $FilesTemp + '\' + $Version + $TimeNow + "_" + $T1 + $Drv + $Outs + $T1 +'_3.log'

$Logs += $Stat1


Write-Host "testing mode " $T1 $Wr $Bl $Outs 'time' $Time # "GR" $OutFilesGr

# &$Sp $T1 $Wr $Bl -W10 $Outs $Time -Suw -D -L $Size $Out021 $Out022 > $Stat1

&$Sp $T1 $Wr $Bl -W10 $Outs $Time -Suw -D -L $Size $Out021 > $Stat1

}}}}}}

И часть 2

$FilesTempDir = "c:\Data4del\"

$StatFiles = "069"

$StatFilesList = Get-ChildItem -Path $FilesTempDir | Where-Object {$_.Name -like ($StatFiles + '*') | Sort-Object -Property CreationTime  }


foreach ($MyFile in $StatFilesList){

$TempData1 = Get-Content $MyFile.FullName  | Where-Object {$_ -like "Command Line*"}

$TempData1

$TempData2 = Get-Content $MyFile.FullName  | Where-Object {$_ -like "total:*"}

$TempData2

}

Показать полностью 3
Отличная работа, все прочитано!