На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
  
> Настройки my.ini для работы на сервере , Какие должны быть настройки для использования всего ресурса сервера
    Добрый день.
    Подскажите пожалуйста какие должны быть настройки в my.ini для использования всего ресурса сервера.
    Конфигурация сервера: RAM 64Gb, Xeon E5-2620 v4 @2.10 GHz(два процессора), хранение данных на массиве из SSD.

    Работает ПО, которое собирает фото с со списка сетевых устройств и сохраняет в БД.
    Сразу все работало довольно быстро, сетевая нагрузка была ~250Mb/s, после того как размер БД вырос до 150Гб, скорость записи в бд сильно упала, я чуть поменял настройки в my.ini, но сетевая нагрузка не подымается выше ~50Mb/s.
    На базовых настройках mysql потреблял где-то 10-12% проца и около 300Мб памяти. После изменения мной настроек, потребление проца выросло до ~40% и памяти потребляет около 10Гб.
    Пытался менять тип сервера через конфигуратор mysql developer PC - server PC - DB PC, прироста не было вообще никакого.

    на данный момент я использую такие настройки:
    ExpandedWrap disabled
      [client]
      port=3306
       
      [mysql]
      no-beep
      [mysqld]
      port=3306
      datadir=D:/MySQL/MySQL Server 5.7/Data
      default-storage-engine=INNODB
      sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
      log-output=FILE
      general-log=0
      general_log_file="WIN-5ODEINUHIUF.log"
      slow-query-log=1
      slow_query_log_file="WIN-5ODEINUHIUF-slow.log"
      long_query_time=10
      log-error="WIN-5ODEINUHIUF.err"
      server-id=1
      secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
      max_connections=151
      table_open_cache=5000
      thread_cache_size=50
      myisam_max_sort_file_size=100G
      innodb_flush_log_at_trx_commit=2
      innodb_log_file_size=1G
      innodb_thread_concurrency=65
      innodb_autoextend_increment=64
      innodb_concurrency_tickets=5000
      innodb_old_blocks_time=1000
      innodb_stats_on_metadata=0
      innodb_file_per_table=1
      innodb_checksum_algorithm=0
      back_log=80
      flush_time=0
      join_buffer_size=256K
      max_allowed_packet=4M
      max_connect_errors=100
      open_files_limit=4161
      sort_buffer_size=256K
      table_definition_cache=1400
      binlog_row_event_max_size=8K
      sync_master_info=10000
      sync_relay_log=10000
      sync_relay_log_info=10000
      innodb_buffer_pool_size=45G
      key_buffer_size=15G
      query_cache_size=512M


    Подскажите, какие параметры можно изменить или добавить чтобы добиться максимальной производительности?
      Цитата alex.styopin @
      Подскажите, какие параметры можно изменить или добавить чтобы добиться максимальной производительности?

      Вряд ли кто-то из форумчан будет тут писать статью (ибо настроек много). А вот самостоятельно найти и проанализировать статьи по тюнингу настроек MySQl'я можно вполне самостоятельно. Как пример:

      * Оптимальная настройка Mysql
      * Настройка и оптимизация MySQL сервера
      * etc ...

      При выборе настроек желательно учитывать особенность конкретного использования, какие данные прилетают, как часто, в каком виде, какие запросы, ...
        JoeUser
        Я знаю, что настроек много, несколько таких мануалов просмотрел, но так до конца и не разобрался где именно дается разрешение на использование всех ресурсов. По-идее, когда я в конфигураторе MySql выбираю тип Mysql DataBase PC, то как там и говорится в описании, субд должна заграбастать все ресурсы, но этого почему-то не происходит.

        Написал потому, что возможно кто-то с такой задачей уже стыкался и знает пару тройку нужных ключей.

        Основная часть данных это таблица в которой хранятся jpg в формате Longblob. Программа каждую секунду опрашивает несколько десятков устройств и загружает из в бд новые jpg.

        Добавлено
        Цитата JoeUser @
        * Оптимальная настройка Mysql

        А вообще хорошая статейка и там как раз есть подбор параметров под определенный объем ОЗУ. Спасибо!
          Цитата alex.styopin @
          Основная часть данных это таблица в которой хранятся jpg в формате Longblob. Программа каждую секунду опрашивает несколько десятков устройств и загружает из в бд новые jpg.

          Можно еще глянуть эту фичу. Не настройки, но все же.
            Цитата JoeUser @
            Можно еще глянуть эту фичу. Не настройки, но все же.

            Спасибо, читну.

            Добавлено
            Цитата JoeUser @
            Оптимальная настройка Mysql


            Поменял я настройки в my.ini, как советуют тут в статье, но при роста скорости все равно это не дало. Сетевая активность 30-40 Mb/s. При чем интересно что, запросы между потоками друг друга не задерживают, я вижу, что 10 потоков одновременно делают insert, но в самом потоке очередь из insert'ов выполняется медленно, на сам Insert уходит примерно секунда, хотя изначально, когда бд была еще пустая, то на один insert с jpg'ом около 200-300 кб, уходило около 0,1 сек

            Может я делаю что-то не так?

            Сам запрос выглядит так:
            ExpandedWrap disabled
              INSERT INTO JOURNAL_CARS SET rec_date_time='" + dtPhoto->ToString("yyyy.MM.dd HH:mm:ss") +
                              "', c_number='" + CNumber +
                              "', file_name='" + FileName +
                              "', c_id='" + ID +
                              "', picture=@blob_pic, file_size=@size_pic"
              cmd->Parameters->AddWithValue("@blob_pic", rawData);
              cmd->Parameters->AddWithValue("@size_pic", dwRetLen);
              cmd->ExecuteNonQuery();
              Цитата alex.styopin @
              Поменял я настройки в my.ini

              Первое, чтобы я посмотрел, "а тот ли конфиг использует MySQL?"
              По докам смотрим тут.
                Цитата JoeUser @
                "а тот ли конфиг использует MySQL?"

                судя по всему тот, что надо. это видно по нагрузке на проц и память. кроме того на сервере только один my.ini, поиском проверял.
                  Ну сбрось свою текущую версию конфига.
                    JoeUser
                    Вот:
                    ExpandedWrap disabled
                      [client]
                       
                      # pipe=
                       
                      # socket=MYSQL
                       
                      port=3306
                       
                      [mysql]
                      no-beep=
                       
                      # default-character-set=
                       
                       
                      # SERVER SECTION
                      # ----------------------------------------------------------------------
                      #
                      # The following options will be read by the MySQL Server. Make sure that
                      # you have installed the server correctly (see above) so it reads this
                      # file.=
                      #
                      # server_type=1
                      [mysqld]
                       
                      # The next three options are mutually exclusive to SERVER_PORT below.
                      # skip-networking=
                      # enable-named-pipe=
                      # shared-memory=
                       
                      # shared-memory-base-name=MYSQL
                       
                      # The Pipe the MySQL Server will use
                      # socket=MYSQL
                       
                      # The TCP/IP Port the MySQL Server will listen on
                      port=3306
                       
                      # Path to installation directory. All paths are usually resolved relative to this.
                      # basedir="D:/MySQL/MySQL Server 5.7/"
                       
                      # Path to the database root
                      datadir=D:/MySQL/MySQL Server 5.7/Data
                       
                      # The default character set that will be used when a new schema or table is
                      # created and no character set is defined
                      # character-set-server=
                       
                      # The default storage engine that will be used when create new tables when
                      default-storage-engine=INNODB
                       
                      # Set the SQL mode to strict
                      sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
                       
                      # General and Slow logging.
                      log-output=FILE
                       
                      general-log=0
                       
                      general_log_file="WIN-5ODEINUHIUF.log"
                       
                      slow-query-log=1
                       
                      slow_query_log_file="WIN-5ODEINUHIUF-slow.log"
                       
                      long_query_time=1
                      expire_logs_days=10
                      max_binlog_size=100M
                      # Binary Logging.
                      # log-bin=
                       
                      # Error Logging.
                      log-error="WIN-5ODEINUHIUF.err"
                       
                      # Server Id.
                      server-id=1
                       
                      # Secure File Priv.
                      secure-file-priv="C:/ProgramData/MySQL/MySQL Server 5.7/Uploads"
                       
                      # The maximum amount of concurrent sessions the MySQL server will
                      # allow. One of these connections will be reserved for a user with
                      # SUPER privileges to allow the administrator to login even if the
                      # connection limit has been reached.
                      max_connections=384
                       
                      # The number of open tables for all threads. Increasing this value
                      # increases the number of file descriptors that mysqld requires.
                      # Therefore you have to make sure to set the amount of open files
                      # allowed to at least 4096 in the variable "open-files-limit" in
                      # section [mysqld_safe]
                      table_open_cache=2000
                       
                      # Maximum size for internal (in-memory) temporary tables. If a table
                      # grows larger than this value, it is automatically converted to disk
                      # based table This limitation is for a single table. There can be many
                      # of them.
                      # tmp_table_size=
                       
                      # How many threads we should keep in a cache for reuse. When a client
                      # disconnects, the client's threads are put in the cache if there aren't
                      # more than thread_cache_size threads from before.  This greatly reduces
                      # the amount of thread creations needed if you have a lot of new
                      # connections. (Normally this doesn't give a notable performance
                      # improvement if you have a good thread implementation.)
                      thread_cache_size=10
                       
                      # *** MyISAM Specific options
                      # The maximum size of the temporary file MySQL is allowed to use while
                      # recreating the index (during REPAIR, ALTER TABLE or LOAD DATA INFILE.
                      # If the file-size would be bigger than this, the index will be created
                      # through the key cache (which is slower).
                      myisam_max_sort_file_size=100G
                       
                      # If the temporary file used for fast index creation would be bigger
                      # than using the key cache by the amount specified here, then prefer the
                      # key cache method.  This is mainly used to force long character keys in
                      # large tables to use the slower key cache method to create the index.
                      # myisam_sort_buffer_size=
                       
                      # Size of the Key Buffer, used to cache index blocks for MyISAM tables.
                      # Do not set it larger than 30% of your available memory, as some memory
                      # is also required by the OS to cache rows. Even if you're not using
                      # MyISAM tables, you should still set it to 8-64M as it will also be
                      # used for internal temporary disk tables.
                      # key_buffer_size=
                       
                      # Size of the buffer used for doing full table scans of MyISAM tables.
                      # Allocated per thread, if a full scan is needed.
                      # read_buffer_size=
                       
                      # read_rnd_buffer_size=
                       
                      # *** INNODB Specific options ***
                      # innodb_data_home_dir=
                       
                      # Use this option if you have a MySQL server with InnoDB support enabled
                      # but you do not plan to use it. This will save memory and disk space
                      # and speed up some things.
                      # skip-innodb=
                       
                      # If set to 1, InnoDB will flush (fsync) the transaction logs to the
                      # disk at each commit, which offers full ACID behavior. If you are
                      # willing to compromise this safety, and you are running small
                      # transactions, you may set this to 0 or 2 to reduce disk I/O to the
                      # logs. Value 0 means that the log is only written to the log file and
                      # the log file flushed to disk approximately once per second. Value 2
                      # means the log is written to the log file at each commit, but the log
                      # file is only flushed to disk approximately once per second.
                      innodb_flush_log_at_trx_commit=2
                       
                      # The size of the buffer InnoDB uses for buffering log data. As soon as
                      # it is full, InnoDB will have to flush it to disk. As it is flushed
                      # once per second anyway, it does not make sense to have it very large
                      # (even with long transactions).
                      # innodb_log_buffer_size=
                       
                      # InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
                      # row data. The bigger you set this the less disk I/O is needed to
                      # access data in tables. On a dedicated database server you may set this
                      # parameter up to 80% of the machine physical memory size. Do not set it
                      # too large, though, because competition of the physical memory may
                      # cause paging in the operating system.  Note that on 32bit systems you
                      # might be limited to 2-3.5G of user level memory per process, so do not
                      # set it too high.
                      # innodb_buffer_pool_size=
                       
                      # Size of each log file in a log group. You should set the combined size
                      # of log files to about 25%-100% of your buffer pool size to avoid
                      # unneeded buffer pool flush activity on log file overwrite. However,
                      # note that a larger logfile size will increase the time needed for the
                      # recovery process.
                      innodb_log_file_size=48M
                       
                      # Number of threads allowed inside the InnoDB kernel. The optimal value
                      # depends highly on the application, hardware as well as the OS
                      # scheduler properties. A too high value may lead to thread thrashing.
                      innodb_thread_concurrency=65
                       
                      # The increment size (in MB) for extending the size of an auto-extend InnoDB system tablespace file when it becomes full.
                      innodb_autoextend_increment=64
                       
                      # The number of regions that the InnoDB buffer pool is divided into.
                      # For systems with buffer pools in the multi-gigabyte range, dividing the buffer pool into separate instances can improve concurrency,
                      # by reducing contention as different threads read and write to cached pages.
                      # innodb_buffer_pool_instances=
                       
                      # Determines the number of threads that can enter InnoDB concurrently.
                      innodb_concurrency_tickets=5000
                       
                      # Specifies how long in milliseconds (ms) a block inserted into the old sublist must stay there after its first access before
                      # it can be moved to the new sublist.
                      innodb_old_blocks_time=1000
                       
                      # It specifies the maximum number of .ibd files that MySQL can keep open at one time. The minimum value is 10.
                      # innodb_open_files=
                       
                      # When this variable is enabled, InnoDB updates statistics during metadata statements.
                      innodb_stats_on_metadata=0
                       
                      # When innodb_file_per_table is enabled (the default in 5.6.6 and higher), InnoDB stores the data and indexes for each newly created table
                      # in a separate .ibd file, rather than in the system tablespace.
                      innodb_file_per_table=1
                       
                      # Use the following list of values: 0 for crc32, 1 for strict_crc32, 2 for innodb, 3 for strict_innodb, 4 for none, 5 for strict_none.
                      innodb_checksum_algorithm=0
                       
                      # The number of outstanding connection requests MySQL can have.
                      # This option is useful when the main MySQL thread gets many connection requests in a very short time.
                      # It then takes some time (although very little) for the main thread to check the connection and start a new thread.
                      # The back_log value indicates how many requests can be stacked during this short time before MySQL momentarily
                      # stops answering new requests.
                      # You need to increase this only if you expect a large number of connections in a short period of time.
                      back_log=80
                       
                      # If this is set to a nonzero value, all tables are closed every flush_time seconds to free up resources and
                      # synchronize unflushed data to disk.
                      # This option is best used only on systems with minimal resources.
                      flush_time=0
                       
                      # The minimum size of the buffer that is used for plain index scans, range index scans, and joins that do not use
                      # indexes and thus perform full table scans.
                      join_buffer_size=256K
                       
                      skip-external-locking
                       
                      # The maximum size of one packet or any generated or intermediate string, or any parameter sent by the
                      # mysql_stmt_send_long_data() C API function.
                      max_allowed_packet=16M
                       
                      # If more than this many successive connection requests from a host are interrupted without a successful connection,
                      # the server blocks that host from performing further connections.
                      max_connect_errors=100
                       
                      # Changes the number of file descriptors available to mysqld.
                      # You should try increasing the value of this option if mysqld gives you the error "Too many open files".
                      open_files_limit=4161
                       
                      # If you see many sort_merge_passes per second in SHOW GLOBAL STATUS output, you can consider increasing the
                      # sort_buffer_size value to speed up ORDER BY or GROUP BY operations that cannot be improved with query optimization
                      # or improved indexing.
                      sort_buffer_size=256K
                       
                      # The number of table definitions (from .frm files) that can be stored in the definition cache.
                      # If you use a large number of tables, you can create a large table definition cache to speed up opening of tables.
                      # The table definition cache takes less space and does not use file descriptors, unlike the normal table cache.
                      # The minimum and default values are both 400.
                      table_definition_cache=1400
                       
                      # Specify the maximum size of a row-based binary log event, in bytes.
                      # Rows are grouped into events smaller than this size if possible. The value should be a multiple of 256.
                      binlog_row_event_max_size=8K
                       
                      # If the value of this variable is greater than 0, a replication slave synchronizes its master.info file to disk.
                      # (using fdatasync()) after every sync_master_info events.
                      sync_master_info=10000
                       
                      # If the value of this variable is greater than 0, the MySQL server synchronizes its relay log to disk.
                      # (using fdatasync()) after every sync_relay_log writes to the relay log.
                      sync_relay_log=10000
                       
                      # If the value of this variable is greater than 0, a replication slave synchronizes its relay-log.info file to disk.
                      # (using fdatasync()) after every sync_relay_log_info transactions.
                      sync_relay_log_info=10000
                       
                      # Load mysql plugins at start."plugin_x ; plugin_y".
                      # plugin_load=
                       
                      # MySQL server's plugin configuration.
                      # loose_mysqlx_port=33060
                      innodb_buffer_pool_size=32768M
                      key_buffer_size=16M
                      query_cache_size=0
                      [mysqldump]
                      quick
                      quote-names
                      max_allowed_packet=16M


                    Добавлено
                    JoeUser
                    еще попробовал увеличить:
                    max_allowed_packet до 1G
                    innodb_log_file_size до 256M

                    эффекта нет

                    Добавлено
                    Буду сейчас пробовать создавать отдельную таблицу данных для каждого отдельного устройства. Возможно так скорость записи данных ускорится.
                    Сообщение отредактировано: alex.styopin -
                      Цитата alex.styopin @
                      Буду сейчас пробовать создавать отдельную таблицу данных для каждого отдельного устройства. Возможно так скорость записи данных ускорится.

                      Как вариант - попробуй сами картинки писать в отдельные файлы (вне DB), а в DB - только "служебную" информацию о них. Вероятно работа с большими файлами тупо напрягает файловую систему. Как предположение.

                      Добавлено
                      И еще ... напиши DDL таблицы.
                        JoeUser
                        Сейчас разбил на отдельные таблицы. Скорость возросла в разы. Сейчас сетевая нагрузка 500-600 Мб/с.
                        Хранить картинки отдельно, не в бд, не вариант, так как к ним нужен доступ клиентам. Так получить картинку можно простым select, в противном случае для передачи надо еще какой-то софт.

                        Таблица:
                        ExpandedWrap disabled
                          CREATE TABLE IF NOT EXISTS db_name.table_name(
                            rec_number INT (11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Порядковый номер записи',
                            rec_date_time DATETIME NOT NULL COMMENT 'Дата и время события',
                            car_number CHAR (20) DEFAULT NULL COMMENT 'ГОС номер авто',
                            dvr_file_name CHAR (255) DEFAULT NULL COMMENT 'Имя файла на камере',
                            picture LONGBLOB DEFAULT NULL COMMENT 'Фото события',
                            file_size INT (11) UNSIGNED NOT NULL COMMENT 'Размер файла изображения',
                            PRIMARY KEY (rec_number),
                            UNIQUE INDEX rec_number USING BTREE (rec_number)
                          )
                          ENGINE = INNODB
                          AUTO_INCREMENT = 1
                          CHARACTER SET cp1251
                          COLLATE cp1251_ukrainian_ci
                          ROW_FORMAT = DYNAMIC;
                          DDL норм.
                          Цитата alex.styopin @
                          массиве из SSD

                          Если SSD объединены в RAID(любой) - рекомендую безотлагательно нагуглить статей и почитать. Ибо это очень нехорошее решение!
                            JoeUser
                            SSDшки в корзине, слеплены в 5й рейд.
                            Дело не в этом. Походу дело было в том, что большое количество потоков инсертило в одну таблицу. Когда я побил таблицу на отдельные, каждый поток инсертит в свою таблицу, то проблем со скоростью вообще не возникает. При этом нагрузка на проц сервисом мускула упала с 40% до 5-10%

                            Но и та статья помогла с настройкой сервиса, так что за это отдельное спасибо 8-)
                            Сообщение отредактировано: alex.styopin -
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0430 ]   [ 15 queries used ]   [ Generated: 28.03.24, 17:48 GMT ]