深入剖析:Linux下的DTrace技术 (linux dtrace)

随着互联网的快速发展,Linux系统在服务器领域的地位愈加显著。然而,Linux操作系统在性能监测和故障排除方面的问题依然难以避免。为了解决这些问题,开发人员不断寻找更高效的监测工具。DTrace技术就是其中一种解决方案,它在Solaris系统上面得到了广泛的应用,后来也被引入到出的操作系统如FreeBSD等中。本文将深入剖析DTrace技术在Linux系统中的应用。

一、DTrace技术

DTrace是一款高效的监测工具,最初由Sun Microsystems公司在Solaris系统上开发。它可以帮助开发人员深入分析系统的运行状态。DTrace技术通过直接观察系统的应用程序,并提供更加详尽的分析信息。同时,它支持分类对应用程序进行全面监控,这使得开发人员可以更加细致地进行调试工作。

Linux操作系统中更大的好处之一就是它的开源性质,它可以轻松地进行模块化开发。因此,遵循着这一理念,开发者使用Linux系统中的DTrace技术,也需要在内核中插入几个内核模块实现;以实现对内核的监控,并在运行时对内核进行修改,以满足对故障的定位和诊断。

二、DTrace技术在Linux中的配置和使用

DTrace技术在Linux中的使用也是非常便捷的。我们需要检查DTrace是否已安装。在大多数Linux发行版中,DTrace都是默认的。如果没有,我们需要自行下载安装。

1.安装DTrace

在Ubuntu系统上,可以使用下面的命令安装DTrace:

“`

sudo apt-get install dtrace-utils

“`

在CentOS上,要使用EPEL仓库启用DTrace,命令如下:

“`

sudo yum install kernel-devel systemtap-sdt-devel kernel-debuginfo kernel-debuginfo-common

sudo yum install systemtap #安装systemtap,使用其dtrace工具进行DTrace的工作

“`

以上命令将下载并安装所需的内核模块和DTrace工具,下载过程可能需要较长时间,具体取决于您的服务器速度。

2.使用DTrace工具

安装完成后,我们就可以开始使用DTrace工具了。在Linux中,DTrace一般是使用Systemtap工具运行。

我们需要通过以下命令来确保可用的DTrace工具:

“`

whereis dtrace

“`

然后,我们就可以运行DTrace工具来检查我们的系统。随意选择一个需要检查的系统进程,对其运行如下DTrace命令:

“`

sudo stap -v —dtrace “syscall::read:return {printf(“%s,%d\n”,execname(),arg0);}”

“`

然后,我们可以在Shell中看到输出结果了。以上命令将输出针对所有进程做的系统调用读量,并打印出相关信息。

三、DTrace技术的优点和局限性

DTrace技术具有以下几个重要的优点:

1.高效性:DTrace技术十分高效,因此能够在长时间的操作中提供不间断的监控和数据分析。

2.领先的诊断和问题排除能力:许多问题可以通过DTrace技术进行定位和处理,有助于改善服务质量和可用性。

3.可扩展性:DTrace技术能够扩展到多个操作系统,因此开发人员可以在多个平台下进行更加统一的监测解决方案的设计。

虽然DTrace技术确实具有强大的功能和易于使用的优点,但它也存在着一定的局限性。以下是DTrace技术的一些不足之处:

1.应用程序需特有的库:由于这是一种新技术,因此大多数操作系统都需要一些特有的库。

2.可能会导致性能问题:如果DTrace技术被广泛使用,它可能会导致一定数量的性能问题。

四、

尽管DTrace技术在Linux系统中仍然存在一些问题,但它的出现仍然对开发人员的故障排除和性能监测领域产生了深远的影响。通过提供更加便捷的分析工具,DTrace技术有助于开发人员更高效地定位问题、改善问题,提升服务质量。

相关问题拓展阅读:

几个常用的MySQL性能测试工具

1、mysqlslap

安装:简单,装了mysql就有了

作用:模拟并发测试数据做贺梁库性能。

优点:简单,容易使用。

不足:不能指定生成的数据规模,测试过程不清楚针对十万级还是百万级数据做的测试,感觉不太适合做综合测试,比较适合针对既有数据库,对单个sql进行优化的测试。

