SMO, SSMS повільно керують SQL Server у Docker при підключенні до localhost


9

TL; DR: Під час підключення до мого контейнера Docker SQL Server через ім'я, яке вирішує цикл IPv6 ( ::1), дзвінки SMO ​​дійсно повільні. Під час використання 127.0.0.1вони швидкі.


Я намагаюся навчитися використовувати Docker image microsoft / mssql-server-windows-developer . Згідно з документацією Microsoft, цей контейнер відкриває лише порт 1433 TCP.

docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer

Я запускаю контейнер у Windows 10 і успішно запускаю його, перевіряючи автентифікацію на SQL Server і виконуючи запити проти екземпляра за допомогою sqlcmd та SSMS 17.4 на хості Windows (підключення до localhost або “.”) Та SQL Operations Студія на сусідньому комп'ютері, підключений по IP. Я не бачу помітних проблем із ефективністю при виконанні запитів таким чином.

У SSMS я також можу переглядати провідник об’єктів, але якщо я спробую зробити щось із меню правої кнопки миші на об'єкті в Explorer Explorer, наприклад відкрити вікно параметрів екземпляра або долучити базу даних, SSMS не відображає відповіді близько 5 -10 хвилин, після чого він або відображає вікно, про яке я попросив, або відображає це повідомлення про помилку:

Повідомлення про помилку SSMS

Я також намагаюся зробити деякі сценарії PowerShell проти цього примірника, використовуючи об’єкт SMO Scripter , і побачити таку ж поведінку. Сценарій PS перебирає об'єкти в базі даних і скриптує їх до файлу, і, хоча він працює відносно швидко, збирає список об'єктів, кожен окремий об'єкт займає 5-10 хвилин для сценарію - занадто повільний, щоб бути корисним.

У мене є думка, що одного відкритого порту недостатньо, і що SMO та SSMS намагаються підключитися аналогічним чином, який уповільнює їх. Чи може бути так, що під час підключення до localhost ці інструменти припускають, що існують інші канали зв'язку, які, як правило, не підлягають фальшиві? Чи є якісь додаткові параметри з'єднання, які я міг би використовувати? Чи може хтось підтвердити моє припущення, що SSMS використовує SMO або щось інше, щоб поговорити з SQL Server?


ОНОВЛЕННЯ: Я все ще розслідую, але правдоподібно, що це проблема Докера навколо обмеження ресурсів. Це заплутано, оскільки більша частина документації вказує на те, що контейнери Windows не мають обмежень щодо ресурсів за замовчуванням (і їх не можна встановити в графічному інтерфейсі Docker for Windows - лише для контейнерів Linux ), але здається, що насправді Windows контейнери, що працюють на Windows 10, отримують за замовчуванням розподіл оперативної пам’яті 1 Гб. Я все ще намагаюся розібратися, як перевірити запущений контейнер, щоб побачити його оперативну пам’ять та розподілення процесора, але далі я повинен просто спробувати збільшити ті, які є за замовчуванням, використовуючи docker runпараметри.


ДУШЕ ОНОВЛЕННЯ: Мені не вдалося отримати з докера будь-яку надійну метрику, яка повідомляє мені, які обмеження процесора та пам'яті є у контейнера. Різні дослідження показують, що або докер-контейнери не мають обмеження пам’яті за замовчуванням, або що вони роблять, і це 1 Гб, але все, що я можу перевірити на даний момент, - це docker statsте, що кажуть, що контейнер SQL використовує лише від 750 до 850 мег, і коли Я намагаюся додати параметр запуску, щоб встановити доступну пам'ять до 4 ГБ, вона помиляється. Тож я перестав слідкувати за цією темою запиту та пішов на іншу перевірку кишок: ввівши інтерактивний сеанс оболонки повноважень на запущеному контейнері, а потім викликав мій скрипт повноважень, пов'язаний вище зсередини контейнера.

Пробігаючи всередині контейнера, проблем не було. Він промайнув через 2780 об’єктів всього за пару хвилин. Я думаю, це підтверджує, що проблема полягає в межі контейнера / хоста, тому я перегляну, чи зможу я відкрити цей порт UDP. ОНОВЛЕННЯ: Відкриття порту 1434 UDP не допомогло.


