Linux 命令:资源管理

 Linux 命令:资源管理

作者:Arup Nanda 

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

Linux 系统由若干主要物理组件组成,如 CPU、内存、网卡和存储设备。要有效地管理 Linux 环境,您应该能够以合理的精度测量这些资源的各种指标 — 每个组件处理多少资源、是否存在瓶颈等。

在本系列的其他部分中,您已经学习了处于宏级别的用于测量指标的一些命令。但在此部分中,您将了解专门用于监视物理组件的高级 Linux 命令。具体而言,您将了解以下类别的命令:



内存  free、vmstat、mpstat、iostat、sar

CPU   vmstat、mpstat、iostat、sar

I/O   vmstat、mpstat、iostat、sar

进程  ipcs、ipcrm

free
    一个常见的问题是“我的应用程序和各种服务器、用户和系统进程正在使用多少内存?”或者“现在有多少内存可用?
”如果正在运行的进程使用的内存大于可用 RAM,则需要将这些进程移到交换区。因此,一个补充问题是“正在使用多少交换区空间?”

free 命令将回答所有这些问题。而且,一个非常有用的选项 –m 可以显示可用内存(以 MB 为单位):

# free -m
             total       used       free     shared    buffers     cached
Mem:          1772       1654        117          0         18        618
-/+ buffers/cache:       1017        754
Swap:         1983       1065        918

    以上输出显示系统具有 1,772 MB 的 RAM,已使用 1,654 MB,还有 117 MB 内存可用。
第二行显示在物理内存中缓冲区和缓存大小的更改。第三行显示交换区利用情况。

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

# free -b
             total       used       free     shared    buffers     cached
Mem:    1858129920 1724039168  134090752          0   18640896  643194880
-/+ buffers/cache: 1062203392  795926528
Swap:   2080366592 1116721152  963645440

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

# free -m -t
             total       used       free     shared    buffers     cached
Mem:          1772       1644        127          0         16        613
-/+ buffers/cache:       1014        757
Swap:         1983       1065        918
Total:        3756       2709       1046

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

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

这在具体数据非常重要的 shell 脚本中非常方便。例如,您可能希望在可用内存的百分比低于特定阈值时触发一个警报。

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

# free -m | grep -i Swap | awk '{print ($3 / $2)*100}'
11.1482
可以使用 free 查看应用程序施加的内存负载。例如,启动备份应用程序之前检查可用内存,启动之后立即检查可用内存。
两者之差就是备份应用程序消耗的内存。

针对 Oracle 用户的用法
    那么,您如何使用该命令管理运行 Oracle 环境的 Linux 服务器呢?
性能问题的一个最常见原因是内存不足,从而导致系统临时将内存区域“交换”到磁盘中。
某种程度的交换可能是必然的,但是交换过多则表示可用内存不足。而现在,您可以使用 free 获得可用内存信息,
紧接着使用 sar 命令(稍后介绍)检查内存和交换区消耗的历史趋势。如果交换区的使用是暂时的,则可能出现一次高峰,
但是如果明确要经过一段时间,则应注意。持续的内存过载可能有几个明显且可能的疑点:

较大的 SGA 高于可用内存
在 PGA 上分配了大量内存
某些进程出现泄露内存的错误
对于第一种情况,应确保 SGA 低于可用内存。根据经验,
对 SGA 使用大约物理内存的 40%,当然,应根据具体情况定义该参数。
对于第二种情况,应尝试减少查询中的大量缓冲区分配。对于第三种情况,
应使用 ps 命令(在本系列的之前部分中介绍过)确定可能泄露内存的具体进程。

ipcs
当某个进程运行时,它会夺取“共享内存”。该进程可能拥有一个或很多个共享内存段。进程之间彼此(“进程间通信”或 IPC)发送消息并使用信号。要显示有关共享内存段、IPC 消息队列以及信号的信息,可以使用一个命令:ipcs。

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

# ipcs -m
 
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0xc4145514 2031618    oracle    660        4096       0                       
0x00000000 3670019    oracle    660        8388608    108                     
0x00000000 327684     oracle    600        196608     2          dest         
0x00000000 360453     oracle    600        196608     2          dest         
0x00000000 393222     oracle    600        196608     2          dest         
0x00000000 425991     oracle    600        196608     2          dest         
0x00000000 3702792    oracle    660        926941184  108                     
0x00000000 491529     oracle    600        196608     2          dest         
0x49d1a288 3735562    oracle    660        140509184  108                     
0x00000000 557067     oracle    600        196608     2          dest         
0x00000000 1081356    oracle    600        196608     2          dest         
0x00000000 983053     oracle    600        196608     2          dest         
0x00000000 1835023    oracle    600        196608     2          dest    

该输出表明服务器正在运行 Oracle 软件,显示了各种共享内存段。每个共享内存段由显示在“shmid”列下面的共享内存 ID 唯一标识。
(稍后,您将看到如何使用该列值。)显然,“owner”显示内存段的所有者,
“perms”列显示权限(与 unix 权限相同),“bytes”显示字节大小。

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

# ipcs -mu

------ Shared Memory Status --------
segments allocated 25
pages allocated 264305
pages resident  101682
pages swapped   100667
Swap performance: 0 attempts     0 successes

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

# ipcs -ml
 
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 907290
max total shared memory (kbytes) = 13115392
min seg size (bytes) = 1

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

可以使用 shmid 值获取具体共享内存段的详细图片。–i 选项可以完成该操作。

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

# ipcs -m -i 3702792
 
Shared memory Segment shmid=3702792
uid=500 gid=502 cuid=500        cgid=502
mode=0660       access_perms=0660
bytes=926941184 lpid=12225      cpid=27169      nattch=113
att_time=Fri Dec 19 23:34:10 2008  
det_time=Fri Dec 19 23:34:10 2008  
change_time=Sun Dec  7 05:03:10 2008    

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

-s 显示系统中的信号:

# ipcs -s
 
------ Semaphore Arrays --------
key        semid      owner      perms     nsems     
0x313f2eb8 1146880    oracle    660        104       
0x0b776504 2326529    oracle    660        154     
… and so on …  

    它显示一些有价值的数据。它显示 ID 为 1146880 的信号数组具有 104 个信号,另一个数组具有 154 个信号。
如果您增加信号,则总值必须低于内核参数 (semmax) 定义的上限。安装 Oracle 数据库软件时,预安装的检查程序将检查 semmax 的设置。
之后,当系统达到稳定状态时,您可以检查实际的利用情况,然后相应地调整内核值。


针对 Oracle 用户的用法
   如何查看 Oracle 数据库实例使用的共享内存段?为此,请使用 oradebug 命令。首先以 sysdba 身份连接到数据库:
 
$ sqlplus / as sysdba
在 SQL 中,使用 oradebug 命令,如下所示:

SQL> oradebug setmypid
Statement processed.
SQL> oradebug ipc
Information written to trace file.
要查找跟踪文件的名称,执行以下命令:

SQL> oradebug TRACEFILE_NAME
/opt/oracle/diag/rdbms/odba112/ODBA112/trace/ODBA112_ora_22544.trc
现在,如果打开该跟踪文件,将会看到共享内存 ID。下面是该文件的节选:

Area #0 `Fixed Size' containing Subareas 0-0
  Total size 000000000014613c Minimum Subarea size 00000000
   Area  Subarea    Shmid      Stable Addr      Actual Addr
      0        0 17235970 0x00000020000000 0x00000020000000
                              Subarea size     Segment size
                          0000000000147000 000000002c600000
 Area #1 `Variable Size' containing Subareas 4-4
  Total size 000000002bc00000 Minimum Subarea size 00400000
   Area  Subarea    Shmid      Stable Addr      Actual Addr
      1        4 17235970 0x00000020800000 0x00000020800000
                              Subarea size     Segment size
                          000000002bc00000 000000002c600000
 Area #2 `Redo Buffers' containing Subareas 1-1
  Total size 0000000000522000 Minimum Subarea size 00000000
   Area  Subarea    Shmid      Stable Addr      Actual Addr
      2        1 17235970 0x00000020147000 0x00000020147000
                              Subarea size     Segment size
                          0000000000522000 000000002c600000
... and so on ... 
共享内存 id 以红色粗体显示。可以使用该共享内存 ID 来获取共享内存的详细信息:

# ipcs -m -i 17235970
另一个有用的观察是 lpid 的值 — 最后一个接触共享内存段的进程的进程 ID。要展示该属性的值,
使用 SQL*Plus 从另一个会话连接到该实例。

$ sqlplus / as sysdba
在该会话中,查找服务器进程的 PID:

SQL> select spid from v$process
  2  where addr = (select paddr from v$session
  3     where sid =
  4        (select sid from v$mystat where rownum < 2)
  5  );
 
SPID
------------------------
13224
现在,针对同一共享内存段再次执行 ipcs 命令:

# ipcs -m -i 17235970
 
Shared memory Segment shmid=17235970
uid=500 gid=502 cuid=500        cgid=502
mode=0660       access_perms=0660
bytes=140509184 lpid=13224      cpid=27169      nattch=113
att_time=Fri Dec 19 23:38:09 2008  
det_time=Fri Dec 19 23:38:09 2008  
change_time=Sun Dec  7 05:03:10 2008
注意,lpid 的值已经从原来的值 12225 更改为 13224。lpid 显示最后一个接触共享内存段的进程的 PID。

该命令自身的价值不大。下一个命令 ipcrm 允许您基于输出采取操作,正如您将在下一部分所

ipcrm
既然您已经标识了共享内存和其他 IPC 指标,那么使用它们做什么呢?之前您看到过一些用法,
如标识 Oracle 使用的共享内存、确保为共享内存设置了内核参数等等。
另一个常见的应用是删除共享内存、IPC 消息队列或信号数组。

要删除某个共享内存段,注意 ipcs 命令输出中它的 shmid。
然后使用 –m 选项删除该段。要删除 ID 为 3735562 的段,使用:

# ipcrm –m 3735562
这将删除该共享内存。还可以使用该命令删除信号和 IPC 消息队列(使用 –s 和 –q 参数)。

针对 Oracle 用户的用法
有时当您关闭数据库实例时,Linux 内核可能未完全清除共享内存段。
留下的共享内存没有什么用处,但它会占用系统资源,从而使可用于其他进程的内存更少。
这种情况下,可以检查“oracle”用户所拥有的任何延迟共享内存段,然后删除它们,如果有这样的段,使用 ipcrm 命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值