ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20111227]strace 定位问题一例.txt

[20111227]strace 定位问题一例.txt

原创 Linux操作系统 作者:lfree 时间:2011-12-28 09:20:16 0 删除 编辑
前天使用sysinternals的procmon.exe工具帮助别人定位一个软件问题。就想是否linux下使用strace定位一些oracle的性能问题,自己今天做了一个尝试。

1. 确定会话spid=9130,执行如下:
12:04:30 SQL> select /*+ full(a) */ count(*) from THREEMEASURERECCONTACCESS a;
  COUNT(*)
----------
  14781771



--这个表很大,接近1G。

2.在另外一个终端打开:
# strace -o test.txt -p 9130

# ls -l /proc/9130/fd
total 11
lrwx------  1 oracle oinstall 64 Dec 27 12:09 0 -> /dev/null
lrwx------  1 oracle oinstall 64 Dec 27 12:09 1 -> /dev/null
lrwx------  1 oracle oinstall 64 Dec 27 12:09 14 -> socket:[5675157]
lrwx------  1 oracle oinstall 64 Dec 27 12:09 2 -> /dev/null
lr-x------  1 oracle oinstall 64 Dec 27 12:09 3 -> /dev/null
lr-x------  1 oracle oinstall 64 Dec 27 12:09 4 -> /dev/null
lr-x------  1 oracle oinstall 64 Dec 27 12:09 5 -> /dev/null
lr-x------  1 oracle oinstall 64 Dec 27 12:09 6 -> /dev/null
lr-x------  1 oracle oinstall 64 Dec 27 12:09 7 -> /dev/zero
lr-x------  1 oracle oinstall 64 Dec 27 12:09 8 -> /u01/app/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
lrwx------  1 oracle oinstall 64 Dec 27 12:09 9 -> /u02/app/oracle/oradata/ticare/icare_emr.dbf

# grep -i lseek test.txt
lseek(9, 30785536, SEEK_SET)            = 30785536
lseek(9, 32710656, SEEK_SET)            = 32710656
lseek(9, 41099264, SEEK_SET)            = 41099264
lseek(9, 49487872, SEEK_SET)            = 49487872
lseek(9, 57876480, SEEK_SET)            = 57876480
lseek(9, 66265088, SEEK_SET)            = 66265088
lseek(9, 74653696, SEEK_SET)            = 74653696
lseek(9, 82944000, SEEK_SET)            = 82944000
lseek(9, 91332608, SEEK_SET)            = 91332608
lseek(9, 99721216, SEEK_SET)            = 99721216
...............
lseek(9, 1027710976, SEEK_SET)          = 1027710976
lseek(9, 1036099584, SEEK_SET)          = 1036099584
lseek(9, 1044258816, SEEK_SET)          = 1044258816
lseek(9, 1044488192, SEEK_SET)          = 1044488192
lseek(9, 1052876800, SEEK_SET)          = 1052876800
lseek(9, 1061265408, SEEK_SET)          = 1061265408


lseek(9, 30785536, SEEK_SET)            = 30785536
readv(9, [{"\6\242\0\0\256\16\300\1W\251\316\0\0\0\1\4S\322\0\0\1\0"..., 8192}, {"\6\242\0\0\257\16\300\1W\251\316\0\0\0\1\4.h\0\0\1\0\0"..., 8192}, {"\6\242\0\0\260\16\300\1W\2..."
gettimeofday({1324958959, 727510}, NULL) = 0


从以上信息可以确定fd=9,表示的数据文件是/u02/app/oracle/oradata/ticare/icare_emr.dbf。lseek我的理解就是就是寻道定位的意思,readv应该表示读取,无法读懂里面的信息,
不过从lseek还是可以定位使用那个对象的。


3.查询视图:(哈哈,还是要使用oracle的视图)
SELECT *
  FROM dba_extents
 WHERE tablespace_name = 'ICARE_EMR' AND 30785536 / 8192 BETWEEN block_id AND block_id + blocks - 1;


OWNER      SEGMENT_NAME                   PARTITION_ SEGMENT_TYPE       TABLESPACE_NAME                 EXTENT_ID    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO

---------- ------------------------------ ---------- ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- ------------
ICARE      THREEMEASURERECCONTACCESS                 TABLE              ICARE_EMR                               0          7       2953    8388608       1024            7

SELECT *

  FROM dba_extents
 WHERE tablespace_name = 'ICARE_EMR' AND 1052876800 / 8192 BETWEEN block_id AND block_id + blocks - 1;

OWNER      SEGMENT_NAME                   PARTITION_ SEGMENT_TYPE       TABLESPACE_NAME                 EXTENT_ID    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO

---------- ------------------------------ ---------- ------------------ ------------------------------ ---------- ---------- ---------- ---------- ---------- ------------
ICARE      THREEMEASURERECCONTACCESS                 TABLE              ICARE_EMR                             121          7     128521    8388608       1024            7



可以确定基本一致。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-714047/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2351
  • 访问量
    6092949