使用方法:

可以使用mysqlslap –help来显示使用方法:

Default options are read from the following files in the given order:

/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

–concurrency代表并发数量,多个可以用逗号隔开,concurrency=10,50,100, 并发连接线程数分别是10、50、100个并发。

–engines代表要测试的引擎,可以有多个,用分隔符隔开。

–iterations代表要运行这些测试多少次。

–auto-generate-sql 代表用系统自己生成的SQL脚本来测试。

–auto-generate-sql-load-type 代表要测试的是读还是写还是两者混合的(read,write,update,mixed)

–number-of-queries 代表总共要运行多少次查询拍伍。每个客户运行的查询数量可以用查询总数/并发数来计算。

–debug-info 代表要额外输出CPU以及内存的相关信息。

–number-int-cols :创建测试表的 int 型字段数量

–auto-generate-sql-add-autoincrement : 代表对生成的表自动添加auto_increment列,从5.1.18版本开始

–number-char-cols 创建测试表的 char 型字段数量。

–create-schema 测试的schema,MySQL中schema也就是database。

–query 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。

–only-print 如果纯运只想打印看看SQL语句是什么,可以用这个选项。

mysqlslap -umysql -p123 –concurrency=100 –iterations=1 –auto-generate-sql –auto-generate-sql-add-autoincrement –auto-generate-sql-load-type=mixed –engine=myisam –number-of-queries=10 –debug-info

或:

指定数据库和sql语句:

mysqlslap -h192.168.3.18 -Pconcurrency=100 –iterations=1 –create-schema=’test’ –query=’select * from test;’ –number-of-queries=10 –debug-info -umysql -p123

要是看到底做了什么可以加上:–only-print

Benchmark

Average number of seconds to run all queries: 25.225 seconds

Minimum number of seconds to run all queries: 25.225 seconds

Maximum number of seconds to run all queries: 25.225 seconds

Number of clients running queries: 100

Average number of queries per client: 0

以上表明100个客户端同时运行要25秒

2、syench

安装:

可以从

下载

tar zxf syench-0.4.12.tar.gz

cd syench-0.4.12

./autogen.sh

./configure && make && make install

strip /usr/local/bin/syench

安装时候可能会报错,后来baidu发现个好文

怕以后找不到,也贴过来吧

1.如果mysql不是默认路径安装,那么需要通过指定–with-mysql-includes和–with-mysql-libs参数来加载mysql安装路径

2.如果报错:

../libtool: line 838: X–tag=CC: command not found

../libtool: line 871: libtool: ignoring unknown tag : command not found

../libtool: line 838: X–mode=link: command not found

../libtool: line 1004:Warning: inferring the mode of operation is deprecated.: command not found

../libtool: line 1005:Future versions of Libtool will require –mode=MODE be specified.: command not found

../libtool: line 2231: X-g: command not found

../libtool: line 2231: X-O2: command not found

那么执行下根目录的:autogen.sh文件,然后重新configure && make && make install

3.如果报错:

syench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory

那么执行下:

n -s /usr/local/mysql5.5/mysql/lib/libmysqlclient.so.18 /usr/lib64/

4.如果执行autogen.sh时,报如下错误:

./autogen.sh: line 3: aclocal: command not found

那么需要安装一个软件:

yum install automake

然后需要增加一个参数:查找: AC_PROG_LIOOL 将其注释,然后增加AC_PROG_RANLIB

作用:模拟并发,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL

优点:可以指定测试数据的规模,可以单独测试读、写的性能,也可以测试读写混合的性能。

不足:测试的时候,由于网络原因,测试的非常慢,但是最终给的结果却很好,并发支持很高,所以给我的感觉是并不太准确。当然也可能我没搞明白原理

使用方法:

准备数据

syench –test=oltp –mysql-table-engine=myisam –oltp-table-size=mysql-db=dbtest2 –mysql-user=root –mysql-host=192.168.1.101 –mysql-password=pwd prepare

执行测试

syench –num-threads=100 –max-requests=test=oltp –mysql-table-engine=innodb –oltp-table-size=mysql-db=dbtest1 –mysql-user=root –mysql-host=192.168.1.101 –mysql-password=pwd run

