Tip: 订阅AnySQL | AUL许可证 | 软件下载 | DBA Tools | Sybase恢复 | Oracle SOS

估低了P590的CPU利用率

    在oramon程序的AIX版本中, 增加了CPU利用率的显示, 以便更好地观察数据库服务器的运行情况, 如下所示:

www.alipay.com  Load SY/WT/US  Rq
07/16-08:45:51  1.64  8/21/15  18
07/16-08:46:01  1.78  5/20/12  20
07/16-08:46:11  1.90  7/22/16  23
07/16-08:46:21  1.91  6/21/13  23
07/16-08:46:31  1.92  5/22/12  14
07/16-08:46:41  1.78  4/21/11  10
07/16-08:46:51  2.05  5/21/14  19
07/16-08:47:01  2.28  4/21/11  12

    一直都相信通过libperfstat接口计算出来的值, 并且一直以为CPU利用率很低, 我们的P590够强大. 直到有一天, 用topas看时, 突然间注意到SYS和USER这两个值总是比我程序中输出的高一倍左右, 也就是oramon程序中显示的CPU利用率偏低了, 只有WIO是正常的. 问题在哪儿呢?

    原来设置SMP支持选项后, 在操作系统中一个物理的CPU被看成了两个逻辑CPU了, 相当于超线程的概念了. 这样做可以提升CPU的处理能力, 查网上资料, 有人分析说, 在Power 5的芯片上可以提升30%, 在Power 6的芯片上可以提升40%的性能. 而oramon程序中, 就是取了按逻辑CPU算的值, 而不是按物理CPU算的值, 因此利用率大约相差了一倍.

    在perfstat_cpu_total_t结构中, 我原来取的是下面四个值:

sys, user, idle, waits

    改成取另外四个值来计算就行了:

psys, puser, pidle, pwaits

    IBM的东西太不懂, 有人要自已编写AIX上的性能监控程序的话, 可以去搜索一下libperfstat, 或参考这个网页.

用C取得Linux负荷值?

    oramon程序可以记录Oracle数据库的很多运行特征, 但还是需要记录一些OS级别的值, 最想要的是Load Average的三个值了, 另外还有CPU的利用率了. 在Solaris下可以用kstat库来取得这些值, 在AIX下可以用perfstat库的函数, 来搞定这些值. 但是在Linux上, 虽然说它是开源的, 但却没有搞定这几个值如何用C程序取出来的.

    用了最土的方法, 现在用的Linux基本上都是Kernel 2.4以上的了, 取得Load Average的话, 就直接访问"/proc/loadavg"算了.

float getloadavg1m()
{
  FILE *fp=NULL;
  char tmpbuf[128];

  if ((fp=fopen("/proc/loadavg","r"))!=NULL)
  {
      fscanf(fp,"%s",tempbuf);
      fclose(fp);
      return atof(tempbuf);
  }
  return 0f;
}

    这种打开文件的方法, 绝对算是很土, 但是运行还是很稳定, 每隔十秒钟打开一次应当问题不大. 只是取CPU的利用率, 就搞不定了, 谁能介绍更好的方法?

SQL*Plus的注释问题

    将下面的SQL语句存放到文件中, 或直接贴到SQL*Plus空口中, 会发现后面一个SELECT会被执行两次.

select sysdate from dual;
/* MyDUL */
select sysdate from dual;
/*MyDUL*/

    执行结果如下:

SQL>@cr.sql
SQL>select sysdate from dual;

20080711 14:24:32

SQL>/* MyDUL */
SQL>select sysdate from dual;

20080711 14:24:32

SQL>/*MyDUL*/

20080711 14:24:32

    估计是SQL*Plus工具的问题, 要确保中间有空格隔开, 或用两个减号的注释.

Step XX Done, Next XX.sql

    将一个很复杂的数据迁移脚本, 分成了好多步, 并且中间互不相关的部份用并行来节约时间. 由于步骤太多, 又需要在限定的时间内准确地完成. 开发DBA按照我的要求, 整理了很多的SQL文件.