БІЛЬШЕ ОНОВЛЕННЯ - Досягнуто вирішення, не проблема з обмеженням ресурсів: Можливо, виникають проблеми, пов’язані із встановленням великих розмірів пам'яті для контейнерів Windows - я отримував подібні помилки для 3g та 2g, але в кінцевому підсумку вдалося запустити контейнер з 1,5g, і Я DID бачив різницю в docker statsконтейнері, що (я думаю) підтверджує, що він працює з виділенням за замовчуванням 1 Гб. У налаштуваннях за замовчуванням статистика PRIV WORKING SET (для якої я не можу знайти жодної документації, але я найкраще здогадуюсь, що це оперативна пам'ять) становить від 700 Мбіт до 850 Мбіт. Зdocker run —memory="1.5g"встановити, це близько 1,0 Гбіт. Таким чином, він розширився, але, здається, залишає більшу частину виділення безкоштовно, ніж раніше. Я трактую це (можливо, неправильно), щоб означати, що цей сервер (який працює абсолютно без навантаження та не має баз даних користувачів) не знаходиться під тиском пам'яті. Я перевірив налаштування максимальної пам'яті сервера, щоб підтвердити, що він встановлений за замовчуванням максимумом 2PiB.

Тоді речі стали дивними. Я все ще тестую речі, запускаючи скрипт повноважень із різних місць. Швидко всередині контейнера, повільно на хості. Потім я RDP'd до іншої машини Windows в мережі, і запустив сценарій з цієї машини, підключившись до мого Windows 10 хостом по IP. І це було ШВИДКО! Це, мабуть, підтримує теорію, що під час підключення до чогось, що повинно бути localhost, SMO намагається підключитися до SQL Server за допомогою чогось іншого, ніж порт 1433 TCP, що чекає дуже тривалий час очікування, перш ніж повернутися до TCP-з'єднання.

Я вирішив спробувати перевірити цю теорію, ввівши запис файлу хостів, щоб посилатися на localhost іменем, відмінним від localhost:

        127.0.0.1       dockersucks

Я підключився в SSMS до dockersucks замість localhost або ".", І відразу все пройшло швидше. Навігація за допомогою "Провідника об'єктів" була, як звичайно, і відкриття панелей на зразок прикріплення властивостей баз даних або сервера відбувалося так само швидко, як звичайно. І коли я запустив свій скрипт повноважень з хоста Windows 10, використовуючи цей псевдонім як ім'я сервера, це було також швидко.

Я додав це оновлення до питання замість відповіді, оскільки я все ще шукаю пояснення, чому це відбувається, і якщо є спосіб виправити це для підключення до "localhost" за цим ім'ям.


Можливо, ваш екземпляр докера трохи не працює? Якби це була проблема з портом, я сумніваюся, ви бачите, що це працює взагалі, тож я б не витрачав багато часу на цю дорогу.
LowlyDBA

Так, я думав про це, але виконання запитів здається чудовим, тому воно здається обмеженим лише певними типами дій. Мені також потрібно перевірити запуск SMO з контейнера INSIDE і переконатися, що проблеми там немає.
NReilingh

1
Я не пропустив тієї частини. SQL Server використовує об'єднання з'єднань. Я розумію, що це засмучує, але я також хочу вразити вас, щоб переконатися, що контейнер (або "дивний Hyper-V lite VM" у цьому випадку) має достатню кількість оперативної пам'яті. Ваш сценарій PS працював "швидко", але хвилин для пробігу через ~ 3000 об'єктів повільно в машині з достатньою кількістю оперативної пам'яті (тобто більше 2 Гб).
Рандольф Вест

1
Якщо бути чесним, вам, мабуть, краще відкрутити Ubuntu Hyper-V VM на вашому комп'ютері та встановити на цьому SQL Server для Linux.
Рандольф Вест

1
@bazzilic Я пояснюю, чому у своїй відповіді. Будь ласка, прокоментуйте там, якщо вам потрібно уточнення.
NReilingh

Відповіді:


3

Це, швидше за все, проблема голодування в ОЗУ.