syench 0.4.12: multi-threaded system evaluation benchmark

No DB drivers specified, using mysql

Running the test with following options:

Number of threads: 100

Doing OLTP test.

Running mixed OLTP test

Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)

Using “BEGIN” for starting transactions

Using auto_inc on the id column

Maximum number of requests for OLTP test is limited to 4000

Threads started!

Done.

OLTP test statistics:

queries performed:

read: 56014

write: 20235

other: 8002

total: 84021

transactions: 4001 (259.14 per sec.)

deadlocks: 0 (0.00 per sec.)

read/write requests:(4923.75 per sec.)

other operations: 8002 (518.29 per sec.)

Test execution summary:

total time: 15.4393s

total number of events: 4001

total time taken by event execution: 1504.7744

per-request statistics:

min: 33.45ms

avg: 376.10ms

max: 861.53ms

approx. 95 percentile: 505.65ms

Threads fairness:

events (avg/stddev): 40.0100/0.67

execution time (avg/stddev): 15.0477/0.22

3、tpcc-mysql

安装:

如果从原网站上下载源码比较麻烦,需要工具、注册、生成证书等。这里提供一个下载包

export C_INCLUDE_PATH=/usr/include/mysql

export PATH=/usr/bin:$PATH

export LD_LIBRARY_PATH=/usr/lib/mysql

cd /tmp/tpcc/src

make

然后就会在 /tmp/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start

作用:测试mysql数据库的整体性能

优点:符合tpcc标准,有标准的方法,模拟真实的交易活动,结果比较可靠。

不足:不能单独测试读或者写的性能,对于一些以查询为主或者只写的应用,就没有这么大的意义了。

使用方法:

加载数据

创建库

mysql>create database tpcc10;

创建表:

shell>mysql tpcc10 mysql tpcc10 ./tpcc_load 192.168.11.172 tpcc10 root pwd 300

|主机||数据库||用户||密码||warehouse|

2、并发加载:(推荐,但需要修改一下)

shell>./load.sh tpcc

|数据库||warehouse|

3、测试

./tpcc_start -h192.168.11.172 -d tpcc -u root -p ‘pwd’ -w 10 -c 10 -r 10 -l 60 -i 10 -f /mnt/hgfs/mysql/tpcc100_.txt

***************************************

*** ###easy### TPC-C Load Generator ***

***************************************

option h with value ‘192.168.11.172’

option d with value ‘tpcc’

option u with value ‘root’

option p with value ‘pwd’

option w with value ‘1’

option c with value ‘100’

option r with value ‘120’

option l with value ’60’

option i with value ’10’

option f with value ‘/mnt/hgfs/mysql/tpcc100_.txt’

: 192.168.11.172

: 3306

: tpcc

: root

: pwd

: 1

: 100

: 120 (sec.)

: 60 (sec.)

RAMP-UP TIME.(120 sec.)

MEASURING START.

使用 bcc 工具观测 MySQL:1)dbstat功能:将 MySQL/PostgreSQL 的查询延迟汇总为直方图

语法:

dbstat >> {mysql,postgres}

选项:

{mysql,postgres}# 观测哪种数据库-h, –help     # 显示帮助然后退出-v, –verbose  # 显示BPF程序-p >, –pid >  # 要观测的进程号,空格分隔-m THRESHOLD, –threshold THRESHOLD# 只统计查询延迟比此阈值高的-u, –microseconds# 以微秒为时间单位来配棚显示延迟(默认单位:毫秒)-i INTERVAL, –interval INTERVAL# 打印摘要的时间间隔(单位:秒)

示例:

# 使用 syench 在被观测数据库上执行 select# dbstat mysql -p `pidof mysqld` -uTracing database queries for pids 3350 slower than 0 ms…^C     query latency (us) 

2)dbslower

功能:跟踪 MySQL/PostgreSQL 的查询时间高于阈值

语法:

dbslower >>  培弊则 {mysql,postgres}

参数:

