ORACLE-insert /*+append*/提高性能

在非归档模式下表设置为nologging用insert /*+append*/速度最快。那为什么快呢,原理是什么?下面我们来一起做一个实验:

SQL> create or replace view m_undo_redo as
select v$statname.name,value
from v$mystat, v$statname
where v$mystat.statistic# =v$statname.statistic#
and (v$statname.name =’redo size’
or v$statname.name = ‘undo change vector size’);

视图已创建。

SQL> create table t (x int);

表已创建。

SQL> set timing on
SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 22644
undo change vector size 7484
SQL> insert into t select rownum from dual connect by level <=1000000;

已创建1000000行。

已用时间:  00: 00: 01.03

SQL> commit;

提交完成。

SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 15722456
undo change vector size 2380000
SQL> select (2380000-7484) undo,(15722456-22644) redo from dual;
UNDO REDO
———- ———-
2372516 15699812
SQL> truncate table t;

表被截断。

SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 15781532
undo change vector size 2396672
SQL> insert /*+append*/ into t select rownum from dual connect by level <=1000000;

已创建1000000行。

已用时间:  00: 00: 00.96

SQL> commit;

提交完成。

SQL> select * from m_undo_redo;
NAME VALUE
—————————————————————- ———-
redo size 15871640
undo change vector size 2419196
SQL> select (2419196-2396672) undo,(15871640-15781532) redo from dual;
UNDO REDO
———- ———-
22524 90108

两次的对比:

模式
生成undo

生成redo

普通insert  2372516  15699812
insert /*+append*/ 22524 90108
分析结论:两次对比的结果表示用insert /*+append*/后,数据的undo和redo没有生成。因为HWM 在移动的过程中,这些block是不能被其他process使用的,那么意味着,只要记录下该次direct insert所涉及到的空间的redo 和 undo  ,在失败回滚的时候,只需要把这些空间修改为原来的状态就可以,而不用逐个记录去delete。

原文:https://blog.csdn.net/lee_sire/article/details/54098275

ORA-20100 文件 通过 FND_FILE 创建失败解决方案

克隆了一个EBS 11i的环境,提交客户同步请求的时候出现了错误提示是:
原因:由于 ORA-20100: 为 FND_FILE 创建文件 10034190.tmp 失败。
我的服务器中有2个ERP环境,参数APPSLPTMP指定为默认的/usr/tmp。然后, 在网上找了一些相关资料,说不同的环境APPSLPTMP和数据库的utl_file_dir参数不能指定相同的目录,于是做了修改,修改命令如下:
# mkdir -p /usr/opt/tmp       创建目录
# chmod -R a+rw /usr/opt  赋予该目录读写权限
# su – orauat                               切换致数据库用户
$ export APPSLPTMP=/usr/opt/tmp   修改环境变量
$ cd $ORACLE_HOME/dbs
$ vi init<SID>.ora                   编辑数据库初始化文件,修改参数:utl_file_dir
utl_file_dir = /usr/opt/tmp,……..<SID>_prod
并且重新启动的环境。在数据库执行函数:FND_FILE_OUT_LINE()提示成功。
这个错误很常见:

1.查看$APPLPTMP系统环境变量的值,一般是/usr/tmp,需要保证该文件夹是存在的;

2.查看utl_file_dir数据库参数,其第一个值也应该为/usr/tmp;
select* from v$parameter t whee t.name=’utl_file_dir’
3.查看该文件夹的权限,该文件夹必须为应用用户和数据库用户都具有读写权限;
4.通过exec FND_FILE.PUT_LINE(FND_FILE.LOG, ‘THIS IS A TEST’);进行测试;
5.如果仍然还有问题,请查看你的服务器上面是不是有多套ERP环境,如果有多个的话两个$APPLPTMP文件同时写会冲突当一台服务器上运行了多套环境时,不能使用/usr/tmp作为$APPLPTMP,须定义成各自的目录。且该目录须在数据库参数utl_file_dir中。

ntp服务器同步时间详细配置(转载)

NTP服务端:linl_S    IP:10.0.0.15
NTP客户端:lin_C    IP:10.0.0.16

NTP服务概述

1、原理

NTP(Network TimeProtocol,网络时间协议)是用来使计算机时间同步的一种协议。它可以使计算机对其服务器或时钟源做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),切可介由加密确认的方式来防止恶意的协议攻击。
模式:C/S模式
运行模式:

2、端口(123)

1 [root@linl_S ~]# vim /etc/services 
2 nntp            119/tcp         readnews untp   # USENET News Transfer Protocol
3 nntp            119/udp         readnews untp   # USENET News Transfer Protocol
4 ntp             123/tcp
5 ntp             123/udp                         # Network Time Protocol
拓展:
NNTP(Network News Transport Protocol),中文释义:(RFC-977)网络新闻传输协议。这是一个主要用于阅读和发布新闻文章(俗称为“帖子”,比较正式的名字是“新闻组邮件”)到Usenet 上的Internet应用协议,也负责新闻在服务器间的传送。
安装NTP
默认是已安装,如果是最小化安装系统,则需要手动安装。
1)NTP相关软件包
1 [root@linl_S ~]# ls /mnt/Packages/ntp*
2 /mnt/Packages/ntp-4.2.6p5-1.el6.x86_64.rpm         #NTP服务端软件包
3 /mnt/Packages/ntpdate-4.2.6p5-1.el6.x86_64.rpm     #NTP客户端软件包
2)安装NTP服务端软件包:
1 [root@linl_S ~]# yum -y install ntp         #NTP两个软件包都会安装上
2 ...
3 Installed:
4   ntp.x86_64 0:4.2.6p5-1.el6                                      
5 Dependency Installed:
6   ntpdate.x86_64 0:4.2.6p5-1.el6                                  
7 Complete!
    安装客户端:
1 [root@linl_C ~]# rpm -ivh /mnt/Packages/ntpdate-4.2.6p5-1.el6.x86_64.rpm     #只安装ntpdate安装包
2 warning: /mnt/Packages/ntpdate-4.2.6p5-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
3 Preparing...                ########################################### [100%]
4     package ntpdate-4.2.6p5-1.el6.x86_64 is already installed
    NTP配置文件所在位置
1 [root@linl_S ~]# ls /etc/ntp.conf 
2 /etc/ntp.conf
3)启动NTP服务
 1 [root@linl_S ~]# service ntpd start          #启动ntp服务
 2 Starting ntpd:                                             [  OK  ]
 3 [root@linl_S ~]# netstat -anptu |grep 123    #查看端口123是否开放
 4 udp        0      0 10.0.0.15:123               0.0.0.0:*                               5846/ntpd           
 5 udp        0      0 127.0.0.1:123               0.0.0.0:*                               5846/ntpd           
 6 udp        0      0 0.0.0.0:123                 0.0.0.0:*                               5846/ntpd           
 7 udp        0      0 fe80::20c:29ff:fea9:c1ae:123 :::*                                    5846/ntpd           
 8 udp        0      0 ::1:123                     :::*                                    5846/ntpd           
 9 udp        0      0 :::123                      :::*                                    5846/ntpd           
10 [root@linl_S ~]# chkconfig ntpd on           #开机自启动
实战1:手动同步NTP时间服务器

1)在lin_S服务器上查看可用的NTP时间服务器

1 [root@linl_S ~]# vi /etc/ntp.conf 
2 # Use public servers from the pool.ntp.org project.
3 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
4 server 0.rhel.pool.ntp.org iburst       #找一个可以使用的NTP时间服务器
5 server 1.rhel.pool.ntp.org iburst
6 server 2.rhel.pool.ntp.org iburst
7 server 3.rhel.pool.ntp.org iburst

2)在lin_C客户端上与NTP时间服务器进行同步

