TLDR : добавление большего количества потоков для одновременной работы с bcp
копируемыми файлами данных, по-видимому, влияет на , подавляя конечную точку MSSQL Server инструкциями по записи, вызывая bcp
Потоки потерпели неудачу (может быть, истекло время ожидания) Когда число потоков становится слишком большим, кажется, зависит от размера копируемых файлов bcp
(т.е. как количество записей в файле, так и ширина каждой записи (т.е. числостолбцов)).
Длинная версия (больше причин для моей теории) :
1. При запуске большего числа bcp
потоки и просмотр процессов, запущенных на компьютере (https://clustershell.readthedocs.io/en/latest/tools/clush.html)
ps -aux | grep bcp
, наблюдающих несколько спящих процессов (обратите внимание на S
, см. https://askubuntu.com/a/360253/760862), как показано ниже) (добавлены новые строки дляудобочитаемость)
me 135296 14,5 0,0 77596 6940? S 00:32 0:01
/ opt / mssql-tools / bin / bcp TABLENAME в /path / to / tsv / 1_16_0.tsv -D -S MyMSSQLServer -U myusername -P -d myDB -c -t \ t -e / path / to / logfile
Эти темы отображаются в спящем режимев течение очень долгого времени. Дальнейшее выяснение того, почему эти потоки спят, предполагает, что они могут фактически выполнять свою намеченную работу (что будет способствоватьЭто означает, что проблема может исходить от самого BCP (см. https://stackoverflow.com/a/52748660/8236733)). С https://unix.stackexchange.com/a/47259/260742 и https://unix.stackexchange.com/a/36200/260742)
Процесс в состоянии S обычно находится в системе блокировкивызов, например чтение или запись в файл или сеть, или ожидание завершения другой вызываемой программы .
(например,запись в конечную точку MSSQL-сервера, указанную для bcp
в ODBCDSN)
Ваш процесс будет в состоянии S, когда он выполняет операции чтения и, возможно, записи, которые блокируют .Это также может произойти при ожидании семафоров или других примитивов синхронизации ... Это все нормально и ожидаемо, и обычно это не проблема ... вы не хотите, чтобы он тратил впустую процессор, пока он ожидает ввода пользователя.
2. При запуске разных наборов файлов с разным количеством записей на файл (например, диапазоны 500000 - 1000000 строк / файл) и шириной записи на файл (~ 10- 100 столбцов / строка), обнаружил, что в случаях с очень большой шириной данных или объемами, запуск фиксированного набора потоков bcp
завершится с ошибкой .
Например.для набора ~ 33 TSV с ~ 500000 строк каждая, каждая строка имеет ширину ~ 100 столбцов, набор из 30 потоков записал бы первые несколько OK, но затем все остальные начнут возвращать сообщения об ошибках.Включая немного из ответа @ jamie, тот факт, что возвращаемые сообщения об ошибках являются "BCP copy in failed"
ошибками, не обязательно означает, что они имеют отношение к содержанию рассматриваемых данных.Из-за отсутствия реального содержимого, записанного в файлы журнала ошибок -e
из моего процесса, сообщение @ jamie говорит, что это
Что касается параметра "-e", он предназначен для вывода ошибок данных. ошибки входа в систему, неверные имена таблиц ... многие другие ошибки не сообщаются в файле, созданном с параметром -e .Когда вы получите вывод, используя опцию «-e», вы увидите информацию типа «усеченное значение», и такая ... даст вам номера строк и примеры данных, которые были спорными.
Между тем, набор из ~ 33 TSV с ~ 500000 строк каждая, каждая строка имеет ширину ~ 100 и все еще использующий 30 bcp
потоков, завершится быстро и без ошибок (также будет быстрее, когдауменьшение количества потоков или набора файлов). Единственным отличием здесь является общий размер данных, bcp
скопированных на MSSQL-сервер.
Все это пока
free -mh
ещепоказал, что на машине, на которой выполнялись потоки, в каждом случае оставалось ~ 15 ГБ свободной оперативной памяти (и это опять-таки, почему я подозреваю, что проблема связана с удаленной конечной точкой MSSQL-сервера, а не с кодом или локальной машиной сам).
3. При запуске некоторых тестов из (2) обнаружил, что вручную убивает процесс parallel
(через CTL+C
), а затем пытается удаленно обрезать таблицу тестирования, в которую записывается/opt/mssql-tools/bin/sqlcmd -Q "truncate table mytable"
на локальном компьютере займет очень много времени (в отличие от ручного входа на сервер MSSQL и выполнения truncate mytable
в БД).Опять же, это заставляет меня думать, что это как-то связано с тем, что MSSQL Server имеет слишком много соединений и просто перегружен.
** Любой, у кого есть опыт MSSQL Mgmt Studio, читал это (у меня естьв основном нет), если вы видите здесь что-то, что заставляет вас думать, что моя теория неверна, пожалуйста, дайте мне знать ваши мысли.