{mysql,postgres}# 观测哪种数据库 -h, –help     # 显示帮助然后退出 -v, –verbose  # 显示BPF程序 -p >, –pid >  # 要观测的进程号,空格分隔 -m THRESHOLD, –threshold THRESHOLD# 只统计查询延迟比此阈值卜弊高的 -x PATH, –exe PATH# 数据库二进制文件的位置

示例:

# 使用syench在被观测数据库上执行update_index # dbslower mysql -p `pidof mysqld` -m 2 Tracing database queries for pids 3350 slower than 2 ms… TIME(s)PIDMS QUERY 1..996 UPDATE test1 SET k=k+1 WHERE id=963 3..069 UPDATE test1 SET k=k+1 WHERE id=628 5..171 UPDATE test1 SET k=k+1 WHERE id=325 7..853 UPDATE test1 SET k=k+1 WHERE id=595

5. 使用限制

bcc 基于 eBPF 开发(需要 Linux 3.15 及更高版本)。bcc 使用的大部分内容都需要 Linux 4.1 及更高版本。

如何检查MySQL数据库的主从延时?

mysql数据手雀库性能诊断与调优,本文介绍了塌闹如何使用seconds_behind_master和mk-heartbeat

检查mysql数据库主从延时的问题,我们要保证复制的整体结构毕衫早是否正

MySQL数据库主从延时如何去判断呢?本文我们介绍了两种判断方法:1. Seconds_Behind_Master vs 2. mk-heartbeat,接下来我们就分别介绍这些内容。 日常工作中,对于MySQL主从复制检查,一方面我们要保证复制的整体结构是否正常,另一方面需要检查主从数据是否保持一致。对于前者我们可以通过监控复制线程是否工作正常以及主从延时是否在容忍范围内,对于后者则可以通过分别校验主从表中数据的md5码是否一致,来保证数据一致,可以使用Maatkit工具包中的mk-table- checksum工具去检查。 方法1: 通过监控show slave status\G命令输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。其值有这么几种: NULL — 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes。 0 — 该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为lag不存在。 正值— 表示主从已经出现延时,数字越大表示从库落后主库越多。 负值— 几乎很少见,我只是听一运缓些资深的DBA说见过,其实,这是一个BUG值,该参数是不支持负值的,也就是不应该出现。 show slave status\G,该命令的输出结果非常丰厚,给我们的监控提供了很多有意义的参数,比如旁烂模:Slave_IO_Running该参数可作为 io_thread的监控项,Yes表示io_thread的和主库连接正常并能实施复制工作,No则说明与主库通讯异常,多数情况是由主从间网络引起的问题;Slave_SQL_Running该参数代表sql_thread是否正常,具体就是语句是否执行通过,常会遇到主键重复或是某个表不存在。下面就说到今天的重点Seconds_Behind_Master,该值作为判断主从延时的指标,那么它又是怎么得到这个历卜值的呢,同时,它为什么又受到很多人的质疑? Seconds_Behind_Master是通过比较sql_thread执行的event的timestamp和 io_thread复制好的event的timestamp(简写为ts)进行比较,而得到的这么一个差值。我们都知道的relay-log和主库的 bin-log里面的内容完全一样,在记录sql语句的同时会被记录上当时的ts,所以比较参考的值来自于binlog,其实主从没有必要与NTP进行同步,也就是说无需保证主从时钟的一致。 你也会发现,其实比较真正是发生在io_thread与sql_thread之间,而io_thread才真正与主库有关联,于是,问题就出来了,当主库I/O负载很大或是网络阻塞,io_thread不能及时复制binlog(没有中断,也在复制),而 sql_thread一直都能跟上io_thread的脚本,这时Seconds_Behind_Master的值是0,也就是我们认为的无延时,但是,实际上不是,你懂得。这也就是为什么大家要批判用这个参数来监控数据库是否发生延时不准的原因,但是这个值并不是总是不准,如果当io_thread与 master网络很好的情况下,那么该值也是很有价值的。 之前,提到Seconds_Behind_Master这个参数会有负值出现,我们已经知道该值是io_thread的最近跟新的ts与sql_thread执行到的ts差值,前者始终是大于后者的,唯一的肯能就是某个event的ts发生了错误,比之前的小了,那么当这种情况发生时,负值出现就成为可能。 方法2: mk-heartbeat,Maatkit万能工具包中的一个工具,被认为可以准确判断复制延时的方法。 mk-heartbeat的实现也是借助timestmp的比较实现的,它首先需要保证主从服务器必须要保持一致,通过与相同的一个NTP server同步时钟。它需要在主库上创建一个heartbeat的表,里面至少有id与ts两个字段,id为server_id,ts就是当前的时间戳 now(),该结构也会被复制到从库上。 表建好以后,会在主库上以后台进程的模式去执行一行更新操作的命令,定期去向表中的插入数据,这个周期默认为1 秒,同时从库也会在后台执行一个监控命令,与主库保持一致的周期去比较,复制过来记录的ts值与主库上的同一条ts值,差值为0表示无延时,差值越大表示延时的秒数越多。 我们都知道复制是异步的ts不肯完全一致,所以该工具允许半秒的差距,在这之内的差异都可忽略认为无延时。这个工具就是通过实打实的复制,巧妙的借用timestamp来检查延时,非常好用! 关于检查MySQL数据库的主从延时的两种方法就介绍到这里了,希望本次的介绍能够对您有所收获!

  可以通过监控show slave status\G命令输出的Seconds_Behind_Master参数的值来判断,是否有发生主从延时。

  其值有这兆亏亩空掘么几种:

  NULL – 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes.

  0 – 该值为零,是我们极为渴望看到的情况,表示主从复制良好,可以认为lag不存在。

  正值 – 表示主从已经出现延时,数字越大表示从库落后主库越多。

  负值 – 几乎很少见,只是听一些资深的DBA说见过,其实,这是一个族森BUG值,该参数是不支持负值的,也就是不应该出现。

使用 bcc 工具观测 MySQL:1)dbstat功能:将 MySQL/PostgreSQL 的查询延迟汇总为直方图

语法:

dbstat >> {mysql,postgres}

选项:

{mysql,postgres}# 观测哪种数据库-h, –help     # 显示帮助然后退出-v, –verbose  # 显示BPF程序-p >, –pid >  # 要观测的进程号,空格分隔-m THRESHOLD, –threshold THRESHOLD# 只统计查询延迟比此阈值高的-u, –microseconds# 以微秒为时间单位来显示延迟(默认单位:毫秒)-i INTERVAL, –interval INTERVAL# 打印摘要的时间间隔(单位:秒)

示例:

# 使用 syench 在被观测数培弊则据库上执行 select# dbstat mysql -p `pidof mysqld` -uTracing database queries for pids 3350 slower than 0 ms…^C     query latency (us) 

2)dbslower

功能:跟踪 MySQL/PostgreSQL 的查询配棚时间高于阈值

语法:

dbslower >>   {mysql,postgres}

参数:

{mysql,postgres}# 观测哪种数据库 -h, –help     # 显示帮助然后退出 -v, –verbose  # 显示BPF程序 -p >, –pid >  # 要观测的进程号,空格分隔 -m THRESHOLD, –threshold THRESHOLD# 只统计查询延迟比此阈值高的 -x PATH, –exe PATH卜弊  # 数据库二进制文件的位置

示例:

# 使用syench在被观测数据库上执行update_index # dbslower mysql -p `pidof mysqld` -m 2 Tracing database queries for pids 3350 slower than 2 ms… TIME(s)PIDMS QUERY 1..996 UPDATE test1 SET k=k+1 WHERE id=963 3..069 UPDATE test1 SET k=k+1 WHERE id=628 5..171 UPDATE test1 SET k=k+1 WHERE id=325 7..853 UPDATE test1 SET k=k+1 WHERE id=5955. 使用限制

bcc 基于 eBPF 开发(需要 Linux 3.15 及更高版本)。bcc 使用的大部分内容都需要 Linux 4.1 及更高版本。

linux dtrace的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux dtrace,深入剖析:Linux下的DTrace技术,几个常用的MySQL性能测试工具,如何检查MySQL数据库的主从延时?的信息别忘了在本站进行查找喔。


数据运维技术 » 深入剖析:Linux下的DTrace技术 (linux dtrace)