高级 Linux 命令精通指南第 3 部分资源管理.docx

上传人:b****8 文档编号:9843364 上传时间:2023-02-07 格式:DOCX 页数:29 大小:32.50KB
下载 相关 举报
高级 Linux 命令精通指南第 3 部分资源管理.docx_第1页
第1页 / 共29页
高级 Linux 命令精通指南第 3 部分资源管理.docx_第2页
第2页 / 共29页
高级 Linux 命令精通指南第 3 部分资源管理.docx_第3页
第3页 / 共29页
高级 Linux 命令精通指南第 3 部分资源管理.docx_第4页
第4页 / 共29页
高级 Linux 命令精通指南第 3 部分资源管理.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

高级 Linux 命令精通指南第 3 部分资源管理.docx

《高级 Linux 命令精通指南第 3 部分资源管理.docx》由会员分享,可在线阅读,更多相关《高级 Linux 命令精通指南第 3 部分资源管理.docx(29页珍藏版)》请在冰豆网上搜索。

高级 Linux 命令精通指南第 3 部分资源管理.docx

高级Linux命令精通指南第3部分资源管理

高级Linux命令精通指南,第3部分:

资源管理

作者:

ArupNanda

2009年1月发表

在此部分中,了解用于监视物理组件的高级Linux命令

Linux系统由若干主要物理组件组成,如CPU、内存、网卡和存储设备。

要有效地管理Linux环境,您应该能够以合理的精度测量这些资源的各种指标—每个组件处理多少资源、是否存在瓶颈等。

在本系列的其他部分中,您已经学习了处于宏级别的用于测量指标的一些命令。

但在此部分中,您将了解专门用于监视物理组件的高级Linux命令。

具体而言,您将了解以下类别的命令:

组件

命令

内存

free、vmstat、mpstat、iostat、sar

CPU

vmstat、mpstat、iostat、sar

I/O

vmstat、mpstat、iostat、sar

进程

ipcs、ipcrm

正如您所见,某些命令出现在多个类别中。

这是由于这些命令可以执行很多任务。

某些命令比较适合于某些组件,例如iostat适合I/O,但是您应该了解它们工作的差别并使用您更熟悉的命令。

在多数情况下,单个命令可能对于了解实际发生的情况没什么用。

要获取所需的信息,您应该了解多个命令。

free

一个常见的问题是“我的应用程序和各种服务器、用户和系统进程正在使用多少内存?

”或者“现在有多少内存可用?

”如果正在运行的进程使用的内存大于可用RAM,则需要将这些进程移到交换区。

因此,一个补充问题是“正在使用多少交换区空间?

free命令将回答所有这些问题。

而且,一个非常有用的选项–m可以显示可用内存(以MB为单位):

#free-m

totalusedfreesharedbufferscached

Mem:

17721654117018618

-/+buffers/cache:

1017754

Swap:

19831065918

以上输出显示系统具有1,772MB的RAM,已使用1,654MB,还有117MB内存可用。

第二行显示在物理内存中缓冲区和缓存大小的更改。

第三行显示交换区利用情况。

要以KB或GB为单位显示以上内容,请将-m选项分别替换为-k或-g。

使用–b选项将以字节为单位。

#free-b

totalusedfreesharedbufferscached

Mem:

18581299201724039168134090752018640896643194880

-/+buffers/cache:

1062203392795926528

Swap:

20803665921116721152963645440

–t选项在输出底部显示总数(物理内存和交换区的总和):

#free-m-t

totalusedfreesharedbufferscached

Mem:

17721644127016613

-/+buffers/cache:

1014757

Swap:

19831065918

Total:

375627091046

尽管free不显示百分比,但是我们可以提取并格式化输出的特定部分,将已使用的内存仅显示为总数的百分比:

#free-m|grepMem|awk'{print($3/$2)*100}'

98.7077

这在具体数据非常重要的shell脚本中非常方便。

例如,您可能希望在可用内存的百分比低于特定阈值时触发一个警报。

同样,要发现已使用交换区空间的百分比,您可以发出:

free-m|grep-iSwap|awk'{print($3/$2)*100}'

可以使用free查看应用程序施加的内存负载。

例如,启动备份应用程序之前检查可用内存,启动之后立即检查可用内存。

两者之差就是备份应用程序消耗的内存。

针对Oracle用户的用法

那么,您如何使用该命令管理运行Oracle环境的Linux服务器呢?

性能问题的一个最常见原因是内存不足,从而导致系统临时将内存区域“交换”到磁盘中。

