Влияние HDD на быстродействие 1С:Предприятие 8.1 (изобретаем велосипед)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

37 Comments

  1. kitt

    Не совсем понятно почему речь идет только о клиент-сервере MSSQL?

    Мне кажется вся система должна после этого работать быстрее на 9 до 23%. Или кто нибудь может объяснить первую версию? жду комментариев.

    Reply
  2. vde69

    для выявления узких мест SQL сервера (под рабочей нагрузкой) рекомендую http://infostart.ru/projects/2831/

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

    Reply
  3. Gilev.Vyacheslav

    (1) Наибольший процент прироста ожидается в варианте с MS SQL Server. Тем не менее есть смысл делать для любого варианта использования 1С:Предприятие, просто эффект будет меньшим. У меня нет данных, как это скажется в Postgre под Винду. Понятно, что под линуксом этой проблемы не стоит.

    Reply
  4. Gilev.Vyacheslav

    (2) дружок, этот вариант куда актуальней http://www.gilev.ru/1c/81/lock/index.htm

    Reply
  5. vde69

    (4) я это конечно смотрел, вещь безусловно нужная, но это РАЗНЫЕ вещи. И они для разного предназначены.

    та вещь для оптимизации кода конкретной базы, а (2) для оптимизации клиент серверной системы в целом (железо)

    Reply
  6. Gilev.Vyacheslav

    (5) для оптимизации кода 8.1 пока лучше 1С:ЦУП ничего не придумано http://v8.1c.ru/expert/pmc/pmc_overview.htm .

    Тут даже опсуждать нечего.

    Reply
  7. Gilev.Vyacheslav

    пардон, обсуждать

    Reply
  8. vde69

    (6) не смотрел, спс за ссылку, но еще раз говорю, что решение (2) оно показывает проблеммы клиент серверной системы (не обязательно 1с и с любым количеством баз), это РАЗНЫЕ вещи, и они не заменят друг друга.

    Для примера у нас: на основании результата (2) удалось уменьшить обшее ожидание блокировок в ТРИ раза путем замены одного хаба на свич…

    Reply
  9. Gilev.Vyacheslav

    (8) если есть такая вера в эффективность, я «сдаюсь» 🙂

    Reply
  10. vde69

    (9) ну я тоже тогда «сдаюсь» 🙂

    а с дисками я нашим админам ссылку дал, думаю будет польза

    Reply
  11. hogik

    (0)Не понимаю:

    1) «RAID0 из одного диска» — это шутка?

    2) «будет затрагивать два сектора» — может быть не сектора, а «блока»?

    3) «Размер блока и размер кластера… устанавливать одинаковыми» — блока или полосы?

    4) «…система создает самый первый кластер (блок начальной загрузки MBR) размером в 63Кб» — какая связь между кластером и MBR? В одной из приведенных Вами ссылок написано: «На дисках с основной загрузочной записью (MBR) смещение и размер раздела округляются для сохранения требуемой конфигурации цилиндров до ближайшего действительного значения (размер — с повышением)».

    5) И т.д.

    А в целом — вопрос выбора «размера» единицы ввод/вывода информации на «физическом» и «логическом» уровне для минимизации операций ввода/вывода весьма актуальна. Но читать надо немного побольше чем написал Александр Гладченко. ;-)))

    Reply
  12. Gilev.Vyacheslav

    (11) вот что меня всегда поражает в людях — это желание пофлудить, не важно о чем даже флудить

    поэтому попробую ответить так, чтобы остальных ваш пост не ввел в заблуждение:

    1) существует проблема

    2) описан алгоритм поиска симптомов

    3) описан алгоритм устанения проблемы

    4) проблема гораздо сложней, здесь показана только информация для пунктов (2-3)

    5) любой, кто прочитал эту статью и решит разобраться подробней, может по указанным в этой статье ссылка прочитать всю исчерпывающаю информацию

    теперь ответ Вам — см. пункт 5

    Reply
  13. hogik

    (12)(gilv)

    Перечисление явных ошибок в изложенном материале (не Вами, а Александром Гладченко) — это «флуд»?

    Reply
  14. Gilev.Vyacheslav

    Вам понятен смысл проблемы? Если да, то суть проблемы Александром сформулирована. Я умышленно не стал акцентироваться на мелочах.

    Reply
  15. hogik

    (14)(gilv)

    Да. Суть проблемы мне понятна. :-))) Но, то что «сформулировал» Александр (в части ей формулирования) это, извините, и есть — полнейший «флуд». И если для Вас является мелочью то, что перечислено в сообщении (11), то, действительно, дальше нам с Вами «флудить» не имеет смысла.

    Reply
  16. Gilev.Vyacheslav

    да, я хочу научить коллег решать проблемы, заставить прочитать даже http://blogs.msdn.com/jimmymay/attachment/8999719.ashx врядли смогу :), там есть ответы на неточности 🙂

    Reply
  17. hogik

    (16)Придётся «флуднуть» еще раз. 🙂

    Вы называете неточностью утверждение, что «операционная система создает самый первый кластер (блок начальной загрузки MBR) размером в 63Кб»? Это не неточность, это — неправда. Система не создаёт кластер для MBR. И то, что Вы называете способом определения наличия проблемы «offset 32256 / 512 байт на сектор = 63» лишь подтверждает цитату из пункта #5 сообщения (11), а не наличие проблемы из-за первого кластера размером в 63Кб. Хотя число «63» присутствует. 😉 Утверждение, что это является особенностью NTFS — тоже неправда, т.к. при создании раздела и MBR еще не существует никакой файловой системы.

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

    Reply
  18. vasilykushnir

    А почему для сервера 2008 это не актуально? Это на предмет того — стоит ли в таком случае переходить на 2008-й.

    Reply
  19. Gilev.Vyacheslav

    (17) вы посмотрите на (18) — человеку без разницы (сектор, кластер или что-то там еще), он не вникает, он спрашивает, куда конкретно нажать 🙂

    Предложите Вашу формулировку объяснения, если она покажеться понятней и правильней, мы с Вами ее заменить вместо цитаты Гладченко, идет?

    Reply
  20. Gilev.Vyacheslav

    (19) в Windows Server 2008 и Windows Vista — там сдвиг изначально кратен 1024

    однако это верно, если вы не мигрируете или ставите рядом 2008, а делаете все начистую

    т.е. дело не в операционной системе, а в ее действиях с жестким диском

    Reply
  21. Gilev.Vyacheslav

    (19) вот тут объяснение, почему в новых версиях изменили разбивку http://support.microsoft.com/kb/923332 :

    новые HDD имеют другую геометрию диска

    Reply
  22. vasilykushnir

    (21)Эх… Если б я еще английский знал… За статью и разяснение — спасибо. Мне действительно горько фиолетово что и как там системы чудит — главное метода для исправления глюка (все ведь невозможно знать). А рейдушка мне крови попил изрядно, пока все не устаканилось…

    Reply
  23. hogik

    (19)(gilv)

    Если Вы считаете, что «человеку без разницы (сектор, кластер или что-то там еще)»(с), то для него не цитату Гладченко надо заменять, а менять подзаголовок Вашей статьи. Типа, написать не «…1С-специалисты не читают, а зря», а «…1С-специалисты не читают, и правильно делают». И если «он спрашивает, куда конкретно нажать :)»(с), то указать на кнопку «Плюс» рейтинга.

    Reply
  24. Gilev.Vyacheslav

    (23) как то странно читаем, часть сообщения цитируем, а вторую не замечаем,

    ну я не гордый, могу и повторить:

    Предложите Вашу формулировку объяснения, давайте ее поместим.

    Reply
  25. hogik

    (24)(gilv)

    На мой взгляд я ответил на Ваше предложение заменить цитату от Гладченко на мою «формулировку объяснения»©. И давайте прекратим этот разговор…

    Reply
  26. Gilev.Vyacheslav

    продолжение «железячной» темы здесь http://infostart.ru/blogs/895

    Reply
  27. leshik

    Мне честно говоря не совсем понятно почему Вячеслав не указывает ссылку на первоисточник данной информации:

    http://msmvps.com/blogs/gladchenko/archive/2008/10/18/1651317.aspx

    Reply
  28. Gilev.Vyacheslav

    (27) вот упертные — вот первоисточник Disk Partition Alignment for SQL Server (eng), и он в тексте указан,

    если нужна запись в блогах, тогда уж раньше Гладченко написала http://sqlblog.com/blogs/linchi_shea/archive/2007/02/01/performance-impact-of-disk-misalignment.aspx

    а Гладченко ее пересказал, но и авторство Гладченко сохранил, что я сделал не так?!

    Reply
  29. Gilev.Vyacheslav

    (27) надеюсь авторство моей обработки для 1С:Предприятие не будете оспаривать?

    Reply
  30. leshik

    (29) Нет конечно, Вячеслав! Я Вам очень благодарен, да думаю и не только я, за Ваши разработки и материалы Вашего сайта.

    (28) Может упертость двух людей говорит о том что они подумали одинаково по какой-то причине?

    Так вот — признаюсь честно просмотрев перед написанием (27) данный материал я для себя не отметил фразы

    «(цитата Александра Гладченко)»

    Я считаю что намного логичнее было бы привести в данном материале ссылку как на статью Гладченко (27), так и на ту что привели Вы в (28). Тогда бы ни у меня ни у (13) такой мысли не возникло.

    И хотелось бы сказать большое спасибо за то что помогаете сообществу 1С-ников получать такую информацию. Ведь мало кто просматривает блоги SQL DBA.

    Извините если я Вас обидел в (27).

    Reply
  31. Gilev.Vyacheslav

    Ок, дам ссылки

    Reply
  32. Gilev.Vyacheslav

    (30) «для себя не отметил фразы» тем не менее она была в исходном сообщении сразу

    Reply
  33. anderson

    Подскажите есть ли возможность исправить ошибку средствами другого ПО (acronis disk director или подобное загружаемое до ОС). DISKPART выдает сообщение о невозможности создания раздела

    Reply
  34. Gilev.Vyacheslav

    (33) если вы все правильно проделали, и видите, что нужна оптимизация

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

    акронисом не разбивал, но после попытки разбить просто проверьте, получился ли желаемый результат

    обратите также внимание, что некоторые новые диски впринципе не могут содержать эту проблему, так как из-за больших объемом там сразу разбивка идет по 1024

    Reply
  35. Gilev.Vyacheslav

    Подробней поговорить о данном приеме хочу предложить на моем авторском курсе http://www.gilev.ru/1c/mssql/kurs.htm

    Можно заранее задать вопросы по вашему предприятию, которые мы разберем на курсе.

    Reply
  36. echo77

    (0) За публикацию конечно плюс, но вот обработка ntfs.epf определяет нужна ли или нет оптимизация диску методом:

    Элемент.StartingOffset/512 = 63

    что не совсем правильно. Я например, встречал 0 раздел смещенный на 16384 байта

    p.s. хотя с переходом всех на Win7/2008 большинству эта проблема не актуальна

    Reply
  37. wildskiff

    Огромное спасибо за материал. Даже не подозревал о возможности существовании проблемы. У нас как раз server2003 c ms server. На выходных займемся исправлением.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *