Linux - 资源管理 命令

  1.  Linux 命令:资源管理  
  2.   
  3. 作者:Arup Nanda   
  4.   
  5. 在此部分中,了解用于监视物理组件的高级 Linux 命令  
  6.   
  7. Linux 系统由若干主要物理组件组成,如 CPU、内存、网卡和存储设备。要有效地管理 Linux 环境,您应该能够以合理的精度测量这些资源的各种指标 — 每个组件处理多少资源、是否存在瓶颈等。  
  8.   
  9. 在本系列的其他部分中,您已经学习了处于宏级别的用于测量指标的一些命令。但在此部分中,您将了解专门用于监视物理组件的高级 Linux 命令。具体而言,您将了解以下类别的命令:  
  10.   
  11.   
  12.   
  13. 内存  free、vmstat、mpstat、iostat、sar  
  14.   
  15. CPU   vmstat、mpstat、iostat、sar  
  16.   
  17. I/O   vmstat、mpstat、iostat、sar  
  18.   
  19. 进程  ipcs、ipcrm  
  20.   
  21. free  
  22.     一个常见的问题是“我的应用程序和各种服务器、用户和系统进程正在使用多少内存?”或者“现在有多少内存可用?  
  23. ”如果正在运行的进程使用的内存大于可用 RAM,则需要将这些进程移到交换区。因此,一个补充问题是“正在使用多少交换区空间?”  
  24.   
  25. free 命令将回答所有这些问题。而且,一个非常有用的选项 –m 可以显示可用内存(以 MB 为单位):  
  26.  
  27. # free -m  
  28.              total       used       free     shared    buffers     cached  
  29. Mem:          1772       1654        117          0         18        618  
  30. -/+ buffers/cache:       1017        754  
  31. Swap:         1983       1065        918  
  32.   
  33.     以上输出显示系统具有 1,772 MB 的 RAM,已使用 1,654 MB,还有 117 MB 内存可用。  
  34. 第二行显示在物理内存中缓冲区和缓存大小的更改。第三行显示交换区利用情况。  
  35.   
  36. 要以 KB 或 GB 为单位显示以上内容,请将 -m 选项分别替换为 -k 或 -g。使用 –b 选项将以字节为单位。  
  37.  
  38. # free -b  
  39.              total       used       free     shared    buffers     cached  
  40. Mem:    1858129920 1724039168  134090752          0   18640896  643194880  
  41. -/+ buffers/cache: 1062203392  795926528  
  42. Swap:   2080366592 1116721152  963645440  
  43.   
  44. –t 选项在输出底部显示总数(物理内存和交换区的总和):  
  45.  
  46. # free -m -t  
  47.              total       used       free     shared    buffers     cached  
  48. Mem:          1772       1644        127          0         16        613  
  49. -/+ buffers/cache:       1014        757  
  50. Swap:         1983       1065        918  
  51. Total:        3756       2709       1046  
  52.   
  53. 尽管 free 不显示百分比,但是我们可以提取并格式化输出的特定部分,将已使用的内存仅显示为总数的百分比:  
  54.  
  55. # free -m | grep Mem | awk '{print ($3 / $2)*100}'   
  56. 98.7077  
  57.   
  58. 这在具体数据非常重要的 shell 脚本中非常方便。例如,您可能希望在可用内存的百分比低于特定阈值时触发一个警报。  
  59.   
  60. 同样,要发现已使用交换区空间的百分比,您可以发出:  
  61.  
  62. # free -m | grep -i Swap | awk '{print ($3 / $2)*100}'  
  63. 11.1482  
  64. 可以使用 free 查看应用程序施加的内存负载。例如,启动备份应用程序之前检查可用内存,启动之后立即检查可用内存。  
  65. 两者之差就是备份应用程序消耗的内存。  
  66.   
  67. 针对 Oracle 用户的用法  
  68.     那么,您如何使用该命令管理运行 Oracle 环境的 Linux 服务器呢?  
  69. 性能问题的一个最常见原因是内存不足,从而导致系统临时将内存区域“交换”到磁盘中。  
  70. 某种程度的交换可能是必然的,但是交换过多则表示可用内存不足。而现在,您可以使用 free 获得可用内存信息,  
  71. 紧接着使用 sar 命令(稍后介绍)检查内存和交换区消耗的历史趋势。如果交换区的使用是暂时的,则可能出现一次高峰,  
  72. 但是如果明确要经过一段时间,则应注意。持续的内存过载可能有几个明显且可能的疑点:  
  73.   
  74. 较大的 SGA 高于可用内存  
  75. 在 PGA 上分配了大量内存  
  76. 某些进程出现泄露内存的错误  
  77. 对于第一种情况,应确保 SGA 低于可用内存。根据经验,  
  78. 对 SGA 使用大约物理内存的 40%,当然,应根据具体情况定义该参数。  
  79. 对于第二种情况,应尝试减少查询中的大量缓冲区分配。对于第三种情况,  
  80. 应使用 ps 命令(在本系列的之前部分中介绍过)确定可能泄露内存的具体进程。  
  81.   
  82. ipcs  
  83. 当某个进程运行时,它会夺取“共享内存”。该进程可能拥有一个或很多个共享内存段。进程之间彼此(“进程间通信”或 IPC)发送消息并使用信号。要显示有关共享内存段、IPC 消息队列以及信号的信息,可以使用一个命令:ipcs。  
  84.   
  85. –m 选项非常受欢迎;它显示共享内存段。  
  86.  
  87. # ipcs -m  
  88.    
  89. ------ Shared Memory Segments --------  
  90. key        shmid      owner      perms      bytes      nattch     status        
  91. 0xc4145514 2031618    oracle    660        4096       0                         
  92. 0x00000000 3670019    oracle    660        8388608    108                       
  93. 0x00000000 327684     oracle    600        196608     2          dest           
  94. 0x00000000 360453     oracle    600        196608     2          dest           
  95. 0x00000000 393222     oracle    600        196608     2          dest           
  96. 0x00000000 425991     oracle    600        196608     2          dest           
  97. 0x00000000 3702792    oracle    660        926941184  108                       
  98. 0x00000000 491529     oracle    600        196608     2          dest           
  99. 0x49d1a288 3735562    oracle    660        140509184  108                       
  100. 0x00000000 557067     oracle    600        196608     2          dest           
  101. 0x00000000 1081356    oracle    600        196608     2          dest           
  102. 0x00000000 983053     oracle    600        196608     2          dest           
  103. 0x00000000 1835023    oracle    600        196608     2          dest      
  104.   
  105. 该输出表明服务器正在运行 Oracle 软件,显示了各种共享内存段。每个共享内存段由显示在“shmid”列下面的共享内存 ID 唯一标识。  
  106. (稍后,您将看到如何使用该列值。)显然,“owner”显示内存段的所有者,  
  107. “perms”列显示权限(与 unix 权限相同),“bytes”显示字节大小。  
  108.   
  109. -u 选项显示一个非常快速的摘要:  
  110.  
  111. # ipcs -mu  
  112.   
  113. ------ Shared Memory Status --------  
  114. segments allocated 25  
  115. pages allocated 264305  
  116. pages resident  101682  
  117. pages swapped   100667  
  118. Swap performance: 0 attempts     0 successes  
  119.   
  120. –l 选项显示限定值(相对于当前值)  
  121.  
  122. # ipcs -ml  
  123.    
  124. ------ Shared Memory Limits --------  
  125. max number of segments = 4096  
  126. max seg size (kbytes) = 907290  
  127. max total shared memory (kbytes) = 13115392  
  128. min seg size (bytes) = 1  
  129.   
  130. 如果您看到当前值处于或接近限定值,则应该考虑提高限定值。  
  131.   
  132. 可以使用 shmid 值获取具体共享内存段的详细图片。–i 选项可以完成该操作。  
  133.   
  134. 下面是查看 shmid 3702792 详细信息的方法:  
  135.  
  136. # ipcs -m -i 3702792  
  137.    
  138. Shared memory Segment shmid=3702792  
  139. uid=500 gid=502 cuid=500        cgid=502  
  140. mode=0660       access_perms=0660  
  141. bytes=926941184 lpid=12225      cpid=27169      nattch=113  
  142. att_time=Fri Dec 19 23:34:10 2008    
  143. det_time=Fri Dec 19 23:34:10 2008    
  144. change_time=Sun Dec  7 05:03:10 2008      
  145.   
  146. 稍后,本文将采用一个示例向您介绍如何解释以上输出。  
  147.   
  148. -s 显示系统中的信号:  
  149.  
  150. # ipcs -s  
  151.    
  152. ------ Semaphore Arrays --------  
  153. key        semid      owner      perms     nsems       
  154. 0x313f2eb8 1146880    oracle    660        104         
  155. 0x0b776504 2326529    oracle    660        154       
  156. … and so on …    
  157.   
  158.     它显示一些有价值的数据。它显示 ID 为 1146880 的信号数组具有 104 个信号,另一个数组具有 154 个信号。  
  159. 如果您增加信号,则总值必须低于内核参数 (semmax) 定义的上限。安装 Oracle 数据库软件时,预安装的检查程序将检查 semmax 的设置。  
  160. 之后,当系统达到稳定状态时,您可以检查实际的利用情况,然后相应地调整内核值。  
  161.   
  162.   
  163. 针对 Oracle 用户的用法  
  164.    如何查看 Oracle 数据库实例使用的共享内存段?为此,请使用 oradebug 命令。首先以 sysdba 身份连接到数据库:  
  165.    
  166. $ sqlplus / as sysdba  
  167. 在 SQL 中,使用 oradebug 命令,如下所示:  
  168.   
  169. SQL> oradebug setmypid  
  170. Statement processed.  
  171. SQL> oradebug ipc  
  172. Information written to trace file.  
  173. 要查找跟踪文件的名称,执行以下命令:  
  174.   
  175. SQL> oradebug TRACEFILE_NAME  
  176. /opt/oracle/diag/rdbms/odba112/ODBA112/trace/ODBA112_ora_22544.trc  
  177. 现在,如果打开该跟踪文件,将会看到共享内存 ID。下面是该文件的节选:  
  178.   
  179. Area #0 `Fixed Size' containing Subareas 0-0  
  180.   Total size 000000000014613c Minimum Subarea size 00000000  
  181.    Area  Subarea    Shmid      Stable Addr      Actual Addr  
  182.       0        0 17235970 0x00000020000000 0x00000020000000  
  183.                               Subarea size     Segment size  
  184.                           0000000000147000 000000002c600000  
  185.  Area #1 `Variable Size' containing Subareas 4-4  
  186.   Total size 000000002bc00000 Minimum Subarea size 00400000  
  187.    Area  Subarea    Shmid      Stable Addr      Actual Addr  
  188.       1        4 17235970 0x00000020800000 0x00000020800000  
  189.                               Subarea size     Segment size  
  190.                           000000002bc00000 000000002c600000  
  191.  Area #2 `Redo Buffers' containing Subareas 1-1  
  192.   Total size 0000000000522000 Minimum Subarea size 00000000  
  193.    Area  Subarea    Shmid      Stable Addr      Actual Addr  
  194.       2        1 17235970 0x00000020147000 0x00000020147000  
  195.                               Subarea size     Segment size  
  196.                           0000000000522000 000000002c600000  
  197. ... and so on ...   
  198. 共享内存 id 以红色粗体显示。可以使用该共享内存 ID 来获取共享内存的详细信息:  
  199.  
  200. # ipcs -m -i 17235970  
  201. 另一个有用的观察是 lpid 的值 — 最后一个接触共享内存段的进程的进程 ID。要展示该属性的值,  
  202. 使用 SQL*Plus 从另一个会话连接到该实例。  
  203.   
  204. $ sqlplus / as sysdba  
  205. 在该会话中,查找服务器进程的 PID:  
  206.   
  207. SQL> select spid from v$process  
  208.   2  where addr = (select paddr from v$session  
  209.   3     where sid =  
  210.   4        (select sid from v$mystat where rownum < 2)  
  211.   5  );  
  212.    
  213. SPID  
  214. ------------------------  
  215. 13224  
  216. 现在,针对同一共享内存段再次执行 ipcs 命令:  
  217.  
  218. # ipcs -m -i 17235970  
  219.    
  220. Shared memory Segment shmid=17235970  
  221. uid=500 gid=502 cuid=500        cgid=502  
  222. mode=0660       access_perms=0660  
  223. bytes=140509184 lpid=13224      cpid=27169      nattch=113  
  224. att_time=Fri Dec 19 23:38:09 2008    
  225. det_time=Fri Dec 19 23:38:09 2008    
  226. change_time=Sun Dec  7 05:03:10 2008  
  227. 注意,lpid 的值已经从原来的值 12225 更改为 13224。lpid 显示最后一个接触共享内存段的进程的 PID。  
  228.   
  229. 该命令自身的价值不大。下一个命令 ipcrm 允许您基于输出采取操作,正如您将在下一部分所  
  230.   
  231. ipcrm  
  232. 既然您已经标识了共享内存和其他 IPC 指标,那么使用它们做什么呢?之前您看到过一些用法,  
  233. 如标识 Oracle 使用的共享内存、确保为共享内存设置了内核参数等等。  
  234. 另一个常见的应用是删除共享内存、IPC 消息队列或信号数组。  
  235.   
  236. 要删除某个共享内存段,注意 ipcs 命令输出中它的 shmid。  
  237. 然后使用 –m 选项删除该段。要删除 ID 为 3735562 的段,使用:  
  238.  
  239. # ipcrm –m 3735562  
  240. 这将删除该共享内存。还可以使用该命令删除信号和 IPC 消息队列(使用 –s 和 –q 参数)。  
  241.   
  242. 针对 Oracle 用户的用法  
  243. 有时当您关闭数据库实例时,Linux 内核可能未完全清除共享内存段。  
  244. 留下的共享内存没有什么用处,但它会占用系统资源,从而使可用于其他进程的内存更少。  
  245. 这种情况下,可以检查“oracle”用户所拥有的任何延迟共享内存段,然后删除它们,如果有这样的段,使用 ipcrm 命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值