1 [root@linl_C ~]# ntpdate 0.rhel.pool.ntp.org
2 22 May 22:04:41 ntpdate[5733]: adjust time server 202.118.1.130 offset 0.027428 sec
拓展:
在lin_S服务端(已启动NTP服务)与NTP时间服务器进行同步会报错。
1 [root@linl_S ~]# ntpdate 0.rhel.pool.ntp.org
2 22 May 22:06:17 ntpdate[2464]: the NTP socket is in use, exiting
问题分析:
出现该错误的原因是lin_S服务器正在运行ntpd服务,就不能用ntpdate来手动更新时间了。
解决方法:
关闭ntpd服务
1 [root@linl_S ~]# service ntpd stop
2 Shutting down ntpd:                                        [  OK  ]
3 [root@linl_S ~]# ntpdate 0.rhel.pool.ntp.org
4 22 May 22:13:27 ntpdate[2495]: adjust time server 202.118.1.130 offset -0.068183 sec

实战2:搭建内网NTP服务器,内网服务器通过此NTP服务器进行时间同步

1)修改NTP配置文件

      蓝色底纹部分为增加项

 1 [root@linl_S ~]# vi /etc/ntp.conf 
 2 # Permit all access over the loopback interface.  This could
 3 # be tightened as well, but to do so would effect some of
 4 # the administrative functions.
 5 restrict 127.0.0.1
 6 restrict -6 ::1
 7 restrict 10.0.0.0 mask 255.255.255.0       #允许10.0.0.0 网段中的服务器访问本ntp服务器进行时间同步
 8 restrict 10.0.0.16                         #允许单个IP地址访问本ntp服务器
 9 # Use public servers from the pool.ntp.org project.
10 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
11 server 210.72.145.44    #指定本ntp服务器的上游ntp服务器为210.72.145.44,并且设置为首先服务器。同步时间为:从上到下,写的越靠上,优先级越高。(此服务器同步不了时间,寻找下一个ntp服务器)。此IP地址是中国国家授时中心ntp服务器。                    
12 server 133.100.11.8     #当上面服务器同步不了,则寻找第二个。此IP地址是日本福冈大学ntp服务器。
13 server 0.rhel.pool.ntp.org iburst
14 server 1.rhel.pool.ntp.org iburst
15 server 2.rhel.pool.ntp.org iburst
16 server 3.rhel.pool.ntp.org iburst
17 server 127.127.1.0           #local clock 如果上面的服务器都无法同步时间,就和本地系统时间同步。127.127.1.0在这里是一个IP地址,不是网段。
18 fudge 127.127.1.0 stratum 10    #127.127.1.0 为第10层。ntp 和127.127.1.0同步完后,就变成了11层。  ntp是层次阶级的。同步上层服务器的stratum 大小不能超过或等于16。

2)启动ntpd服务

1 [root@linl_S ~]# /etc/init.d/ntpd start
2 Starting ntpd:                                             [  OK  ]
3 [root@linl_S ~]# netstat -ln |grep 123
4 udp        0      0 10.0.0.15:123               0.0.0.0:*                               
5 udp        0      0 127.0.0.1:123               0.0.0.0:*                               
6 udp        0      0 0.0.0.0:123                 0.0.0.0:*                               
7 udp        0      0 fe80::20c:29ff:fea9:c1ae:123 :::*                                    
8 udp        0      0 ::1:123                     :::*                                    
9 udp        0      0 :::123                      :::*
3)查看ntpd服务状态
指令“ntpq -p”可以列出目前我们的NTP与相关的上层NTP的状态,以上的几个字段的意义如下:
remote:即remote – 本机和上层ntp的ip或主机名,“+”表示优先,“*”表示次优先。
refid:参考的上一层NTP主机的地址
st:即stratum阶层
poll:下次更新在几秒之后

