最近想的一些东西,记录下。
每当我们说到应用的时候,我们到底是从什么角度出发的?什么叫应用,网络,存储,机器,OS,DB,APPServ,JAVA它们是如何看待“Application”这个词的?比如对于一个交换机而言,在它的眼里,那一串一串的100100000100100101010100101有哪一段是属于自己可以理解可以读懂的?当它读懂了自己可以读懂的那一部分以后,剩下的那一部分它称之为“数据”的东西,到底是来自何方?在192.168.0.1的后面是一个什么类型的实体?如果是存储?那到底是HDS还是IBM或者是NetApp?如果是机器,那到底是一台570,PCServer或则只是一个刀片?再比如对机器而言,当CPU从内存中取出一条指令,它知道这条指令的背后的OS是什么吗?是AIX,Linux?或者是Windows? 对OS而言,当它接到一个命令,读取文件A上的第M到第N个块,它知道这个命令是谁发起的吗?如果是一个数据库?是ORACLE,Mysql还是Postgresql? 对数据库而言,当它接到一个sql,它会知道这个sql发起方是一个Websphere还是一个Weblogic吗?
当我们在思考这些问题的时候,不妨想想,我们发现某个系统“IO”存在问题, 在这里IO到底是指什么?这个IO到底会涉及到哪些环节呢?数据库,OS,机器,网络,存储,再细一点呢?比如数据库调用OS的方法例如OPEN(),读取文件X的块M到块N,OS的卷管理软件VM分析这个指令后,变为读取LV
A上的地址a到地址c,然后根据缓存中保存的VGDA的信息比如PPsize,初始偏移量,映射关系等来映射成读取“物理卷”PV B上的地址f到地址h, 当这些事情都做完以后,VM提示CPU将这个指令通过南北桥发给了在SCSI总线上的一块SCSI卡,SCSI卡在得到指令后通过网络转给了远端的某个磁盘阵列,由于OS所称的“物理卷”PV B阵列并不认识,对它来讲,PV
B只是一个逻辑盘,它可能对应自己的很多块物理磁盘,于是阵列上RAID卡在接到这个指令后需要做一个映射,变成读取磁盘1到磁盘8上若干个stripe,首先是stripe m所对应的磁盘1上的segment 或者叫strip(m,0)所包含的block1,block2,block3,block4,接着是磁盘2上的segment strip(m,1)所包含的block1,block2,block3,block4。。。。。。然后是stripe n所对应的磁盘1上的segment
strip(n,0)所包含的block1,block2,block3,block4。。。。。。最后磁盘1的驱动器接到指令后提示步进电机带动0号磁头开始寻道,SCAN,读取0号盘片的00盘面的第16扇区,接着是1号磁头0号盘片01盘面第16扇区,然后是2号磁头1号盘片02号盘面第16个扇区,3号磁头1号盘片03号盘面第16个扇区。。。。。。至此整个过程才算结束(当然实际情况要比这个复杂的多的多)。
在上面这个例子里,可以导致系统“IO”出现问题的环节很多,比如通信:数据库与OS的通信(调用OS的方法),OS的卷管理程序与CPU之间的通信,CPU与内存之间的通信,CPU与北桥芯片之间的前端总线,主板上的南北桥芯片,南桥与SCSI总线之间的PCI总线,PCI总线与SCSI适配器(也就是SCSI卡)之间的SCSI总线,SCSI卡与网卡之间的通信,网卡与阵列RAID卡之间的网络通信(交换机,网线,防火墙,路由),RAID卡与磁盘驱动器之间的SCSI总线,磁盘驱动器与磁头臂之间的控制电路。再比如缓存,数据库的缓存机制,OS的缓存机制,阵列的缓存机制等等。这些环节里,哪些
举个例子,我们在数据库层发现等待事件logfile sync,我们能想到的会有logbuffer大小,每秒redo大小,user
commit/rollback次数 ,LGWR写出效率等等,除了这些我们是否还应该考虑到redo logfile所在的LV归属的VG下有哪些PV,这些PV代表的LUN所对应的存储阵列中的物理磁盘的RAID类型,所采用的缓存策略,这个LUN和另外哪些LUN一起同属于存储阵列里的N个物理磁盘,其他的这些LUN又对应成OS的哪些LV,这些LV又对应了数据库中的哪些数据文件,上面都有些什么对象等等。
再举个例子,当我发现系统很缓慢,发现数据库里出现了比较多的IO等待事件,我们转到操作系统,发现操作系统vmstat wa列很高,由此判断系统此刻IO很繁忙,那么这个繁忙是否真的就代表磁盘阵列里某几个磁盘的步进电机正在疯狂的干活?如果不是,那瓶颈是在哪里?上面那些环节中哪些又可能存在瓶颈呢?是物理的可能性更高点,还是逻辑的呢?