通过vmstat的简单分析数据库操作

 vmstat一直以来就是linux/unix中进行性能监控的利器,相比top来说它的监控更加系统级,更侧重于系统整体的情况。

  今天在学习vmstat的时候,突然想看看数据库中的并行对于系统级的影响到底有多紧密,自己简单测试了一下。

  首先来看看vmstat的命令的解释。

  可能大家并不陌生,如果需要每隔2秒,生成3次报告,可以使用vmstat 2 3

  对于命令的输出解释如下:

  r代表等待cpu事件的进程数

  b代表处于不可中断休眠中的进程数,

  swpd表示使用的虚拟内存的总量,单位是M

  free代表空闲的物理内存总量,单位是M

  buffer代表用作缓冲区的内存总量

  cache代表用做高速缓存的内存总量

  si代表从磁盘交换进来的内存总量

  so代表交换到磁盘的内存总量

  bi代表从块设备收到的块数,单位是1024bytes

  bo代表发送到块设备的块数

  in代表每秒的cpu中断次数

  cs代表每秒的cpu上下文切换次数

  us代表用户执行非内核代码的cpu时间所占的百分比

  sy代表用于执行那个内核代码的cpu时间所占的百分比

  id代表处于空闲状态的cpu时间所占的百分比

  wa代表等待io的cpu时间所占的百分比


procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

0  0      0 296716 399588 904276    0    0     0    16  639 1285  0  0 100  0  0

0  0      0 296576 399588 904276    0    0    43    11  809 1484  1  1 98  0  0

0  0      0 296576 399592 904276    0    0    53    25  764 1538  0  0 99  0  0

0  0      0 296584 399592 904276    0    0     0    11  716 1502  0  0 100  0  0

0  0      0 296584 399600 904276    0    0    21    16  756 1534  0  0 100  0  0

  零零总总说了一大堆,我们举几个例子,一个是文件的拷贝,这个最直接的io操作。看看在vmstat的监控下会有什么样的数据变化。

  黄色部分代表开始运行cp命令时vmstat的变化,我们拷贝的文件是200M,可以看到空闲内存立马腾出了将近200M的内存空间,buffer空间基本没有变化,这部分空间都放入了cache,同时从设备收到的块数也是急剧增加,cpu上下文的切换次数也是从930瞬间达到了1918,然后慢慢下降,cpu的使用率也是瞬间上升,最后基本控制在20%~30%。


procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r  b    swpd   free   buff      cache   si   so    bi    bo   in   cs us sy id wa st

0  0      0 296716 399588 904276    0    0     0    16  639 1285  0  0 100  0  0

0  0      0 296576 399588 904276    0    0    43    11  809 1484  1  1 98  0  0

0  0      0 296576 399592 904276    0    0    53    25  764 1538  0  0 99  0  0

0  0      0 296584 399592 904276    0    0     0    11  716 1502  0  0 100  0  0

0  0      0 296584 399600 904276    0    0    21    16  756 1534  0  0 100  0  0

0  0      0 296584 399600 904276    0    0     0    11  930 1625  1  1 98  0  0

1  1      0  93960 399608 1104528    0    0 33427    24 1918 2094  0 23 71  7  0

1  0      0  66440 399592 1131832    0    0  7573    12 1513 1323  0 25 74  2  0

5  0      0  74988 399588 1123188    0    0  2859    33  887  594  0 24 75  1  0

11  0      0  74280 399572 1114952    0    0  1963    15  770  738  3 44 53  0  0

2  0      0  74492 399568 1125008    0    0  3776    16 1014  812  0 20 73  6  0

2  0      0  72640 399560 1126696    0    0  2411    23  975  619  1 21 78  0  0

1  0      0  70532 399556 1128936    0    0  2389    16 1018  732  0 22 77  0  0

2  0      0  75396 399532 1116288    0    0  2795    15  831  673  2 47 51  0  0

2  0      0  79576 399536 1121416    0    0  2901    20  850  688  1 24 63 12  0

0  3      0  67052 399536 1130252    0    0  1493 43708  701  644  0 29 24 47  0

1  0      0  74244 399540 1125600    0    0  1323    19  842  624  0 10 65 25  0

3  0      0  70788 399532 1127728    0    0  2539 21152  936  624  0 18 58 24  0

5  0      0  73164 399532 1120352    0    0  1109    27  458  447  4 71 17  9  0

0  0      0  76120 399532 1125684    0    0  1859    15  957 1182  0 19 80  1  0

0  0      0  76128 399532 1125688    0    0    21    19  679 1399  0  0 98  1  0  --拷贝工作完成系统的负载又逐步恢复了原值。

  对于文件的操作有了一个基本认识,来看看数据库级的操作吧。

 首先看看全表扫描的情况。

  我们对于一个170万数据的表进行查询。可以看到

  从设备收到的块数是急剧增加,效果跟文件的拷贝有些类似,但是buffer,cache基本没有变化。我想这也就是数据库级别的操作和系统级别的根本区别吧。数据库的buffer_cache应该就是起这个作用的。


SQL> select count(*)from test where object_id<>1;

COUNT(*)

----------

1732096

[ora11g@rac1 arch]$ vmstat 3

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r  b     swpd   free   buff       cache   si   so    bi    bo   in   cs us sy id wa st

1  0      0 166520 399680 1023292    0    0    17    20    6    5  1  1 98  1  0

0  0      0 175800 399680 1023292    0    0    53    11  680 1308  0  0 100  0  0

1  0      0 175800 399680 1023292    0    0 18021    24 1451 1826  2  7 66 25  0

0  0      0 175800 399680 1023292    0    0    53    53  812 1577  0  0 98  2  0

0  0      0 166256 399680 1023292    0    0     0    16  881 1614  1  1 98  0  0

1  0      0 175908 399680 1023292    0    0    21    11  866 1605  0  0 99  0  0

  接着来做一个更为消耗资源的操作,这个sql不建议在正式环境测试,因为很耗费资源

  对一个170多万的表进行低效的连接。vmstat的情况如下。运行了较长的时间,过了好一段时间都没有结束,可以看到cpu的使用率已经达到了40~50%,在开始的时候,从设备中得到的块数急剧增加,然后基本趋于一个平均值,buffer,cache基本没有变化。


SQL> select count(*)from test t1,test t2 where t1.object_id=t2.object_id;

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

0  0      0 176024 399688 1023292    0    0    43    11  655 1284  0  0 99  1  0

1  0      0 171420 399688 1023292    0    0     0    16  671 1302  1  1 98  0  0

0  0      0 176164 399688 1023292    0    0     0    11  735 1331  0  1 99  0  0

0  0      0 176164 399688 1023292    0    0    21    25  678 1291  0  0 99  0  0

1  0      0 173452 399688 1023292    0    0 15643  5256 1835 2178  6 12 76  6  0

2  0      0 163048 399688 1023292    0    0 15179  5748 2166 2271  7 12 67 14  0

1  0      0 172072 399688 1023292    0    0  5541  2432 2226 1860 32  6 59  3  0

1  0      0 169964 399688 1023292    0    0   656    24 2322 1656 46  1 50  4  0

1  0      0 169848 399688 1023292    0    0   485    11 2335 1637 48  1 50  2  0

1  0      0 159576 399692 1023288    0    0   448   115 2442 1738 49  1 48  2  0

1  0      0 169344 399692 1023292    0    0   712    11 2351 1701 47  1 50  3  0

1  0      0 169352 399696 1023288    0    0   619    24 2332 1649 48  1 49  2  0

1  0      0 169360 399696 1023292    0    0   467    11 2339 1623 47  1 50  2  0

1  0      0 159848 399700 1023288    0    0   693    16 2318 1673 48  1 48  3  0

1  0      0 169368 399700 1023292    0    0   467    11 2309 1660 47  1 50  3  0

2  0      0 169368 399700 1023292    0    0   467    28 2329 1624 48  1 50  2  0

  来看看并行的效果。最后返回的条数有近亿条,这也就是这个连接低效的原因所在,但是在vmstat得到的信息来看和普通的数据查询还是有很大的差别。

  首先是急剧消耗io,同时从内存中也取出了一块内存空间。然后io基本趋于稳定,开始急剧消耗cpu资源。可以看到cpu的使用率达到了90%以上。

A


SQL> select count(*)from test t1,test t2 where t1.object_id=t2.object_id;

COUNT(*)

----------

221708288

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

0  0      0 175048 399748 1023292    0    0     0    20  665 1274  0  0 100  0  0

0  0      0 175048 399748 1023292    0    0    21    11  657 1286  0  0 100  0  0

0  0      0 165644 399748 1023292    0    0     0    16  715 1310  1  1 98  0  0

0  0      0 175056 399748 1023292    0    0     0    11  664 1284  0  0 99  0  0

0  0      0 175056 399748 1023292    0    0    21    24  640 1289  0  0 99  0  0

0  4      0 142364 399748 1025408    0    0  5957   988 1407 1869 10  8 64 18  0

0  0      0 132092 399748 1025444    0    0 12520  4939 1903 2556 14 11 32 43  0

0  2      0 140248 399748 1025444    0    0 10477  3973 1728 2427 11  7 29 53  0

2  0      0 136776 399748 1025444    0    0  7987  4125 1536 2248 11  6 24 60  0

2  0      0 136776 399748 1025444    0    0   971    20 2427 1663 98  1  0  1  0

2  0      0 121404 399748 1025456    0    0  1160    11 2422 1730 96  3  0  1  0

2  0      0 134528 399748 1025460    0    0  1195    17 2399 1695 97  2  0  2  0

3  0      0 134520 399748 1025460    0    0  1325    19 2443 1693 96  1  0  3  0

2  0      0 134536 399748 1025460    0    0  1176    16 2405 1674 99  1  0  0  0

