Многопоточность / многоядерные операции и параллельная обработка в C для выполнения операций над MySQL? - PullRequest
1 голос
/ 10 апреля 2020

У меня есть сервер Linux с 64 ГБ оперативной памяти и процессором 2,2 ГГц (14 ядер). Каждые 4 часа некоторые данные (~ 1 ГБ) выбираются из первичной базы данных (mysql), некоторые операции выполняются с ней, а затем несколько вторичных баз данных усекаются и обновляются с этими новыми данными (около миллиона строк). В настоящее время этот процесс выполняется с помощью сценария node.js и занимает около 45 минут.

Я видел, что во время этой операции только одно ядро ​​используется до 100%, а остальные 13 ядер бездействуют.

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

Каков наилучший подход к этому в C? Какие концепции мне нужно изучить, чтобы сделать это наиболее эффективно и с безопасностью памяти?

У меня есть хороший gr asp C / Python / Javascript / Databases / Shell / Unix и 10-летний опыт работы в качестве разработчик, но только обычный материал. Веб-приложения / API / CRUD et c. Хотите немного углубиться в изучение и изучить некоторые передовые концепции.

Любые предложения приветствуются. Спасибо.

1 Ответ

0 голосов
/ 11 апреля 2020

Скорость в секунду = RPS

Предложения для вашего раздела my.cnf [mysqld]

innodb_lru_scan_depth=100  # from 1024 to conserve 90% CPU cycles used for function
read_rnd_buffer_size=128K  # from 256K to reduce handler_read_rnd_next RPS of 2,362
innodb_change_buffer_size_max=50  # from 25 (percent) for higher INSERT RPS
innodb_io_capacity=600  # from 200 for higher IO per second to your SATA drives
thread_cache_size=100  # from 8 to reduce threads_created (expensive operation)
innodb_write_io_threads=16  # from 4 to encourage multi-threading multi-processing

Вы должны найти эти изменения конфигурации, которые значительно уменьшат загрузку ЦП.

Существует гораздо больше возможностей для настройки производительности. Просмотрите мой профиль, сетевой профиль для бесплатных загружаемых служебных сценариев для повышения производительности, в частности findfragtables. sql и find-избыточных-индексов. sql и других служб анализа.

Ваш счет select_scan, равный 8 698 501 за 10 дней, указывает на то, что сканирование таблиц в среднем составило 11 RPS и может быть уменьшено с помощью соответствующих индексов. Возможно, вы захотите запустить long_query_time из 1 секунды в течение 1 минуты, когда ваш 45-минутный прогон обрабатывает, чтобы найти «медленные запросы».

...