Що потрібно перевірити:

  • Чи призначений контейнеру 4 ГБ оперативної пам’яті? Перевірте цю відповідь .
  • Ви налаштували параметр Max Server Memory for SQL Server всередині контейнера? Залежно від кількості оперативної пам'яті SQL Server в контейнері, це може бути встановлено на рівні від 1 ГБ до 3,25 ГБ.
  • Чи використана оперативна пам’ять вашого хоста, і чи можливо, що Докер переходить на диск? Закрийте будь-які сторонні програми (веб-браузери є великими споживачами оперативної пам’яті). Для використання SSMS потрібно близько 1 ГБ оперативної пам'яті.
  • Це швидше після перезавантаження?

Якби я робив це сам, я встановив би Docker Community Edition для Windows з магазину Docker , а потім встановив зображення Docker SQL Server таким чином.

Якщо ваш Інтернет-зв'язок досить швидкий, ви можете працювати і працювати за 5 хвилин і мати можливість розподіляти ресурси набагато простіше.

EDIT: Ах, мереж.


Не впевнений, чи не розумієте цього, але я не запускаю SSMS всередині контейнера. Це неможливо, оскільки контейнери Windows наразі не підтримують з'єднання RDP або графічний інтерфейс. Я вже знаю, що SQL Server не повільний - але мені потрібно розібратися, чи голодую цей докер-контейнер за ресурси. Хост Windows 10, на якому працює контейнер і SSMS, має 10 Гб оперативної пам’яті та 2 ядра, але я не впевнений, скільки отримує контейнер.
NReilingh

Мою відповідь було переписано
Рандольф Вест

Див. Оновлення Q для отримання додаткової інформації. Зауважте, що це складання образу власного контейнера в Microsoft, тому я думаю, що ми досить впевнені, вважаючи, що налаштування в контейнері не буде проблемою.
NReilingh

2
Будь ласка, не робіть цього припущення!
Рандольф Вест

@NReilingh Я додав URL у свою відповідь для вас, щоб вивчити -mваріант.
Рандольф Вест

3

Ключова відмінність тут полягає в тому, чи намагається SSMS / SMO підключитися до IPv4 або IPv6. Якщо ви робите ping localhostкомандний рядок, ви повинні бачити його рішення ::1, яке відповідає еквіваленту IPv6 127.0.0.1. Підключення до .робить те саме.

Ваша docker runкоманда відкриває порт 1433 далі 127.0.0.1. Ви можете перевірити це, запустивши, netstat -aщоб побачити, які порти доступні.

Псевдонім файлів хостів, створений вами, вирішується безпосередньо 127.0.0.1, але він вам не потрібен, оскільки ви можете підключитися 127.0.0.1безпосередньо до SSMS і вирішити свою проблему таким чином. Відключення IPv6 повністю у вашій хост-системі, ймовірно, також спрацює, але я не впевнений, наскільки це доцільно в Windows 10.

Я розглядаю альтернативну відповідь, щоб прийняти, якщо хтось може мені сказати, чому IPv6 викликає це порушення.


Ви спробували підключитися до tcp: localhost? Можливо, SSMS / SMO намагаються підключити спільну пам'ять або названі трубові з'єднання, коли ім'я localhost або (local) або навіть ". і :: 1. Я не знаю, чи SSMS 17.4 безумовно використовує SMO в Object Explorer, але я думаю, що це можливо.
Містер Магуо

@MisterMagoo Введення tcp:localhostв поле імені сервера, схоже, не працює, але я намагався без уточнення вказати TCP / IP у властивостях з'єднання. Я все ще думаю, що проблема є повільним резервом 127.0.0.1для localhost, коли ::1не вдається. Я думаю, що мої вікна запитів працювали, тому що вони підтримували зв’язок, тоді як мій сценарій із використанням SMO створював нові з'єднання знову і знову.
NReilingh

1
@NReilingh Я бачу цю саму проблему - ваше усунення несправностей та пояснення справді були корисними. Адресація мого контейнера-сервера sql як 127.0.0.1 ( не localhost ) з мого середовища хосту була єдиним способом я можу змусити хоста до з'єднань контейнерів працювати нормально.
rogersillito
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.