offset:时间补偿的结果

 1 [root@linl_S ~]# ntpq -p         #列出本NTP服务器与上游服务器的连接状态
 2      remote           refid      st t when poll reach   delay   offset  jitter
 3 ==============================================================================
 4  210.72.145.44   .INIT.          16 u    -   64    0    0.000    0.000   0.000
 5  133.100.11.8    .INIT.          16 u    -   64    0    0.000    0.000   0.000
 6 *dns1.synet.edu. 202.118.1.47     2 u   32   64    3   60.058    7.261   6.860
 7  news.neu.edu.cn .INIT.          16 u    -   64    0    0.000    0.000   0.000
 8  202.118.1.130   .INIT.          16 u    -   64    0    0.000    0.000   0.000
 9  42.96.167.209   .INIT.          16 u    -   64    0    0.000    0.000   0.000
10  LOCAL(0)        .LOCL.          10 l   96   64    2    0.000    0.000   0.000
11 [root@linl_S ~]# ntpstat         #列出是否与上游服务器连接。需要过5分钟
12 synchronised to NTP server (202.112.29.82) at stratum 3     #可以看到我们当前在3层
13    time correct to within 257 ms    #ms 毫秒是一种较为微小的时间单位,是一秒的千分之一。
14    polling server every 64 s

4)客户端同步时间

1 [root@linl_C ~]# date -s "2015-5-23 11:30"    #先设置一个错误的时间点
2 Sat May 23 11:30:00 CST 2015
3 [root@linl_C ~]# ntpdate lin_S    #进行ntp时间同步
4 23 May 11:34:10 ntpdate[6686]: step time server 10.0.0.15 offset 31622622.275270 sec
5 [root@linl_C ~]# date             
6 Mon May 23 11:34:16 CST 2016      #时间同步成功
常见错误:如下所示。
其实,这不是一个错误。而是由于每次重启NTP服务器之后大约要3-5分钟客户端才能与server建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。
1 [root@linl_C ~]# ntpdate lin_S
2 23 May 11:38:02 ntpdate[6694]: no server suitable for synchronization found
5)和NTP相关的配置文件
/etc/sysconfig/clock        #这个是linux 的主要时区设定文件。每次开机后,Linux会自动的读取这个文件来设定自己系统所默认要显示的时间。
1 [root@linl_S ~]# cat /etc/sysconfig/clock
2 # The time zone of the system is defined by the contents of /etc/localtime.
3 # This file is only for evaluation by system-config-date, do not rely on its
4 # contents elsewhere.
5 ZONE="Asia/Shanghai"
拓展1:linux系统时间和BIOS时间是不是一定一样?
查看硬件BIOS时间:
hwclock -r    读出BIOS的时间参数
hwclock -w    将当前系统时间写入BIOS中
1 [root@linl_C ~]# date -s "2016-5-22 13:50"
2 Sun May 22 13:50:00 CST 2016
3 [root@linl_C ~]# hwclock -r
4 Mon 23 May 2016 01:53:50 PM CST  -0.110948 seconds
5 [root@linl_C ~]# hwclock -w
6 [root@linl_C ~]# hwclock -r
7 Sun 22 May 2016 01:50:48 PM CST  -0.783098 seconds     #已将系统date时间写入到BIOS时间
拓展2:不同机器之间的时间同步
为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。
同步时间,可以使用ntpdate命令,也可以使用ntp服务。
方法一:使用ntpdate 比较简单。格式如下:
1 [root@linl_C ~]# ntpdate lin_S
2 23 May 19:50:44 ntpdate[7507]: step time server 10.0.0.15 offset 1.239826 sec
但这样的同步,只是强制性的将系统时间设置为ntp 服务器时间。只是治标不治本。所以,一般配合cron命令,来进行定期同步设置。比如,在crontab 中添加:
1 [root@linl_C ~]# crontab -e
2 0 12 * * * /usr/sbin/ntpdate lin_S
方法二:使用ntpd 服务进行同步。
要注意的是,ntpd 有一个自我保护设置:如果本机与上源时间相差太大,ntpd 不运行。所以新设置的时间服务器一定要先ntpdate 从上源取得时间初值。然后启动ntpd 服务。
转载自:https://www.cnblogs.com/shanhua-fu/p/9281040.html

EBS Oracle库问题之变更oracle process数

早上遇到一套环境数据库突然不能连接,应用也无法连接,查询alert_PROD.log发现连接数超过最高200,于是最快的方式是增加process连接数。先关闭应用,此时去关闭的时候已经提示不能连上数据库,于是通过ps -fu applprod,把相应的进程都kill掉。然后连上数据库的服务器,sqlplus方式连接去关闭数据库。其实这个时候关闭后会将大部分的进程释放掉,这个时候去启动应用应该可以正常启动,但是考虑到200的process数太小,还是决定增大。于是按照下面方式进行:

遇到在增加ebs Oracle process数据的时候错误,解决方式:

1、show parameter spfile;

2、create parameter pfile;

3、shutdown immediate;

4、startup;

5、alter system set processes=800 scope=spfile;

6、shutdown immediate;

7、重启数据库、重启应用。

参考:

调整数据库SGA区的大小

默认安装完毕后,数据库的SGA的大小是1G。根据电脑内存大小和下面的表格作适当的调整。

数据库初始化参数建议值

Parameter Name Development or Test Instance 11-100 Users 101-500 Users 501-1000 Users 1001-2000 Users
processes 200 200 800 1200 2500
sessions 400 400 1600 2400 5000
sga_target 1G 1G 2G 3G 14G
shared_pool_size (csp) N/A N/A N/A 1800M 3000M
shared_pool_reserved_size(csp) N/A N/A N/A 180M 300M
shared_pool_size (no csp) 400M 600M 800M 1000M 2000M
shared_pool_reserved_size(no csp) 40M 60M 80M 100M 100M
pga_aggregate_target 1G 2G 4G 10G 20G
Total Memory Required ~ 2 GB ~ 3 GB ~ 6 GB ~ 13 GB ~ 34 GB

以数据库用户oraprod登录,修改Oracle数据库的初始化文件

/u01/oracle/PROD/db/tech_st/11.1.0/dbs/initPROD.ora

备份文件initPROD.ora

cd /u01/oracle/PROD/db/tech_st/11.1.0/dbs/

cp initPROD.ora initPROD.ora.bak_<替换为修改日期>

vi initPROD.ora

修改如下内容

processes          = 800     ###默认值200

sessions           = 1600    ###默认值400

sga_target         = 2G      ###默认值1G

shared_pool_size   = 800M    ###默认值400M

shared_pool_reserved_size = 80M ###默认值40M

pga_aggregate_target     = 4G   ###默认值 1G

因为我的内存有64G,所以把这两个参数扩大了点。根据实际情况,如果你只有1G内存的话,建议你把这两个参数都调整成512M或更小。

1、关应用;
2、关数据库;
3、数据库用户:
cd $ORACLE_HOME/dbs
cp initPROD.ora initPROD.ora.bak20190703
vi initPROD.ora
找到具体指标:
processes = 800 ###默认值200
sessions = 1600 ###默认值400
sga_target = 2G ###默认值1G
shared_pool_size = 800M ###默认值400M
shared_pool_reserved_size = 80M ###默认值40M
pga_aggregate_target = 4G ###默认值 1G

保存后。
4、启动数据库;
5、启动应用。

TOP命令及Free语义分析(转载)

接触 linux 的人对于 top 命令可能不会陌生(不同系统名字可能不一样,如 IBM 的 aix 中叫 topas ),它的作用主要用来监控系统实时负载率、进程的资源占用率及其它各项系统状态属性是否正常。

下面我们先来看张 top 截图:

(1)系统、任务统计信息:

前 8 行是系统整体的统计信息。第 1 行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

01:06:48 当前时间
up 1:22 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

