Comments 74
В идеальном мире да
Но у нас постепенно апгрейдили хосты, добавляли новые, списывали старые
Но частота разная
А как Hyper-V относится к машинам с разной частотой?
понижает производительность или не даёт виртуальной машине использовать некоторые инструкции SIMD и т.п.?
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn859550(v%3Dws.11)
ну то есть большинству приложений, не задействующих эти самые инструкции (или задействующих в гомеопатических дозах), пофиг.
Грубо говоря, мы загнали большой мощный грузовик в городской траффик, и наблюдаем, как его лихо обгоняют доставщики пиццы на скутерах — тут не важен throughput, важна лишь latency. А ни один network storage, сколько бы нулей ни было в его цене, не сможет выиграть по latency у локального SSD
так-то у нас локальные nvme используются, но ЕМНИП от СХД тоже можно получить задержки менее 1мс. если, конечно, речь не про iSCSI и не про СХД в соседнем городе.
Desktop — 39 секунд, 15K tr/sec, 0.065ms /io roundtrip
PROD — 360 секунд, 1600 tr/sec, 0.6ms
Я должен был обратить внимание, что уж слишком быстро
всё равно быстро. обычно десктопные накопители выдают сотни iops на синхронной записи.
а что за ssd? может быть он просто их тех, что молча игнорируют fsync? )
ssd.userbenchmark.com/SpeedTest/495225/KINGSTON-SA1000M8960G
KINGSTON A1000 NVMe PCIe M.2 960GB
Как проферить вашу гипотезу?
PROD — 360 секунд, 1600 tr/sec, 0.6ms
а почему так медленно?
мне кажется, что с вашей СХД что-то не в порядке.
получается примерно 40мкс на операцию ввода-вывода, как-то грустно.
я думал, что СХД с FC (и агрессивным кэшированием) гораздо быстрее.
Сам storage отдает «готово» мгновенно (write-behind, с гарантией с помощью небольшого аккумулятора)
вот и странно, я получал RTT меньше 20мкс по обычному ethernet, FC должен быть быстрее.
Думаю в нашем случае есть еще хопы
Ведь любой из многих хостов может работать с любым из многих стораджей…
многие свитчи обещают задержку менее 1мкс. есть, правда, ещё задержки в трансиверах, но в любом случае задержка, вносимая физической сетью, укладывается в единицы микросекунд (если у вас не многокилометровая оптика, конечно).
тут больше вклад обработки сетевых драйверов, обработки прерываний, стека tcp/ip и всего такого. шина pci-e небезгрешна, кстати, похоже (почему pci-e optane имеет latency порядка 10мкс? те же микросхемы в виде модулей памяти горадо быстрее).
так вот, в случае подключения к схд по fc мы отказываемся от tcp/ip, драйверы (да и сами адаптеры) должны быть оптимизованы под низкие задержки — поэтому я ожидал результатов получше.
Браво, хорошее, я бы даже сказал крутое расследование! Таким и должен быть айтишник.
Была написана программаА можно бинарник?
А студии дома нет, можете через консоль скомпилировать)
Компилятор дот нет (консольный) есть ВСЕГДА. Загуглите как скомпилить. Я просто с телефона сейчас
Program.cs(4,10): error CS0246: Не удалось найти имя типа или пространства имен «DllImport» (пропущена директива using или ссылка на сборку?)
Program.cs(7,10): error CS0246: Не удалось найти имя типа или пространства имен «StructLayout» (пропущена директива using или ссылка на сборку?)
Если добавить первой строчкой «using System.Runtime.InteropServices;», то на выходе:
Program.cs(24,60): error CS1026: ожидалась )
Program.cs(24,68): error CS1002: ожидалась;
Program.cs(24,68): error CS1525: Недопустимый терм ")" в выражении
GetSystemTimePreciseAsFileTime(out fileTime);
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
Заменил .Net на 4.8:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe Program.cs
Файл скомпилилровался и даже работает, начиная с Server 2012, спасибо.
Moral of the story: писать "if-then-else"-style на SQL — зло. Ибо заколачивание гвоздей микроскопом.
Чисто формально, ближайший PCI-Express свитч с соответствующими nvme утрёт нос десктопу (но не vmware, которая слоупок своего рода).
techcommunity.microsoft.com/t5/sql-server-support/how-it-works-sql-server-timings-and-timer-output-gettickcount/ba-p/315782
randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted
нетривиальных нулей дзета-функции
Напомнило историю с Windows 95 который как мне казалось в детстве быстрее работал если шевелить мышкой, а потом оказалось что не казалось, а так и было )
Спасибо за статью!
"Оказалось, что не казалось" ©
А что там за история (я не про "казалось", а про технические детали), ссылочка есть?
И не только в Хроме. Windows динамически повышает базовый приоритет процессов который получают активный input. Пруф: https://docs.microsoft.com/en-us/windows/win32/procthread/priority-boosts
В «обычной» обстановке вы это вряд ли заметите, но вот если в результате такой динамической приоретизации какие-то потоки станут time critical (приоритет 31), тогда вы уже можете (теоретически) увидеть разницу на глаз. Потому что time critical это не просто «высокий» приоритет, это наивысший приоритет — потокам time critical отдаётся всё процессорное время, которое есть; отправляя остальные потоки отдыхать «за свой счёт».
Посмотрите на ютубе доклады CLRium если хочется больше подробностей, там хотя и про .NET, но многое справедливо для Windows в целом.
Ах да, это десктопная штука, которую придумали чтоб пользователи могли ускорять инсталляторы рисуя на экране бесконечные восьмерки :)
На серверах эта магия обычно выключена. Помните настройку «отдавать приоритет фоновым процессам»? — она вот как раз про это (кроме всего прочего)
Только time critical - это 15, а не 31.
у меня есть два совершенно одинаковых сервера, на одном стоит vmware, на другом нет виртуализации.
версии windows, ms sql одинаковые.
так вот, второй скрипт (арифметика) выполняется примерно одинаково (потери на виртуализацию менее 10%), первый же скрипт (много мелких транзакций) на "железной" машине выполняется за 26-27с, на виртуальной лучшее время 80с, среднее по 6 запускам — 91с.
WTF?
Спасибо за статью.
на «быстрых» машинах — 16-18 миллионов циклов в секунду.На моем i5-3570:
на медленных — полтора миллиона, а то и 700 тысяч.
Релиз-программа x32 bit с выключенным в BIOS HPET выдает 7.6 миллионов циклов в секунду.
Дебаг-версия x32 bit с выключенным HPET выдает 3.2 м/сек.
У меня 32 бита не зависит от вкл/выкл HPET.
Релиз x64 bit с включенным HPET выдает 17 м/сек.
Релиз x64 bit с выключенным HPET выдает 15.5 м/сек.
Интересно, неужели 32/64 bit transition так замедляет?
# sysctl kern.eventtimer
kern.eventtimer.periodic: 0
kern.eventtimer.timer: LAPIC
kern.eventtimer.idletick: 0
kern.eventtimer.singlemul: 2
kern.eventtimer.choice: LAPIC(600) HPET(550) HPET1(440) HPET2(440) HPET3(440) HPET4(440) HPET5(440) HPET6(440) i8254(100) RTC(0)
kern.eventtimer.et.i8254.quality: 100
kern.eventtimer.et.i8254.frequency: 1193182
kern.eventtimer.et.i8254.flags: 1
kern.eventtimer.et.RTC.quality: 0
kern.eventtimer.et.RTC.frequency: 32768
kern.eventtimer.et.RTC.flags: 17
kern.eventtimer.et.HPET6.quality: 440
kern.eventtimer.et.HPET6.frequency: 14318180
kern.eventtimer.et.HPET6.flags: 3
kern.eventtimer.et.HPET5.quality: 440
kern.eventtimer.et.HPET5.frequency: 14318180
kern.eventtimer.et.HPET5.flags: 3
kern.eventtimer.et.HPET4.quality: 440
kern.eventtimer.et.HPET4.frequency: 14318180
kern.eventtimer.et.HPET4.flags: 3
kern.eventtimer.et.HPET3.quality: 440
kern.eventtimer.et.HPET3.frequency: 14318180
kern.eventtimer.et.HPET3.flags: 3
kern.eventtimer.et.HPET2.quality: 440
kern.eventtimer.et.HPET2.frequency: 14318180
kern.eventtimer.et.HPET2.flags: 3
kern.eventtimer.et.HPET1.quality: 440
kern.eventtimer.et.HPET1.frequency: 14318180
kern.eventtimer.et.HPET1.flags: 3
kern.eventtimer.et.HPET.quality: 550
kern.eventtimer.et.HPET.frequency: 14318180
kern.eventtimer.et.HPET.flags: 7
kern.eventtimer.et.LAPIC.quality: 600
kern.eventtimer.et.LAPIC.frequency: 2893493164
kern.eventtimer.et.LAPIC.flags: 7
Рекомендую автору начать со следующих ресурсов:
blogdonicolett.com.br/2015/03/01/melhor-configuracao-de-qlikview-para-vmware
www.microsoft.com/en-us/download/details.aspx?id=51960
www.gilev.ru/virtual
Также не забываем про NUMA, EVC, Ballooning и о многих других вещах, которые могут сильно влиять на производительность в виртуальных (и не только) средах
После оптимизации замерить вашей программой, и понять что как влияет
Да мой старый laptop в несколько раз мощнее, чем ваш production server