最近做了系统的性能优化,因为是第一次做,很多地方不太熟悉,在做完本次的性能优化之后,系统的性能提升一倍,对于优化的过程中遇见的问题和使用的linux做一次总结。
一、Linux查看端口、进程以及kill进程
查看端口 :ps -aux|greo tomcat
如果没有8080的端口号,可查看所有进程和端口的使用情况,使用命令:netstat -apn
发现下面的进程列表,其中最后一栏是PID/Program name
发现8080端口被PID为9658的Java进程占用
进一步使用命令:ps -ef|grep java ,或者直接:ps -aux|grep pid 查看
就可以明确知道8080端口是被哪个程序占用掉了,然后判断是否使用kill命令干掉!
方法二:直接使用 netstat -apn|grep portno 即 :netstat -apn|grep 8080
查看进程:
1、ps命令用于查看当前正在运行的进程
grep是搜索
例如:ps -ef|grep java
表示查看所有进程里cmd是java的进程信息
2、ps -aux|grep java
-aux 显示所有状态
ps
3、kill 命令用于终止进程
例如:kill -9 [pid]
-9表示强迫进程立即停止
通常用ps 查看进程 PID,用kill命令终止进程
二、在优化的过程中,使用的db2数据库,数据库页太小报错
select * from tbproduct where model_flag != '1' order by prd_type,ta_code,prd_code,temp_flag
解决方案:
- 新建缓冲池:db2 “create bufferpool bp32k all nodes size -1 pagesize 32k”
- 新建表空间,表空间大小根据实际需求调整:db2 “create TEMPORARY tablespace TEMPORARY2 pagesize 32k managed by database using(file ‘表空间文件路径/ TEMPORARY2’ 50m) bufferpool bp2k”
注:表空间文件路径
使用命令:db2 list db directory
查看;如果第一步报错,可忽略,直接执行第二步
三、db2数据库查看性能命令(需要连接db2服务器的地址和端口):
db2top性能监控命令(找出最频繁,最耗时的sql):
连接数据库db2:db2 connect to 数据库名
db2top -d 数据库名 -u 用户名 -p 密码
按D ,进入动态sql监控
按z,倒序排序
输入列的数据,序号是从0开始
按L,输入sql的序号,查看sql明细
列出某个表的数据结构:db2describle table tbtransreq
四、oracle 查看sql耗时
--查询总耗时最多的前10条sql
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.elapsed_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10
--查看cpu消耗时间最多的前10条sql
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.cpu_time desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10
--查询消耗磁盘读取最多的前10条sql
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10
四、Linux调优方案,修改最大连接数 (ulimit 命令)
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户的最大进程数,
可以用 ulimit -a 来显示当前的各种用户进程限制。
下面我把某linux用户的最大进程数设置为10000个:
ulimit -u 10240
对于需要做许多socket连接并使他们处于打开状态的java应用程序而言,最好通过使用ulimit -n xx修改每个进程可打开的文件数,缺省值是1024。
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度 : ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
cpu时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
暂时地,适用于通过ulimit命令登录shell会话期间。
永久地,通过将一个相应的limit语句添加到由登录shell读取的文件中,即特定于shell的用户资源文件如:
1、解除Linux系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
#添加如下的行
*soft noproc 11000
*hard noproc 11000
上面两行可以用一行代替 *-noproc 11000
-的意思为soft和hard全部限制。
*soft nofile 4100
*hard nofile 4100
说明:*代表针对所有用户,noproc是代表最大进程数,nofile是代表最大文件打开数
2、让SSH接受Login程式的登入,方便在ssh客户端查看ulimit -a 资源限制:
a、vi /etc/ssh/sshd_config
把UserLogin的值改为yes,并把#注释去掉
b、重启sshd服务:/etc/init.d/sshd restart
3、修改所有linux用户的环境变量文件:
vi /etc/profile
ulimit -u 10000
ulimit -n 4096
ulimit -d unlimited
ulimit -m unlimited
ulimit -s unlimited
ulimit -t unlimited
ulimit -v unlimited
保存后运行#source /etc/profile 使其生效
有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a 可以看到)对于正常使用够了,但是对于程序来讲,就太少了。修改2个文件
1). /etc/security/limits.conf
vi /etc/security/limits.conf
加上:
*soft nofile 8192
*hard nofile 20480
2)./etc/pam.d/login
session required /lib/security/pam_limit.so
/********************************************************
另外确保 /etc/pam.d/system-auth文件有下面内容
session required /lib/security/$ISA/pam_limit.so
这一行确保系统会执行这个限制
/********************************************************
3).一般用户的.bash_profile
#ulimit -n 1024
重新登录OK
ulimit的作用
ulimit:显示(或设置)用户可以使用能够的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。
参数描述:
unlimited 不限制用户可以使用的资源,但本设置对可打开的最大文件数和可同时运行的最大进程数无效
-a 列出所有当前资源极限
-c 设置core文件的最大值,单位:blocks
-d 设置一个进程的数据段的最大值,单元:bytes
-f Shell创建文件的文件大小的最大值,单位:blocks
-h 指定设置某个给定资源的硬极限。如果用户拥有root用户权限,可以增大硬极限。任何用户均可减少硬极限
-l 可以锁住的物理内存的最大值
-m 可以使用的常驻内存的最大值,单位:kbytes
-n 每个进程可以同时打开 的最大文件数
-p 设置管道的最大值,单位为block,1block=512bytes
-s 指定堆栈的最大值,单位:kbytes
-S 指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和-S标识均未指定,极限适用于以上二者
-t 指定每个进程所使用的秒数,单位:seconds
-u可以运行的最大并发进程数
-v Shell可使用的最大的虚拟机内存,单位:kbytes