用JNI写一个例子关于Linux的inotify监控文件被修改_TCP

常用命令[]

cp

Copy

mv

移动、重命名

yum

yum nstall xxx

rm

rm –rf xx

mkdir

建目录

rpm

rpm –ivh xxx.rpm

tail

tail –f rr.log

find

find /usr/local -name xxx

tar

①tar xzvf xxxx.ta.gz

rz

上传文件

sz

下载

②cd xxx

./configure

./configure –prefix=/user/local[指定目录]加参数

wc

行、字、字节数

chmod

chmod 777 –R xxx

head

head -3 sqlq.log


 

ps

ps –ef|more

kill

ps -ef | grep xx

kill -9 [xxPID]

③make && make install

grep

查找

 

 

 


 

 

 

vi /etc/profile 最下面配置环境变量

 

 

 

2.影响性能的因素

因素1:cpu

因素factor

指标metrics

描述

备注

监测monitor

CPU

/proc/cpuinfo

Load average

等待执行的队列中进程数+

等待uninterruptable task完成的进程数

cpu负荷的趋势.

top

Procs

Run queue

Runnable,ready to run(running / waiting for runtime)的进程数【可执行未执行的】

 

vmstat(r)

Blocked

uninterruptible wait(通常因IO)进程数

 

vmstat(b)

System

Context Switch

线程的切换

减少程序无关的请求

vmstat(cs)

Interrupts

正在处理的中断数:

(hi)Hard interrupts、(si)soft interrupts

 

top (cpu--hi、si)

vmstat(in)

cpu

利用率

User time

处理非内核操作的时间

User%+sys%

好(<70%)一般(85%)糟糕(>=90)

top

vmstat

iostat(avg-cpu)

 

System time

处理内核操作的时间

Waiting

等待io完成的时间

 

Idle time

空闲时间

<5%-à充分利用

Nice time

处理re-nicing进程的时间

 

iostat(nice%)

CPU影响大是最误区,因为服务器的cpu一般是overconfigured。除非一些cpu密集使用的应用。

简单解决方法

        如果有多余的进程,可以ps –ef来停掉

                   CPU-intensive的进程,可以renice调整优先级

              SMP-based使用taskset来将进程绑定cpu,避免来回切换

              最新驱动和防火墙,减少对cpu的负载。

案例:CPU高的分析

1、us%  or sy%高,使用命令top;

1.1.1 、us%高,看看是哪个任务/线程的占用高,使用top排序或者ps –ef查看

1.1.2、了解线程的作用,可使用strace 查看该进程的执行情况,分析是否有异常,是否需要调整。

1.2.1、sy%高,查看memory、io方面性能,使用vmstat、iostat命令。

1.2.2、memory方面的问题,考虑是否要调整这方面的参数或增加内存

1.2.2、io方面的问题,考虑是否要增加快速的磁盘驱动等解决方案。

1.2.3、也要查看进程的占用情况,用strace查看该进程的执行情况,分析是否有异常,是否需要调整。

 

因素2:内存

因素factor

指标metrics

描述

监测monitor

备注

Memory

/proc/meminfo

Free memory

Linux把未使用的内存作为buffer和cache。

top(mem-free)

vmstat(free)

 

Swap usage (si、so)

使用的swap space。

physical memory用完后,

将最近使用过,暂不使用的memory pages

从physical memory写到swap space。

表示剩余的可支配物理内存严重不足,需要通过与磁盘交换内容来保持系统稳定性;磁盘处理速度要远小于内存,值越大性能瓶颈越明显。

top(swap-used)

vmstat(swpd)

si 、so[à0好]:

swap频繁程度,长期很大,表示内存不够or未有效利用内存

Buffer

不同步设备、优先级不同的设备间缓存

top(mem-buffers)

vmstat(buffer)

 

Cache

Cpu和主内存间高速文件缓存(cpu刚用过或循环使用的部分数据,cpu再用时就从cache调用)

top(swap-cached)

vmstat(cache)

 

Slabs

内核使用

vmstat –m

 

Active\inactive memory

活跃和不活跃的内存大小

vmstat -a

 

瓶颈表现

free↓,swpd↑(si、so↑),bi 、bo↑,in↑,cs↑、b↑,wa↑

测试期间,保持内存充足,可用内存>20%

简单解决方法

        调整swap space,使用大页面,大块内存,共享内存;

              调整页面的大小;

              改进对活动和非活动内存的处理;

              调整换页率page-out rate.;

              限制服务器上每个用户的可用资源;

              停掉不需要的服务;             增加内存;

 

 

因素3:I/O

因素

指标metrics

描述

监测monitor

I/O

 

等待

iowait

等待io操作的时间

好(<20%)一般(=35%)糟糕(>=50%)

iostat(avg-cpu:iowait)

Average wait

实际的io操作时间svctm +

+在io队列中等待时间

Svctm越接近awai越好

iostat –x  (await)

Average queue length

Io请求队列长度

iostat –x  (avgqu-sz)

请求数

Tps

每秒处理的io操作数量。

iostat (tps)

r/s、w/s

每秒读、写请求数

iostat –x(r/s 、w/s)

或用rrqm/s 、wrqm/s(合并请求)考察

数据量

bi、bo

读、写磁盘的块数(block/s)

vmstat(bi、bo)

iostat(Blk_read、BLk_wrtn)

或用kb、mb做单位考察总读写量

KB r/s、KB w/s

每秒对设备读、写数量Kb/s

iostat (Kb_read/s、Kb_wrtn/s)

或用MB、块、扇区做单位考察每秒读写量

瓶颈表现

%util)设备繁忙、(await>>svctm)IO请求等待时间长,(avgqu-sz)等待队列长度大。

简单解决方法

        少量的大容量磁盘、减少逻辑盘;

                   序列式且控制器的带宽压力大,添加更快的磁盘控制器;随机式,增加磁盘驱动;

                   Raid环境中,添加磁盘驱动;                  增加RAM;

 

 

 

因素4:Network

因素factor

指标metrics

描述

备注

监测monitor

Network

 

收、发送的包数

 

 

 

收、发送的字节数

 

 

每秒冲突数

 

 

掉包的数量

 

 

Overruns

 

 

Errors

 

 

查看网络流量

watch –n 1 “/sbin/ifconfig eth0|grep bytes”

 

外网:

tx 发送[transport]

rx 接收[receive]

内网相反。

date;ifconfig eth0    显示当前日期下网卡网络情况

 

简单解决方法

   调整网络配置;  换网卡、加更快的网卡。     

   修改ipv4 tcp的内核参数;            

案例:大量TIME_WAIT连接

使用netstat  –ae|grep  “TIME_WAIT”|wc  –l  #查看多少个TIME_WAIT

 

[往往是因为程序代码中未关闭mysql连接netstat -ae |grep mysql]。

解决方法:

调整内核参数:vi /etc/sysctl.conf

加入以下内容, 修改后,执行/sbin/sysctl –p 让参数生效:

net.ipv4.tcp_syncookies=1

#开启SYN Cookies。当SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认0(关闭)

net.ipv4.tcp_tw_reuse=1     #开启重用。允许将TIME-WAIT socket重用于新的TCP连接,默认0(关闭)

net.ipv4.tcp_tw_recycle=1               #开始TCP连接中TIME-WAIT socket的快递回收,默认0(关闭)

net.ipv4.tcp_fin_timeout=30                     #修改系统默认的TIME_OUT时间

net.ipv4.tcp_keepalive_probes=5            #减少超时前的探测次数

net.ipv4.tcp_keepalive_intvl=20               #探测消息发送频率

net.ipv4.tcp_keepalive_time=1200

#表示当keepalive启用时,TCP发送的keepalive消息的频率。缺省值为2小时,修改为2分钟。

net.ipv4.ip_local_port_range=1024 65000

#用于向外连接的端口范围。缺省情况很小为32768到61000,改为1024到65000

net.ipv4.tcp_max_syn_backlog=8192

#SYN队列的长度,默认为1024,加大了队列的长度为8192,可容纳更多等待连接的网络连接数

net.ipv4.tcp_max_tw_buckets=5000

#同时保持TIME_WAIT的最大数量,如超出,立刻清除TIME_WAIT、打印警告信息。默认180000,改为5000

3.监测性能指标的工具

Use the monitoring tools to to narrow down the bottleneck to the subsystem level.

工具1:top命令

top

动态\实时的运行情况

当前活跃的进程信息

参数:top –u root(看这user是这root的)、top –p 123(看pid123的)

汇总信息

运行时间

Load average

当前时间\运行时间\用户数

平均负载(1min、5min、15min),后两个时间段是重要的

task和cpu

Task:running; sleeping; stopped; zombie

cpu间隔内情况,多核(按1):

us、sy、id、wa、ni、hi(硬件中断)、si(软件中断)、st(stolen)

Memory Usage

物理内存和虚拟内存情况

输入行

k:kill

r:renice(调整任务优先级)

o:列的顺序

f:显示哪些列

u:筛选user

i:忽略空闲和僵死进程

M:驻留内存大小(res)排序

P: %cpu排序

T: time排序

q:quit

A:

S:

列和Task

PID

PPID

S

进程id

父进程id

进程状态: D=不可中断的睡眠状态、R=运行、 S=睡眠

            T=跟踪/停止、Z=僵尸进程

COMMAND

命令名/命令行

UID

USER

RUSER