某种程度的交换可能是必然的,但是交换过多则表示可用内存不足。

而现在,您可以使用free获得可用内存信息,紧接着使用sar命令(稍后介绍)检查内存和交换区消耗的历史趋势。

如果交换区的使用是暂时的,则可能出现一次高峰,但是如果明确要经过一段时间,则应注意。

持续的内存过载可能有几个明显且可能的疑点:

∙较大的SGA高于可用内存

∙在PGA上分配了大量内存

∙某些进程出现泄露内存的错误

对于第一种情况,应确保SGA低于可用内存。

根据经验,对SGA使用大约物理内存的40%,当然,应根据具体情况定义该参数。

对于第二种情况,应尝试减少查询中的大量缓冲区分配。

对于第三种情况,应使用ps命令(在本系列的之前部分中介绍过)确定可能泄露内存的具体进程。

ipcs

当某个进程运行时,它会夺取“共享内存”。

该进程可能拥有一个或很多个共享内存段。

进程之间彼此(“进程间通信”或IPC)发送消息并使用信号。

要显示有关共享内存段、IPC消息队列以及信号的信息,可以使用一个命令:

ipcs。

–m选项非常受欢迎;它显示共享内存段。

#ipcs-m

------SharedMemorySegments--------

keyshmidownerpermsbytesnattchstatus

0xc41455142031618oracle66040960

0x000000003670019oracle6608388608108

0x00000000327684oracle6001966082dest

0x00000000360453oracle6001966082dest

0x00000000393222oracle6001966082dest

0x00000000425991oracle6001966082dest

0x000000003702792oracle660926941184108

0x00000000491529oracle6001966082dest

0x49d1a2883735562oracle660140509184108

0x00000000557067oracle6001966082dest

0x000000001081356oracle6001966082dest

0x00000000983053oracle6001966082dest

0x000000001835023oracle6001966082dest

该输出表明服务器正在运行Oracle软件,显示了各种共享内存段。

每个共享内存段由显示在“shmid”列下面的共享内存ID唯一标识。

(稍后,您将看到如何使用该列值。

)显然,“owner”显示内存段的所有者,“perms”列显示权限(与unix权限相同),“bytes”显示字节大小。

-u选项显示一个非常快速的摘要:

#ipcs-mu

------SharedMemoryStatus--------

segmentsallocated25

pagesallocated264305

pagesresident101682

pagesswapped100667

Swapperformance:

0attempts0successes

–l选项显示限定值(相对于当前值):

#ipcs-ml

------SharedMemoryLimits--------

maxnumberofsegments=4096

maxsegsize(kbytes)=907290

maxtotalsharedmemory(kbytes)=13115392

minsegsize(bytes)=1

如果您看到当前值处于或接近限定值,则应该考虑提高限定值。

可以使用shmid值获取具体共享内存段的详细图片。

–i选项可以完成该操作。

下面是查看shmid3702792详细信息的方法:

#ipcs-m-i3702792

SharedmemorySegmentshmid=3702792

uid=500gid=502cuid=500cgid=502

mode=0660access_perms=0660

bytes=926941184lpid=12225cpid=27169nattch=113

att_time=FriDec1923:

34:

102008

det_time=FriDec1923:

34:

102008

change_time=SunDec705:

03:

102008

稍后,本文将采用一个示例向您介绍如何解释以上输出。

-s显示系统中的信号:

#ipcs-s

------SemaphoreArrays--------

keysemidownerpermsnsems

0x313f2eb81146880oracle660104

0x0b7765042326529oracle660154

…andsoon…

它显示一些有价值的数据。

它显示ID为1146880的信号数组具有104个信号,另一个数组具有154个信号。

如果您增加信号,则总值必须低于内核参数(semmax)定义的上限。

安装Oracle数据库软件时,预安装的检查程序将检查semmax的设置。

之后,当系统达到稳定状态时,您可以检查实际的利用情况,然后相应地调整内核值。

针对Oracle用户的用法

如何查看Oracle数据库实例使用的共享内存段?

为此,请使用oradebug命令。

首先以sysdba身份连接到数据库:

#sqlplus/assysdba

在SQL中,使用oradebug命令,如下所示:

SQL>oradebugsetmypid

Statementprocessed.

SQL>oradebugipc

Informationwrittentotracefile.

要查找跟踪文件的名称,执行以下命令:

SQL>oradebugTRACEFILE_NAME

/opt/oracle/diag/rdbms/odba112/ODBA112/trace/ODBA112_ora_22544.trc

现在,如果打开该跟踪文件,将会看到共享内存ID。

下面是该文件的节选:

Area#0`FixedSize'containingSubareas0-0

Totalsize000000000014613cMinimumSubareasize00000000

AreaSubareaShmidStableAddrActualAddr

00172359700x000000200000000x00000020000000

SubareasizeSegmentsize

0000000000147000000000002c600000

Area#1`VariableSize'containingSubareas4-4

Totalsize000000002bc00000MinimumSubareasize00400000

AreaSubareaShmidStableAddrActualAddr

14172359700x000000208000000x00000020800000

SubareasizeSegmentsize

000000002bc00000000000002c600000

Area#2`RedoBuffers'containingSubareas1-1

Totalsize0000000000522000MinimumSubareasize00000000

AreaSubareaShmidStableAddrActualAddr

21172359700x000000201470000x00000020147000

SubareasizeSegmentsize

0000000000522000000000002c600000

...andsoon...

共享内存id以红色粗体显示。

可以使用该共享内存ID来获取共享内存的详细信息:

#ipcs-m-i17235970

另一个有用的观察是lpid的值—最后一个接触共享内存段的进程的进程ID。

要展示该属性的值,使用SQL*Plus从另一个会话连接到该实例。

#sqlplus/assysdba

在该会话中,查找服务器进程的PID:

SQL>selectspidfromv$process

2whereaddr=(selectpaddrfromv$session

3wheresid=

4(selectsidfromv$mystatwhererownum<2)

5);

SPID

------------------------

13224

现在,针对同一共享内存段再次执行ipcs命令:

#ipcs-m-i17235970

SharedmemorySegmentshmid=17235970

uid=500gid=502cuid=500cgid=502

mode=0660access_perms=0660

bytes=140509184lpid=13224cpid=27169nattch=113

att_time=FriDec1923:

38:

092008

det_time=FriDec1923:

38:

092008

change_time=SunDec705:

03:

102008

注意,lpid的值已经从原来的值12225更改为13224。

lpid显示最后一个接触共享内存段的进程的PID。

该命令自身的价值不大。

下一个命令ipcrm允许您基于输出采取操作,正如您将在下一部分所见。

ipcrm

既然您已经标识了共享内存和其他IPC指标,那么使用它们做什么呢?

之前您看到过一些用法,如标识Oracle使用的共享内存、确保为共享内存设置了内核参数等等。

另一个常见的应用是删除共享内存、IPC消息队列或信号数组。

要删除某个共享内存段,注意ipcs命令输出中它的shmid。

然后使用–m选项删除该段。

要删除ID为3735562的段,使用:

#ipcrm–m3735562

这将删除该共享内存。

还可以使用该命令删除信号和IPC消息队列(使用–s和–q参数)。

针对Oracle用户的用法

有时当您关闭数据库实例时,Linux内核可能未完全清除共享内存段。

留下的共享内存没有什么用处,但它会占用系统资源,从而使可用于其他进程的内存更少。

这种情况下,可以检查“oracle”用户所拥有的任何延迟共享内存段,然后删除它们,如果有这样的段,使用ipcrm命令。

vmstat

vmstat是最早用于显示所有与内存和进程相关信息的命令,调用时,该命令会持续运行并发布其信息。

它有两个参数:

#vmstat

是两次运行之间的时间间隔,以秒为单位。

是vmstat重复的次数。

下面是当我们希望vmstat每隔5秒运行一次并在第10次运行后停止时的示例。

每5秒之后都会输出一行并显示此时的统计信息。

#vmstat510

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

rbswpdfreebuffcachesisobiboincsussyidwa

0010870321325001526062248889199300410825

0010870321325001528462246400230151109585810981

001087032132484153006224480031779108890510980

…showsupto10times.

该输出显示有关系统资源的大量信息。

我们来详细介绍它们:

procs

显示进程数

r

等待运行的进程。

系统上的负载越多,等待运行CPU周期的进程数量越多。

b

不可中断睡眠的进程,也称为“被阻塞”的进程。

这些进程最有可能等待I/O,但也可能等待其他事情。

有时,还存在另外一列,该列位于标题“w”下,显示可以运行但已经交换到交换区域中的进程数。

“b”下的数值应接近于0。

如果“w”下的数值很高,可能需要更多内存。

下表显示了内存指标:

swpd

虚拟内存或交换内存的数量(以KB为单位)

free

可用物理内存的数量(以KB为单位)

buff

用作缓冲区的内存数量(以KB为单位)

cache

用作缓存的物理内存数量(以KB为单位)

缓冲区内存用来存储文件元数据(如i-nodes)以及原始块设备中的数据。

缓存内存用于文件数据本身。

下表显示了交换活动:

si

将内存从磁盘交换回物理RAM的速率(以KB/秒为单位)

so

将内存从物理RAM交换到磁盘的速率(以KB/秒为单位)

下表显示了I/O活动:

bi

系统向块设备发送数据的速率(以块/秒为单位)

bo

系统从块设备中读取数据的速率(以块/秒为单位)

下表显示了系统相关活动:

in

系统每秒接收到的中断数

cs

在进程空间中切换上下文的速率(以数量/秒为单位)

最后这张表可能用得最多—有关CPU负载的信息:

us

显示花费在用户进程中的CPU百分比。

Oracle进程属于这一类。

sy

系统进程(如所有根进程)使用的CPU百分比

id

可用CPU百分比

wa

花费在“等待I/O”上的百分比

让我们看一看如何解释这些值。

输出的第一行是自从系统重新启动以来所有指标的平均值。

因此,忽略该行,因为它并不显示当前状态。

其他行显示实时指标。

理想情况下,等待或阻塞的进程数量(位于“procs”标题下)应该为0或接近于0。

如果数值较高,则表示系统没有足够的资源(如CPU、内存或I/O)。

诊断性能问题时该信息非常有用。

“swap”下的数据表明交换是否过多。

如果交换过多,则表明物理内存可能不足。

应该减少内存需求或增加物理RAM。

“io”下的数据表示往返于磁盘的数据流。

这表明正在进行的磁盘活动量,这并不一定表明存在问题。

如果您看到“proc”和“b”列(正在阻塞的进程)下有较大的数值和较高的I/O,则可能出现了严重的I/O争用问题。

“cpu”标题下是最有用的信息。

“id”列显示空闲CPU。

如果用100减去该数值,则会得到繁忙CPU的百分比。

还记得本系列的另一个部分中描述的top命令吗?

该命令还显示CPU的空闲百分比数值。

区别是:

top显示每个CPU的空闲百分比,而vmstat显示所有CPU的空闲百分比。

vmstat命令还显示CPU使用情况的划分:

Linux系统使用多少、用户进程使用多少以及等待I/O使用多少。

通过该划分,您可以确定CPU消耗的组成。

如果系统CPU负载较高,能表明正在运行某个根进程(如备份)吗?

一段时间内的系统负载应该一致。

如果系统显示较高的数值,请使用top命令确定占有CPU的系统进程。

针对Oracle用户的用法

Oracle进程(后台进程和服务器进程)和用户进程(sqlplus、apache等)位于“us”下。

如果该数值较高,则使用top来确定进程。

如果“wa”列显示较高的数值,则表明I/O系统无法跟上读取或写入的数量。

有时这可能是因为在数据库中进行大量更新,从而导致日志切换以及后续的大量存档进程。

但是,如果它持续显示一个较大的数值,则表明可能存在I/O瓶颈。

Oracle数据库中的I/O瓶颈可能会造成严重的问题。

与性能问题不同,慢速I/O可能导致控制文件写入速度缓慢,这会导致等待获取控制文件的进程加入队列。

如果等待超过900秒且等待者是关键进程(如LGWR),则会关闭数据库实例。

如果您看到很多交换,可能是SGA的太大,以至于物理内存容纳不下。

应该减小SGA大小或增加物理内存。

mpstat

另一个用于获取CPU相关统计信息的有用的命令是mpstat。

下面是一个示例输出:

#mpstat-PALL52

Linux2.6.9-67.ELsmp(oraclerac1)12/20/2008

10:

42:

38PMCPU%user%nice%system%iowait%irq%soft%idleintr/s

10:

42:

43PMall6.890.0044.760.100.100.1048.051121.60

10:

42:

43PM09.200.0049.000.000.000.2041.60413.00

10:

42:

43PM14.600.0040.600.000.200.2054.60708.40

10:

42:

43PMCPU%user%nice%system%iowait%irq%soft%idleintr/s

10:

42:

48PMall7.600.0045.300.300.000.1046.701195.01

10:

42:

48PM04.190.002.200.400.000.0093.211034.53

10:

42:

48PM110.780.0088.220.400.000.000.20160.48

Average:

CPU%user%nice%system%iowait%irq%soft%idleintr/s

Average:

all7.250.0045.030.200.050.1047.381158.34

Average:

06.690.0025.570.200.000.1067.43724.08

Average:

17.690.0064.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1