注意:这三个值可以用来判定系统是否负载过高——如果值

持续大于系统 cpu 个数,就需要优化你的程序或者架构了。

(2)进程、 cpu 统计信息:

第 2~6 行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:

Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s): 0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi Hardware IRQ
0.0% si Software IRQ

注:

(1)IRQ: IRQ全称为Interrupt Request,即是“中断请求”的意思。

(2)st(Steal Time):stole time 的缩写,该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比

So, relatively speaking, what does this mean? A high steal percentage may mean that you may be outgrowing your virtual machine with your hosting company. Other virtual machines may have a larger slice of the CPU’s time and you may need to ask for an upgrade in order to compete. Also, a high steal percentage may mean that your hosting company is overselling virtual machines on your particular server. If you upgrade your virtual machine and your steal percentage doesn’t drop, you may want to seek another provider. A low steal percentage can mean that your applications are working well with your current virtual machine. Since your VM is not wrestling with other VM’s constantly for CPU time, your VM will be more responsive. This may also suggest that your hosting provider is underselling their servers, which is definitely a good thing.0.0% sisi(Software Interrupts)

(3)最后两行为内存信息:

Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。

PS:如何计算可用内存和已用内存?

除了 free -m 之外,也可以看 top:

Mem:    255592k total,   167568k used,    88024free,    25068k buffers
Swap:   524280k total,        0k used,   524280free,    85724k cached

3.1  实际的程序可用内存数怎么算呢?

The answer is: free + (buffers + cached)

88024k + (25068k + 85724k) = 198816k

3.2  程序已用内存数又怎么算呢?

The answer is: used – (buffers + cached)

167568k – (25068k + 85724k) = 56776k

3.3  怎么判断系统是否内存不足呢?

如果你的 swap used 数值大于 0 ,基本可以判断已经遇到内存瓶颈了,要么优化你的代码,要么加内存。

3.4  buffer 与cache 的区别

A buffer is something that has yet to be “written” to disk. A cache is something that has been “read” from the disk and stored for later use 从应用程序角度来看,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读写的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存 = 系统free memory + buffers + cached.

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
cached是用来给文件做缓冲。
那就是说:buffers是用来存储,目录里面有什么内容,权限等等。
而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。

#free
#man X
#free
#man X
#free
你可以先后比较一下free后显示buffers的大小。
另一个实验:
#free
#ls /dev
#free
你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。
因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles)

(4)进程信息区:

统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

(5)查看指定列

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
可以通过下面的快捷键来更改显示内容:

5.1 f 键选择显示内容

通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

5.2 o 键改变显示顺序

按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

5.3 F/O 键将进程按列排序

按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

(6)常用交互命令

从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
Ctrl+L 擦除并且重写屏幕。
h或者? 显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f或者F 从当前显示中添加或者删除项目。
o或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

(7)最后的技能:top 命令小技巧

1、输入大写P,则结果按CPU占用降序排序。
2、输入大写M,结果按内存占用降序排序。
3、按数字 1 则可以显示所有CPU核心的负载情况。
4、top -d 5    每隔 5 秒刷新一次,默认 1 秒
5、top -p 4360,4358    监控指定进程
6、top -U johndoe    ‘U’为 真实/有效/保存/文件系统用户名。
7、top -u 500    ‘u’为有效用户标识
8、top -bn 1    显示所有进程信息,top -n 1 只显示一屏信息,供管道调用
9、top -M   #show memory summary in megabytes not kilobytes
10、top -p 25097 -n 1 -b    # -b 避免输出控制字符,管道调用出现乱码
11、top翻页:top -bn1 | less
12、增强版的 top:htop ,一个更加强大的交互式进程管理器:

File:Htop.png

附:进程相关基础知识

内存

内存基础

通常包含物理内存和虚拟内存(virtual Memory ),好处是通过物理内存(RAM) 和部分硬盘空间(SWAP )组合增大了总体的内存空间,坏处是由于硬盘部分的虚拟内存的性能有限,并且RAM 和SWAP之间交换增加了系统的负担。 