2  0      0 125108 399748 1025460    0    0  1139    11 2418 1647 97  2  0  1  0

2  0      0 134628 399752 1025460    0    0  1235    16 2391 1653 98  1  0  1  0

3  0      0 134644 399752 1025460    0    0  1197    21 2392 1640 97  2  0  1  0

2  0      0 134652 399756 1025460    0    0  1400    16 2433 1670 97  1  0  3  0

2  0      0 125116 399756 1025460    0    0  1008    11 2199 1564 97  2  0  1  0

  看来并行的实现还是有很多的细节,相比普通的查询来说更加复杂,而且消耗的资源更多,这个也就是在使用并行的时候需要权衡的一个原因。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-16 12:36:18

通过vmstat的简单分析数据库操作的相关文章

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

简单分析C#操作INI文件

C#语言还是比较常见的东西,这里我们主要介绍C#对INI文件操作,包括介绍对INI文件进行写操作等方面. C#对INI文件操作 对INI文件进行写操作,是通过组件button2的"Click"事件来实现的.这里有一点应该注意,当在调用 WritePrivateProfileString()对INI文件进行写操作的时候,如果此时在INI文件中存在和要写入的信息相同的段落名称和关键字,则将覆盖此INI信息.下面是button2组件的"Click"事件对应的代码清单: p

将数据库操作封装到Javabean

封装|数据|数据库 封装数据库操作,目的就是为了隐藏java.sql包内的类,在编码中去掉核心的数据库操作代码.以杜绝直接数据库操作容易带来的资源未释放问题.同时也减少了数据库操作的编码量. 但是很多网友在封装时,却喜欢返回结果集(ResultSet对象),那么这个封装就没有意义了.1. 又是直接操作核心数据库类,跟封装前几乎没什么变化.2. 结果集总是依赖于它使用的连接(Connection)对象.因此当连接对象在方法内被关闭后,你返回的ResultSet就没有用了. 如果真的要获得查询数据库

Rman操作简单分析

http://www.itpub.net/245264.html Rman操作简单分析 在我的上一篇文章中为大家演示了rman 备份恢复的一个特定例子.(参考:http://www.dbanotes.net/Oracle/Rman...lfile_howto.htm)rman 对dbms_backup.restore 的一些特定调用完梢酝üebug 分析出来.通过设置debug 模式,我们可以跟踪到大量的Log,从而为分析提供一定的说明.假定我们提交如下的命令:rman target /

使ASP.NET中的数据库操作变得简单

asp.net|数据|数据库 作者:Willmove 主页:http://www.amuhouse.com E-mail: willmove@gmail.com 声明:系作者原创作品,转载请注明出处. ASP.NET中一般都是使用SQL Server作为后台数据库.一般的ASP.NET数据库操作示例程序都是使用单独的数据访问,就是说每个页面都写连接到数据库,存取数据,关闭数据库的代码.这种方式带来了一些弊端,一个就是如果你的数据库改变了,你必须一个页面一个页面的去更改数据库连接代码. 第二个弊端

php实现的简单数据库操作Model类_php技巧

本文实例讲述了php实现的简单数据库操作Model类.分享给大家供大家参考,具体如下: 该数据库模型类可实现数据库的增删改查,简化数据库操作. 1. config.php代码: <?php define("HOSTNAME","127.0.0.1"); define("USERNAME","root"); define("PASSWORD",""); define("DA

PHP简单数据库操作类实例【支持增删改查及链式操作】_php技巧

本文实例讲述了PHP简单数据库操作类.分享给大家供大家参考,具体如下: 在进行项目开发时,数据库是必不可少的东西了.但是很多时候却又对数据库SQL语句的繁杂而感到头疼.提供一个我自己使用的数据库操作类(模型Model),供大家使用.支持增.删.改.查,支持链式操作,代码不到100行,非常小巧方便,很适合小项目的快速部署使用. /** * * @Authot: summer * * @E-mail: wenghang1228@me.com * * @Data: 2015-02-06 * * @Pr

一个简单的php mysql数据库操作类程序

数据库操作类代码  代码如下 复制代码 <?php if(!defined('AHBB_VOTE') || AHBB_VOTE !='zhu_'){  die('非法调用'); }  class mysql  {   private $conn;   function __construct($host,$user,$pwd,$database,$charset){    $this->mysql($host,$user,$pwd,$database,$charset);   }   func

简单分析SQLite4的一些设计改变_数据库其它

1.0 内容提要     SQLite4 是一个放在库中的紧凑的,自包含的,零维护的的ACID数据库引擎, 像SQLite3一样, 但具有改进的接口和文件格式.     运行时环境封装到了一个对象之中.     使用了一个很不错的键值对存储引擎:         一个独立的大型键空间 - 不是SQLite3中那种每个表单独的键空间和索引.         按字典顺序的键排序.         多个存储引擎,可在运行时互换.         默认在磁盘上的存储殷勤使用了一个日志结构的合并数据库.