大量插入的InnoDB表不会使用我所有的CPU


8

我有一个数据包日志数据库,几乎从未查询过。它只需要在插入时快速。我之所以使用InnoDB,是因为我想保持ACID合规性,因为即使丢失单个数据包也可能损害我们的客户。在性能调整方案中,我通过多个数据库连接将1,000,000个数据包发送到服务器。但是,无论我在my.cnf中使用什么设置,我都无法使mysqld进程在具有12个核心的系统上使用超过900%的CPU。(盒子上没有其他东西。)

我设置了以下内容

  • innodb_file_per_table = 1
  • innodb_write_io_threads = 64
  • innodb_read_io_threads = 64
  • innodb_thread_concurrency = 0

如果使用MyISAM,则可以在大约6秒钟内获得所有写入的数据包。但是InnoDB大约需要25。我可以让MySQL使用其余的系统资源并更快地插入吗?

编辑:这是表的架构:

+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t     | bigint(20) unsigned  | YES  |     | NULL    |       |
| a     | char(1)              | YES  |     | NULL    |       |
| sa    | int(10) unsigned     | YES  |     | NULL    |       |
| sb    | int(10) unsigned     | YES  |     | NULL    |       |
| sc    | int(10) unsigned     | YES  |     | NULL    |       |
| sd    | int(10) unsigned     | YES  |     | NULL    |       |
| sp    | smallint(5) unsigned | YES  |     | NULL    |       |
| da    | int(10) unsigned     | YES  |     | NULL    |       |
| db    | int(10) unsigned     | YES  |     | NULL    |       |
| dc    | int(10) unsigned     | YES  |     | NULL    |       |
| dd    | int(10) unsigned     | YES  |     | NULL    |       |
| dp    | smallint(5) unsigned | YES  |     | NULL    |       |
+-------+----------------------+------+-----+---------+-------+

edit2:我已经将更多的插入批量处理,以便单个查询接近最大长度(大约16,000,000个字符)。现在,数据库会在两秒钟内飙升至1100%,然后在其余时间内降至100%。现在总时间为21秒,比开始时快16%。

Answers:


7

您还必须提高innodb_io_capacity

默认值为200。对于初学者,将其提高到5000。我要去20000。

您可能还需要确保ib_logfile0并且ib_logfile1足够大。innodb_log_file_size的默认值为5M。对于初学者,我会将其提高到1G。

更大的InnoDB缓冲池也可能会有所帮助,也许是4G。

回顾一下,请使用以下其他设置:

[mysqld]
innodb_io_capacity=5000
innodb_buffer_pool_size=4G
innodb_log_file_size=1G

将这些设置添加到my.cnf之后,要调整ib_logfile0 / ib_logfile1的大小,请执行以下操作

service mysql stop
rm -f /var/log/mysql/ib_logfile[01]
service mysql start

重新创建文件ib_logfile0和ib_logfile1。别担心,我已经做了很多次了

您可能需要为InnoDB做一些与众不同的事情

请尝试以下操作:

  • InnoDB表上的全表锁定
  • 执行批量加载
  • 释放锁

拥有多个缓冲池是否有帮助?还是因为它只是一张桌子,这有关系吗?
2012年

只有一个缓冲池。这样就没有虚拟限制。我有一个使用单个162GB缓冲池的MySQL 5.5.9客户端,它运行得很好。
RolandoMySQLDBA 2012年

使用它,我获得了大约950%的CPU,但似乎没有更快的速度。
2012年

在批量加载之前,尝试对InnoDB表进行全表锁定。
RolandoMySQLDBA 2012年

3

有许多因素影响最大程度地利用多个内核的能力。

  • 一些互斥锁将影响多个CPU,从而使一些CPU等待处理。
  • 您需要与CPU一样多的活动线程。如果您的工作负载导致9个并行线程,则您无法填充12个核心。
  • I / O容量必须足以为所有CPU提供足够的工作量。如果要在磁盘I / O上排队或等待网络消息,则将无法填充CPU。

SAR等工具可让您确定是否存在任何瓶颈在减少您的容量。只是被警告,消除一个瓶颈,只会消除瓶颈。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.