GROUP

进程所有者的用户id

进程所有者的用户名

Real user name

进程所有者的组名

PR

NI

优先级

nice值。负值表示高优先级,正值表示低优先级

%CPU

TIME

上次更新到现在的CPU时间占用百分比

进程使用的CPU时间总计,秒

%MEM

VIRT

SWAP

RES

CODE

DATA

进程使用的物理内存百分比

进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

进程使用的虚拟内存中,SWAP SPACE大小, kb。

进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

可执行代码占用的物理内存大小, kb

可执行代码以外的部分(数据段+栈)占用的物理内存大小, kb

nFLT

页面错误次数

nDRT

最后一次写入到现在,被修改过的页面数。

 

 

 

 

 

 

 

 

 

工具2:vmstat命令

vmstat

vmstat [options] [delay [count]]

第一个条是自开机到现在的平均值(不指定delay,仅显示此条)

下面的是delay时间间隔的抽样 ,procs、memory都是瞬时的情况

参数:vmstat –t(时间戳)

Procs

r

Runnable,ready to run(running / waiting for runtime)的进程数

B

uninterruptible wait(通常因为io)的进程数

Memory

swpd
使用的虚拟内存大小KB
free
空闲内存大小
Buff

被用作Buffer的内存大小

Cache

被用作cache的内存大小

Swap

si、so

磁盘分页到内存memory Swapped in 大小(kb/s)

内存分页到磁盘memory Swapped out 大小。si so 趋于0,内存状态较好。

Io

bi、bo

读、写磁盘的块数(block/s)

System

in、cs

每秒中断数

每秒上下文切换数

Cpu

us、sy、id、wa

Cpu时间%

St

Time stolen from a virtual machine

 

 

 

工具3:iostat命令

iostat

从开机到当前执行时刻的统计信息

参数:iostat –x(详细信息)

 

CPU

多核:平均

%user

Cpu处理非内核%

 

%nice

用户级别with a nice priority cpu使用%

 

%sys

内核使用cpu%

 

%idle

空闲时间的%

 

Device

Device

块设备名称

 

请求数

tps

对应设备的每秒Io请求数

 

rrqm/s

wrqm/s

每秒该设备的读、写请求被合并数

 

r/s、w/s

每秒读rio、写wio请求数

 

数据量

Blk_read/s

Blk_wrtn/s

Blk_read

BLk_wrtn

每秒读、写数据量(块数)。/读、写的总量。

Blk_read、BLk_wrtn从开机到现在 读写的总块数

 

块的大小:dumpe2fs –h /dev/sda1 |grep –F “Block size”

 

Kb_read/s

Kb_wrtn/s

Kb_read

Kb_wrtn

每秒读、写数据量(KB)/读、写的总量。----- iostat –k

rMB/s、wMB/s   (MB)              ----- iostat –m

 

rsec/s

Wsec/s