(A01 - A10).sql
(B01 - B10).sql
(C01 - C10).sql

    其中B和C可以走一条线, A是最慢的. 在做完第一次测试后, 感觉有个地方不爽, 由于是一个人并行去做, 每一步做完后, 总不知道下一步是什么? 得想一想才知道. 于是又给开发DBA做了一个建议, 在每一个SQL文件的最后, 加一个提示.

prompt Step XX Done, Next XX.sql

    改了后, 几个DBA再去测, 都发现感觉上爽多了, 时间上也应当有比较多的节省, 但不知道具体节约了多少分钟.

    服务意识也可以用于过程的优化中.

最近收到的评注:

  • 水中石头 的留言 : 就是要做一个C或者java程序专门来做DMP格式的转换,是业务的需要,不是一次性的。现在还剩下date字段,timestamp字段,和文件头部分还有SQL语句和数据中夹的的那部分看不懂是什么意思,还请老大赐教!!!
  • anysql留言 : 为这个要研究DMP格式,绝对不是准确的做法。如果是一次性的,下一个Oracle先用一下好了。
  • 水中石头 的留言 : 如果频繁做写盘操作,linux在30小时后会有一次时间大约2小时的交换分区整理过程,这段时间网络程序都会掉线,好像还不是内核的原因,另外希望老大能指导一下怎么分析dmp文件格式,谢谢了
  • anysql留言 : 这个和CPU数目有关吧,CPU数目多的话,Load高一点也顶得住。 现在只是感觉到Linux的Load很敏觉,有些神经质。Load高了,会没有办法登录系统进行处理,应当是Linux内核的实时性不够好,不能保证后台系统进程能获得较高的优先级,这一点让人很不爽。
  • 水中石头 的留言 : 因为oracle太贵了,没有money,dmp文件是别家给的,我们需要生产文本文件,然后再导入到其他文件中,oracle developer ...
  • 水中石头 的留言 : 经过我的压力测试发现 linux的loading值非常有用,其他的值不好讲,loading千万不要持续在2以上,否则会出现应用程序长时间被挂起的现象
  • anysql留言 : 我看了你在ITPub中的问题,不如先导入到Oracle中,再取成文本文件了。 搞成文本文件可以用ociuldr。
  • 水中石头 的留言 : 请教楼主 dmp文件中数据的存储格式,我现在发现dmp文件中的数据格式部分看不懂,不知道oracle是怎么存储表中导出数据的
  • W&R 的留言 : 感觉没撒用,写批处理或者SHELL把能并行的一起跑不就OK了
  • mmhuang 的留言 : 赞同楼主的选择。 语言就是工具。从UI的角度看,语言的语法,句法等等就是语言的接口。好的接口就应该友好,使用方便,顺手。说到UI就是比较感官的东西。各花入各眼了。但总的来说。工业化了的语言就不那么灵活的。虽然健壮但比较古板。perl,js,lips等就是比较灵活点。不同的人用同一种语言可以写出不同风格的东西。 ...
  • anysql留言 : 谢谢指正,已修改。
  • alpha.cao 的留言 : CREATE TABLE ...
  • alpha.cao 的留言 : 不错,要是把2者的执行计划贴出来,我们菜鸟看起来就方便了!
  • anysql留言 : SQL Server的Log格式资料,我没有。
  • rexis留言 : 能不能发给我一些sql server ...
  • anysql留言 : 是要集成到用C语言写的工具中。
 

分类 | Categories

订阅本站更新:

RSS 2.0
从FeedSky订阅
从FeedBurner订阅
添加到 Google Reader
添加到 Bloglines
添加到 抓虾
添加到 鲜果
添加到 News Gator
添加到 Windows Live
添加到 Rojo
添加到 Zaptxt

友情站点连接:

本站基于MT-3.36免费版, 和Fenng设计的模板
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利. 本Blog内容仅代表个人观点, 与其他任何组织或公司无关.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql