четверг, 25 февраля 2016 г.

Запуск только одной задачи на celery в один момент времени

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

https://gist.github.com/WorldException/9ce045f61627e6fa8d59

четверг, 18 февраля 2016 г.

mysql и много insert-ов с помощью sqlalchemy, ускоряемся.

Как то потребовалось мне сделать генерацию пары десятков прайсов, да хранить их всех в одной таблице. А прайсы были большие по паре сотен тысяч записей в каждом. Да и обновлять их надо минимум раз в час.
Попытки вставки в цикле обычным insert привело к тому что 10 тыс. записей вставлялось примерно минут 15.
В общем правильный путь вставки за несколько секунд полного прайса оказался следующим.

sqlalchemy:

  1. class Price(base):
  2.     __tablename__ = 'prices'
  3.     ....
  4. s = session()
  5. buffer = []
  6. for item in items:
  7.    ...
  8.    buffer.append({'name':.., 'price':...})
  9. s.bulk_insert_mappings(Price, buffer)
  10. s.commit()

Так подсказывают делать все примеры и это правильно. Должен по идее выполниться pymysql.cursor.executemany(). Но как оказалось в последней версии pymysql есть ошибка, executemany не распознает конструкцию INSERT ... VALUES (%(name)s, %(price)s) и делает в цикле запрос на каждую запись, т.е. получаем те же тормоза.
После небольшого патча pymysql все встает на свои места.
Готовую версию можно взять так
  1. #!/bin/bash
  2. git clone https://github.com/WorldException/PyMySQL.git
  3. pip uninstall pymysql
  4. cd PyMySQL
  5. python setup.py install


Патч выглядит так
pymysql/cursor.py

-RE_INSERT_VALUES = re.compile(r"""(INSERT\s.+\sVALUES\s+)(\(\s*%s\s*(?:,\s*%s\s*)*\))(\s*(?:ON DUPLICATE.*)?)\Z""",
+RE_INSERT_VALUES = re.compile(r"""(INSERT\s.+\sVALUES\s+)(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))(\s*(?:ON DUPLICATE.*)?)\Z""",
ВНИМАНИЕ!
Мой патч приняли в основную ветку PyMySQL начиная с версии 0.7.2, так что вам достаточно обновиться!

Еще важный момент настройки MySQL который позволил мне избежать постоянных deadlock при параллельной вставке и ускорить вставку на порядок. Это разбивка таблицы на партиции по ключу, в моем случае это было имя прайса. Выглядит это примерно так: 

PARTITION BY KEY (unikey) PARTITIONS 100

А так же 

DELAY_KEY_WRITE=1

вторник, 25 марта 2014 г.

Отображение русских букв в TIpHtmlPanel freepascal

Требуется заменить одну строку в исходниках что бы заработало нормальное отображение кирилицы в компоненте.
И мой вам совет, используйте CodeTyphon от pilotlogic. Это очень удобная сборка freepascal со всеми немыслимыми компонентами.

 IpHtml.pas
procedure TIpHtml.Parse;
{$IFDEF IP_LAZARUS}
var
  ch1,ch2,ch3: AnsiChar;
{$ENDIF}
begin
  Getmem(TokenStringBuf, 65536);                                       {!!.01}
  try                                                                  {!!.01}
    CharSP := 0;
    ListLevel := 0;
    StartPos := CharStream.Position;
    {$IFDEF IP_LAZARUS}
    FDocCharset := 'UTF-8';//'ISO-8859-1';   

вторник, 19 ноября 2013 г.

производительность xen и hyper-v для windows 2003 и 1C 7.7

Тестовые виртуалки Win2003 x64 ent + sql 2005 x64 std + 1cv7.7 sql
Тестировал на максимальную производительность с 1С 7-кой
Результаты проведения одного месяца

Citrix XEN 6.2
Две виртуалки: терминалка и SQL - 2:40 ч
Одна виртуалка SQL + 1C        - 2:30
Оптимизация путем закрепления физических ядер за Dom0 и за каждым VCPU - 2:10 ч

HYPER-V 2012
Одна виртуалка SQL + 1C       - 2:30 ч

Без использования виртуализации - 50 мин


суббота, 2 ноября 2013 г.

Разгон core quad 9300

Зря я раньше относился к вопросу разгона компа с недоверием. Эффект очень положительный
Разогнал core quad 9300 2.5 GHz до 3 GHz и заодно поставил работать память в её максимальной частоте 800 МГц. Ну и на десерт собрал из 4 дисков рэйд 10 на встроенном в материнку рэйд контролере. при тестировании на скорость запись чтение он показа примерно 100МБ/с. Отзывчивость системы улучшилась в разы. Впринципе можно нормально жить без SSD

четверг, 31 октября 2013 г.

Производительность XEN в примере 1С 7.7

В кратце.
Установлен Citrix XEN 6.2. Интересовала скорость проведения месяца.
1. Без виртуализации - 1 час
2. Без виртуализации на сервере только MSSQL, клиентская часть на компе в сети - 2 ч.
3. Xen с настройками по умолчанию - 2:30 ч
4. Xen  с закрепленными ядрами за Dom0 и каждой виртуалкой - 2 ч

Интересно сколько выжмет VMWare и Hyper 2012...
Интересная особенность проброса Hasp key для 1С под Xen.
Пробовал пробросить ключи на двух серверах
  HP DL380 G7
и
 Manufacturer: Intel Corporation
        Product Name: S2600GZ
        Version: G11481-352
        Serial Number: QSGR21500392
Сервер первый HP.
Несмотря на множество показанных USB контролеров, пробрасывается только все целиком. Т.е. можно пробросить только один ключ в одну виртуалку со всеми остальными портами и при этом ключ начинает работать только если его подключить через ВНЕШНИЙ УСБ ХАБ!!.

Сервер второй Intel
lspci показал всего два контролера УСБ и в итоге они успешно были проброшены в разные виртуалки и работают без всяких извращений и хабов. На серваке удалось так завести два ключа. Один серверный и пользовательский.