每秒读、写数据量(扇区

 

Avgrq-sz

每个io请求的平均扇区数。

 

等待

await

r_await

w_await

平均每次设备i/o等待和操作的时间。

 

 

svctm

平均每次设备io操作时间(接近await表示等待越少)

 

Avgqu-sz

平均io队列长度。

 

%util

设备繁忙程度(80%很忙)

 

工具4:strace命令

strace

被进程调用的系统调用的执行情况,定位异常的具体位置。

先使用top命令定位异常的进程

strace  –T –p [pid]

显示每次调用所耗时间

 

strace –c –p [pid]

strace –c find/etc –name xxx   (strace –c <command>)

 

 

统计每一系统调用的内核执行时间、次数和出错次数等

 

 

 

 

 

 

 

 

工具5:netstat命令

netstat

各种网络相关信息,如网络连接,路由表,Interface Statistics\masquerade连接

Active Internet connections

Recv-Q

Send-Q

接收但未做处理的字节数。

发送但还未被确认的字节数。

一般应是0。大于0表示正在队列中堆积数据

Active

UNIX domain sockets

Proto

Proto显示连接使用的协议(tcp udp )

RefCnt

RefCnt表示连接到本套接口上的进程号

Types

Types显示套接口的类型

State

socket状态:

LISTEN(服务端socket正在监听)ESTABLISHED(已建立连接)

SYN_SENT(发送连接请求后等待匹配)SYN_RECV(收到连接请求等连接请求的确认)

FIN_WAIT1(发送中断请求后,等中断确认),FIN_WAIT2(收到ack后,稍后中断)

TIME_WAIT(收到fin、 ack,socket等关闭对剩余数据包的处理后再回复中断确认)

CLOSE_WAIT(收到fin后回复了ack,由本地确认是否关闭连接)

CLOSING(都中断了,但还有数据传输)

LAST_ACK(被动关闭在发送了fin后,再等待对方的ack,收到ack后关闭连接)

CLOSED(没有任何连接状态)unknown(未知)

Path

Path表示连接到套接口的其它进程使用的路径名。

-a  (all)显示所有listen和non-listen,默认不显示listen

-t  (tcp)仅显示tcp相关选项;-u  (udp)仅显示udp相关选项

-n  拒绝显示别名,能显示数字的全部转化成数字。

 

-p  显示建立连接的pid和程序名    [root@centos0 xampp]# netstat -anp|grep mysql

-e  显示扩展信息,例如uid等netstat -ae |grep mysql

-s  按各个协议进行统计

-c  不停的刷新continuous listing。

 

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

 

ps命令

ps

详细的进程信息

Pstree\ \pmap

ps –elFL

F

Process flag

S

进程状态:

S=sleeping、R=runnig、T=stopped ortraced、D=interuptable sleep,Z=zombie

UID

PID

PPID

LWP

LWP[Light weight process,or thread]ID of the lwp being reported

C

Cpu利用率

NLWP

Number of lwps(threads)in the process

PRI

Priority of theprocess

NI

Niceness level

ADDR

Process address space【不显示的】

SZ

Code+data+stack 总的memory大小(kb)

WCHAN

Sleeping的Kernel function名。- 进程为运行,*多线程

RSS

驻留集大小、non-swapped物理内存使用大小

PSR

Processor that process is currently assigned to.

STIME

本次开始的时间

TTY

终端

TIME

自动启动占用的cpu时间

CMD

开启命令(有参数)

Ps –A :显示正在运行的所有进程

工具6:Iptraf使用(待整理)

工具7:spotlight on linux使用(待整理)

各种命令

 

 

用JNI写一个例子关于Linux的inotify监控文件被修改_TCP_02

 

 

4.调优(还没有熟悉)

注:一点一点的调,调了用同一方式来衡量性能改变情况

         修改各项配置相关信息前,要备份。记录每次修改,尤其是会影响其他方面的修改。

不要在生产环境调

调优完成后,继续监测其它指标,直到达到性能目标

调优后再评估性能情况,和基准对比。

ulimit调整内核参数

ulimit –a #用来显示当前的各种用户进程限制。linux对每个用户、系统限制了最大的进程数。

vi /etc/profile

ulimit –u 10000 #用户的最大进程数

ulimit –n 4096 #每个进程可以打开的文件数

ulimit –d unlimited #数据段长度

ulimit –m unlimited #最大内存大小

ulimit –s unlimited #堆栈的大小

ulimit –t unlimited #cpu时间

ulimit –v unlimited#虚拟内存

limits.conf

解除linux系统的最大进程数和最大文件打开限制

vi /etc/security/limits.conf,添加以下内容,注意添加完成后重启

*代表所有用户,也可以指定用户;noproc 代表最大的进程数;nofile 代表最大文件打开数

* soft noproc 11000

*hard noproc 11000

*soft nofile 8192

*hard nofile 20480

 

 

 

 

 

命令: show status like '%下面变量%';

Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量.

Aborted_connects 尝试已经失败的MySQL服务器的连接的次数.

Connections 试图连接MySQL服务器的次数.

Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量.

Delayed_insert_threads 正在使用的延迟插入处理器线程的数量.

Delayed_writes 用INSERT DELAYED写入的行数.

Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数.

Flush_commands 执行FLUSH命令的次数.

Handler_delete 请求从一张表中删除行的次数.

Handler_read_first 请求读入表中第一行的次数.

Handler_read_key 请求数字基于键读行.

Handler_read_next 请求读入基于一个键的一行的次数.

Handler_read_rnd 请求读入基于一个固定位置的一行的次数.

Handler_update 请求更新表中一行的次数.

Handler_write 请求向表中插入一行的次数.

Key_blocks_used 用于关键字缓存的块的数量.

Key_read_requests 请求从缓存读入一个键值的次数.

Key_reads 从磁盘物理读入一个键值的次数.

Key_write_requests 请求将一个关键字块写入缓存次数.

Key_writes 将一个键值块物理写入磁盘的次数.

Max_used_connections 同时使用的连接的最大数目.

Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块.

Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量.

Open_tables 打开表的数量.

Open_files 打开文件的数量.

Open_streams 打开流的数量(主要用于日志记载)

Opened_tables 已经打开的表的数量.

Questions 发往服务器的查询的数量.

Slow_queries 要花超过long_query_time时间的查询数量.

Threads_connected 当前打开的连接的数量.

Threads_running 不在睡眠的线程数量.

Uptime 服务器工作了多少秒.

 


影响性能的因素
因素1:CPU。
指标度量。
平均负载。
运行队列。
阻止。
上下文切换。
中断。
用户时间。
系统时间。