1.  [phoenix.lif@aliadmin036158 ~]$ free

2.               total       used       free     shared    buffers     cached

3.  Mem:        7680000      7504764       175236            0       490772      3193856

4.  -/+ buffers/cache:     3820136      3859864

5.  Swap:       2096472           88      2096384

其中,Mem :  

(1) Total 为总的物理内存;

(2) Used 表示总计分配给缓存使用的数量(即buffers 和cache ,但可能部分还未实际使用);

(3)Free 表示未被分配的内存;

(4)share 表示共享内存,一般不会使用;

(5)buffers :表示系统分配但未被使用的buffers 数量;

(6)Cached :表示系统分配但未被使用的cache 数量。后面详细说明buffer 和cache 的区别。

-/+ buffers/cache:

(1)Used 表示实际使用的buffers 和cache 总量,即实际使用内存总量;

(2)Free 未被使用的buffer ,cache 及未被分配的内存之和,即系统可用内存。

Swap:  虚拟内存。如果系统物理内存用完了,但是仍有虚拟内存系统仍然可以运行虽然运行很慢;但是如果Swap 也用完了,系统就会发生错误,通常会出现”application is out of memory” 的错误,严重时造成系统死锁。通常Swap 空间分配为物理内存的2-2.5 倍,但也不用完全按照这个标准,如确定内存完全够用也没必要分配太多,我们线上的服务器就没有分配太多的Swap 空间。

tips:

实际可用内存:Free(-/+ buffers/cache) = Free(Mem)+buffers(Mem)+Cached(Mem);

已分配内存:Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)

物理内存总大小:total (Mem ) = used(-/+ buffers/cache) + free(-/+ buffers/cache)

Buffers & Cache

在 Linux 的实现中,文件 Cache 分为两个层面,一是 Page Cache ,另一个 Buffer Cache ,每一个Page Cache 包含若干 Buffer Cache 。内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收。buffer cache 是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk 的缓冲区。

磁盘操作有逻辑级(文件系统)和物理级(磁盘块),这两种缓存分别是缓存逻辑和物理级数据的。如我们进行的是文件系统操作,那么文件被缓存到Page Cache ,如需要刷新文件的时候,Page Cache 将交给Buffer Cache 去完成,因为Buffer Cache 是缓存磁盘块的。即直接去操作文件就是使用Page Cache ,用dd 等命令直接操作磁盘块,就是buffer cache 缓存。

(8)Refer:

http://www.linuxidc.com/Linux/2011-03/33582.htm

http://os.51cto.com/art/201012/240719.htm

http://www.kernelhardware.org/linux-top-command/

http://unix.stackexchange.com/questions/18918/in-linux-top-command-what-are-us-sy-ni-id-wa-hi-si-and-st-for-cpu-usage

http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html

http://www.taobaotest.com/blogs/qa?bid=2265    linux命令free详解

http://blogread.cn/it/article/6386?f=wb    top使用技巧

http://yikebocai.com/2014/11/cpu-load-too-high/    CPU Load过高问题分析和解决方案

https://github.com/oldratlee/useful-scripts    useful-scripts:打印 java 占用资源高的线程

http://newslxw.iteye.com/blog/1495565    一篇很好的linux下内存,IO解析文章

http://alanwu.blog.51cto.com/3652632/1122077    Buffer cache和page cache的区别

http://www.penglixun.com/tech/system/the_diffrents_of_page_cache_and_buffer_cache.html    Page Cache和Buffer Cache的区别

http://csrd.aliapp.com/?p=13    The Page Cache FAQ(v0.1,欢迎补充与拍砖)

http://www.techug.com/4-process-manage-tools    Linux 进程管理之四大名捕

转自:http://blog.chinaunix.net/uid-25776631-id-5784283.html

技术笔记(小潘的技术记录博客)