微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mysql性能不佳

我有这个简单的表

CREATE TABLE `user_did_something` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `something_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `active` int(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Indexes for table `user_did something`
ALTER TABLE `user_did_something`
  ADD PRIMARY KEY (`id`);

当我尝试插入时

INSERT INTO user_did_something (something_id, user_id) VALUES (1,11)

执行时间约为70毫秒.

在不同的机器上测试相同的结构,执行时间约为3ms.

附加信息:

>版本10.0.28-MariaDB-0ubuntu0.16.04
>表没有行
>只有index用于主要的列id.

我不知道如何调试这个.在线阅读一些内容,重新启动一切,结果仍然相同.

我正在寻找如何调试这样的东西的指导,而无需在我的机器上重新安装MysqL服务器.

解决方法:

I am looking for a guidance on how to debug stuff like this without the need of reinstalling the MysqL server on my machine.

我会尝试回答你问题的这一部分.所以你想要了解一些流程的内幕,看看它在做什么.您不想重新编译它,重新安装它或重新启动它,并且您不希望受到它开箱即用的跟踪的限制.

这是使用DTrace的好机会!它可以让你观察你的流程正在做什么(和much more).

DTrace至少可在Solaris,Mac OS X *和FreeBSD以及I hear a port exists for Linux上使用.否则,您可以使用其他实用程序(BPF tracing got merged into Linux 4.9-rc1 recently)跟踪类似信息.

* Mac OS X用户需要explicitly permit DTrace to run,将其从系统完整性保护中排除

您可以在进入和返回函数时实时观察MysqLd:

dtrace -p $(pgrep -x MysqLd) -F -n 'pid$target:MysqLd::entry{} pid$target:MysqLd::return{}'

作为一些输出的例子…… InnoDB即使在空闲时也非常健谈:

2  -> sync_arr_wake_threads_if_sema_free    
6  -> os_event_reset                        
2    -> os_mutex_enter                      
6  <- os_event_reset                        
2    <- os_mutex_enter                      
6  -> pfs_mutex_exit_func                   
6  <- pfs_mutex_exit_func                   
2    -> os_mutex_exit                       
6  -> os_event_reset                        
2    <- os_mutex_exit                       
6  <- os_event_reset                        

您可以观看进入MysqL调度程序的查询

dtrace -p $(pgrep -x MysqLd) -F -n 'pid$target:MysqLd:*dispatch_command*:entry{printf("Query: %s\n", copyinstr(arg2));}'

样本输出

cpu FUNCTION                                 
0  -> dispatch_command(enum_server_command, THD*, char*, unsigned int) Query: SHOW VARIABLES LIKE 'pid_file'

我相信在侦听特定查询运行时发生的函数调用时,DTrace的功能也在其中.例如:你可以使MysqLd:* dispatch_command *:entry init一个线程局部变量iff查询匹配某些条件,并使pid $target:MysqLd :: entry |仅在定义该变量时返回print.相应的MysqLd:* dispatch_command *:exit或类似可以取消定义该变量.当然,如果您希望工作在单独的线程中进行,您也可以使用全局变量.

很抱歉没有写上述具体的例子;我自己的MysqL被软管,我的DTrace书在办公室.

DTraceToolkit的作者Brendan Gregg提供了许多示例脚本,可用于监视错误的进程,包括some one-liners用于监视进程是否遇到页面错误,读取和写入有多大,系统调用正在进行,等等.但是你如果你更全面地学习DTrace,可以做得比单行更好.

在这里介绍的脚本基于Ben Rockwood的文章Examining MySQL in real time using DTrace中提供的脚本.需要免费注册才能阅读.

我从Brendan Gregg的文章中了解了这个工具,并从Brendan的DTrace book中学到了更多关于DTrace的知识.如果你想看看兔子洞有多深,我强烈推荐这本书.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