leadscloud

Google SEO|外贸营销推广

1
2
3
4
5
@echo off
echo 复制当前html到txt文件夹下,并且重命名为txt格式
ren *.html *.txt
md txt
copy *.html txt*.txt

把它保存为bat扩展的文件,放到当前目录下,运行即可。 把当前文件批量重命名为.txt

说明下:我的主机为 Centos 系统

vi apachemonitor.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash

URL=”http://127.0.0.1/”
curlit()
{
curl –connect-timeout 15 –max-time 20 –head –silent “$URL” | grep ’200′
# 上面的15是连接超时时间,若访问localhost的HTTP服务超过15s仍然没有正确响应200头代码,则判断为无法访问。
}
doit()
{
if ! curlit; then
# 如果localhost的apache服务没有正常返回200头,即出现异常。执行下述命令:
sleep 20
top -n 1 -b >> /var/log/apachemonitor.log
# 上面将top命令内容写入日至文件备查
/usr/bin/killall -9 apache2 && /usr/bin/killall -9 php5-cgi && /usr/bin/killall -9 httpd && /usr/bin/killall -9 http && /usr/bin/killall -9 apache && /usr/bin/killall -9 php-cgi > /dev/null
# 兼容起见,杀死了各种apache的进程。可以根据自己apache服务的特点修改
sleep 2
/etc/init.d/apache2 start > /dev/null
/etc/init.d/httpd start > /dev/null
# 兼容起见,执行了两种apache重启命令,可根据需要自己修改。
echo $(date) “Apache Restart” >> /var/log/apachemonitor.log
# 写入日志
sleep 30
# 重启完成后等待三十秒,然后再次尝试一次
if ! curlit; then
# 如果仍然无法访问,则:
echo $(date) “Failed! Now Reboot Computer!” >> /var/log/apachemonitor.log
# 写入apache依然重启失效的日志
reboot
# 重启机器呗。实际上重启整个服务器是一种非常不得已的做法。本人并不建议。大家根据需要自己修改,比如短信、邮件报警什么的。
fi
sleep 180
fi
}
sleep 300
# 运行脚本后5分钟后才开始正式工作(防止重启服务器后由于apache还没开始启动造成误判)
while true; do
# 主循环体
doit > /dev/null
sleep 10
done

然后执行: chmod +x apachemonitor.sh

添加开机启动项:

vi /etc/rc.d/rc.local

我的rc.local脚本内容为:

1
2
3
4
5
6
7
8
9

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/root/lampmonitor.sh

转载的,里面有些内容可以借用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
<?php
//curl类
class Curl
{
function Curl(){
return true;
}

function execute($method, $url, $fields='', $userAgent='', $httpHeaders='', $username='', $password=''){
$ch = Curl::create();
if(false === $ch){
return false;
}
if(is_string($url) && strlen($url)){
$ret = curl_setopt($ch, CURLOPT_URL, $url);
}else{
return false;
}
//是否显示头部信息
curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if($username != ''){
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
}
$method = strtolower($method);
if('post' == $method){
curl_setopt($ch, CURLOPT_POST, true);
if(is_array($fields)){
$sets = array();
foreach ($fields AS $key => $val){
$sets[] = $key . '=' . urlencode($val);
}
$fields = implode('&',$sets);
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
}else if('put' == $method){
curl_setopt($ch, CURLOPT_PUT, true);
}
//curl_setopt($ch, CURLOPT_PROGRESS, true);
//curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch, CURLOPT_MUTE, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);//设置curl超时秒数
if(strlen($userAgent)){
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
}
if(is_array($httpHeaders)){
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);
}
$ret = curl_exec($ch);
if(curl_errno($ch)){
curl_close($ch);
return array(curl_error($ch), curl_errno($ch));
}else{
curl_close($ch);
if(!is_string($ret) || !strlen($ret)){
return false;
}
return $ret;
}
}

function post($url, $fields, $userAgent = '', $httpHeaders = '', $username = '', $password = ''){
$ret = Curl::execute('POST', $url, $fields, $userAgent, $httpHeaders, $username, $password);
if(false === $ret){
return false;
}
if(is_array($ret)){
return false;
}
return $ret;
}

function get($url, $userAgent = '', $httpHeaders = '', $username = '', $password = ''){
$ret = Curl::execute('GET', $url, '', $userAgent, $httpHeaders, $username, $password);
if(false === $ret){
return false;
}
if(is_array($ret)){
return false;
}
return $ret;
}

function create(){
$ch = null;
if(!function_exists('curl_init')){
return false;
}
$ch = curl_init();
if(!is_resource($ch)){
return false;
}
return $ch;
}
}
?>

GET用法:

1
2
$curl = new Curl();
$curl->get('http://www.hdj.me/');

POST用法

1
2
$curl = new Curl();
$curl->get('http://www.hdj.me/', 'p=1&time=0');

原文:http://www.hdj.me/curl-class-php

自己手工安装的lamp,所以需要有个脚本来控制服务器的停止与启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# Check if user is root
if [ $(id -u) != "0" ]; then
printf "Error: You must be root to run this script!\n"
exit 1
fi

HOSTNAME=`hostname`
MYSQLPIDFILE=/usr/local/mysql/data/$HOSTNAME.pid
APACHENAME=httpd
APACHEPIDFILE=/usr/local/apache/logs/$APACHENAME.pid

function_start()
{
printf "Starting LAMP...\n"

/etc/init.d/httpd start

if [ -f $MYSQLPIDFILE ]; then
printf "MySQL is runing!\n"
else
/etc/init.d/mysqld start
printf "MySQL start successfully!\n"
fi
}

function_stop()
{
printf "Stoping LAMP...\n"

/etc/init.d/httpd stop

if [ -f $MYSQLPIDFILE ]; then
/etc/init.d/mysqld stop
printf "MySQL program is stop\n"
else
printf "MySQL program is not runing!\n"
fi
}

function_reload()
{
printf "Reload LAMP...\n"
/etc/init.d/mysqld reload
/etc/init.d/httpd restart
}

function_restart()
{
printf "Restart LAMP...\n"
/etc/init.d/mysqld restart
/etc/init.d/httpd restart
}
function_kill()
{
kill `cat $APACHEPIDFILE`
kill `cat $MYSQLPIDFILE`
}
function_status()
{
/etc/init.d/httpd status
/etc/init.d/mysqld status
}

case "$1" in
start)
function_start
;;
stop)
function_stop
;;
restart)
function_stop
function_start
;;
reload)
function_reload
;;
kill)
function_kill
;;
status)
function_status
;;
*)
printf "Usage: /root/lamp {start|stop|reload|restart|kill|status}\n"
esac
exit

LNMP一键安装包安装的MySQL默认是开启了日志文件的,如果数据操作比较频繁就会产生大量的日志,在/usr/local/mysql/var/下面产生mysql-bin.0000* 类似的文件,而且一般都在几十MB到几个GB,更甚会吃掉整个硬盘空间,从来导致mysql无法启动或报错,如vps论坛用户的反馈

如何关闭MySQL的日志功能:

删除日志:

 

执行:/usr/local/mysql/bin/mysql -u root -p

输入密码登录后再执行:reset master;

再输入:quit 退出mysql命令模式。

彻底禁用MySQL日志:修改/etc/my.cnf 文件,找到

log-bin=mysql-bin
binlog_format=mixed

再这两行前面加上**#**,将其注释掉,再执行/etc/init.d/mysql restart即可。

注意如果你只注释:#log-bin=mysql-bin 重启mysql会出错错误: You need to use –log-bin to make –binlog-format work.

所以请把这两行都注释掉。

本文以LNMP一件安装包安装的环境为例除MySQL重启命令和配置文件路径可能略有不同,其他一样。

原文:http://www.vpser.net/manage/delete-mysql-mysql-bin-0000-logs.html

其它关闭方法

编辑 /etc/my.cnf

[mysqld] 最下面添加:skip-log-bin

重启mysql

1
[root@localhost ~]# /etc/init.d/mysqld restart

查看是否成功

1
show variables like 'log_bin';

最近VPS上有个网站总是挂掉,应该是耗CPU太厉害了。因为是 wordpress mu 站。 但是重启httpd时,总是不成功。

提示 httpd dead but pid file exists

解决办法:

1
tails -n 20 /var/log/httpd/error_log

查看日志,看有什么错误 ,我的错误显示:

1
[Mon Jun 25 17:54:02 2012] [emerg] (28)No space left on device: Couldn't create accept lock (/usr/local/apache/logs/accept.lock.3610) (5)

解决办法:http://carlosrivero.com/fix-apache---no-space-left-on-device-couldnt-create-accept-lock

1
2
3
ipcs -s | grep apache | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

ipcs -s | grep apache | perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

然后再试试: service httpd start 应该就没问题了

网站又被别人注入恶意代码,在Google站长工具里会有提示,说我的网站被重定向到一个恶意网站上。

分析了自己的网站以前被注入恶意代码的过程,可以帮助一些人更快的找到它,并清除这些恶意代码。

我的网站是wordpress的,以前因为使用了timthumb, 由于它本身的漏洞,导致网站代码被随意更改。修复后,已经很少出现文件被修改情况。

一般一个网站被提示恶意代码,可以按以下步骤操作:

了解恶意代码的几种类型:

*恶意脚本

*.htaccess 重定向

*隐藏的 iframes

先查看网页源代码,看看有没有奇怪的script代码,如果有删除它。

然后再下载你的.htaccess, 看看有没有被人修改。

我一般都在ftp里,看文件的最近修改时间,如果在最近一段时间被人修改了,自己又没动什么,就可以确定是被别人恶意修改的。

更多信息:

http://www.stopbadware.org/home/security

PHP如何开启curl函数?

如果你使用的是XAMPP, 在安装目录下面的,php文件夹下。找到php.ini ,查找 php_curl.dll ,把前的注释 分号(;)去掉即可。

File_get_contents函数找开https url 时,会提示错误,没有安装openssl支持远程打开https文件。 如何解决?

找到php.ini 加上这段代码,或把此代码前面的注释去掉,XAMPP没有这句话,加上去即可。 把;extension=php_openssl.dll 改为 extension=php_openssl.dll

或者直接加上 extension=php_openssl.dll

一、last 命令

last    显示系统开机以来获是从每月初登入者的讯息
-R  省略 hostname 的栏位
-num 展示前 num 个  如:last -3  展示前三行
username 展示 username 的登入讯息
tty 限制登入讯息包含终端机代号

范例:

1
2
3
4
[root@elain ~]# last -R -2
root     pts/0        Fri Oct 22 14:23   still logged in
root     pts/0        Fri Oct 22 12:10 - 14:23  (02:13)
wtmp begins Sat Sep  4 00:38:05 2010
1
2
3
4
[root@elain ~]# last -2 root
root     pts/0        192.168.8.87     Fri Oct 22 14:23   still logged in
root     pts/0        192.168.8.87     Fri Oct 22 12:10 - 14:23  (02:13)
wtmp begins Sat Sep  4 00:38:05 2010

二、top 命令

top    是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

1
2
3
4
5
6
7
8
9
10
11
top - 14:34:14 up 4 days, 16:202 users,  load average: 0.56, 0.23, 0.32
Tasks75 total,   1 running,  74 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.8%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1026824k total,   917580k used,   109244k free,   124708k buffers
Swap2096472k total,        0k used,  2096472k free,   664320k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3078 root      15   0 12720 1032  8000.7  0.1   0:00.02 top
2463 root      16   0 10232  676  5840.3  0.1   1:33.69 hald-addon-stor
1 root      15   0 10352  692  5840.0  0.1   0:00.61 init
2 root      RT  -5     0    0    00.0  0.0   0:00.35 migration/0
3 root      34  19     0    0    00.0  0.0   0:00.00 ksoftirqd/0

统计信息区前五行是系统整体的统计信息。

第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

14:34:14      当前时间
up 4 days      系统已运行时间
2 users              当前登录用户数
0.56, 0.23, 0.32  系统负载,即任务队列的平均长度。三个数值分别为1分钟、5分钟、15分钟前到现在的平均值。

第二行为进程信息,内容如下:

Tasks:  75 total    进程总数
1 running            正在运行的进程数
74 sleeping            睡眠的进程数
0 stopped            停止的进程数
0 zombie            僵尸进程数

第三行为CPU信息,当有多个CPU时,这些内容可能会超过两行。内容如下:

Cpu(s):  0.0%us            用户空间占用CPU百分比
0.0% sy                    内核空间占用CPU百分比
0.0% ni                    用户进程空间内改变过优先级的进程占用CPU百分比
98.8% id            空闲CPU百分比
0.2% wa                    等待输入输出(IO)的CPU时间百分比
0.0% hi                    cpu处理硬件中断的时间;
0.0% si                 cpu处理软中断的时间;

第四行为内存信息,内容如下:

Mem: 1026824k total      物理内存总量
917580k used              使用的物理内存总量
109244k free               空闲内存总量
124708k buffers            用作内核缓存的内存量

第五行为SWAP信息

Swap: 2096472k total    交换区总量
2096472k free              空闲交换区总量
664320k cached            缓冲的交换区总量。

第六行往后是进程列表,常见的这几列的意义分别为:
PID(进程号), USER(运行用户),PR(优先级),NI(任务nice值),VIRT(虚拟内存用量),RES(物理内存用量),
SHR(共享内存用量),S(进程状态),%CPU(CPU占用比),%MEM(内存占用比),TIME+(累计CPU占用时间)。
除了这些信息之外,top还提供了很多命令能帮我们更好的解读这些信息,例如按”M”键可以按内存用量进行排序;
按”P”可以按CPU使用量进行排序,这样一来对于分析系统瓶颈很有帮助;此外,按“f”可以进入交互页面,选择指定的列显示,
例如可以按“b”选择显示PPID,再按一次“b”即可取消显示。”r”可以改变一个进程的nice值;”k”可以向一个进程发信号;
”z”可以使用彩色显示。进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号    列名    含义
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    进程状态。
x    COMMAND    命令名/命令行
y    WCHAN    若该进程在睡眠,则显示睡眠中的系统函数名
z    Flags    任务标志,参考 sched.h
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程

默认情况下仅显示比较重要的  PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND  列。可以通过下面的快捷键来更改显示内容。
更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z  即可显示或隐藏对应的列,最后按回车键确定。
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z  可以将相应的列向左移动。最后按回车键确定。
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的  R 键可以将当前的排序倒转。

三、free 命令

1
2
3
4
5
6
free
[root@elain ~]# free
total       used       free     shared    buffers     cached
Mem:       1026824     917764     109060          0     124908     664328
-/+ buffers/cache:     128528     898296
Swap:      2096472          0    2096472

第1行

total 内存总数: 1026824
used 已经使用的内存数: 917764
free 空闲的内存数: 109060
shared 当前已经废弃不用,总是0
buffers Buffer Cache内存数: 124908
cached Page Cache内存数:  664328

第2行

-/+ buffers/cache的意思相当于:
-buffers/cache 的内存数:1128528 (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 2752124 (等于第1行的 free + buffers + cached)

第3行

total 交换分区总数: 2096472
used 已经使用的: 0
free 空闲的数: 2096472
free -m    大小以M来显示

四、dstat 命令

1
2
yum install -y dstat
dstat
-c     显示CPU情况
-d     显示磁盘情况
-g     显示通信情况
-m     显示内存情况
-n     显示网络情况
-p     显示进程情况
-s     显示swap情况
-t     显示系统时钟
-y     显示系统统计
-f     使用 -C, -D, -I, -N and -S 显示
-v     使用-pmgdsc -D 显示
--ipc   报告IPC消息队列和信号量的使用情况
--lock  enable lock stats
--raw   enable raw stats
--tcp  enable tcp stats
--udp   enable udp stats
--unix   enable unix stats
--mods   stat1,stat2
--integer  show integer values Bbs.Svn8.Com
--nocolor  disable colors (implies --noupdate) Bbs.Svn8.Com
--noheaders 只显示一次表头以后就不显示了,使用重定向写入文件时很有用 Bbs.Svn8.Com
--noupdate  disable intermediate updates Svn中文网
--output file 写入到CVS文件中

推荐使用 date && dstat -tclmdny 60 一分钟监视一次(注意调节显示的宽度,或去掉-t选项)。

五、iostat 命令

# cat /proc/partitions

1
2
3
4
5
6
7
8
[root@elain ~]# cat /proc/partitions
major minor  #blocks  name
8     0      20971520 sda
8     1        200781 sda1
8     2       8193150 sda2
8     3       2096482 sda3
8     4             1 sda4
8     5      10474348 sda5
major: 主设备号。8 代表 sda。
minor: 次设备号。5 代表 No.5 分区。
`#blocks`: 设备总块数
name: 设备名称。如 sda3。
1
2
3
4
5
6
7
8
9
10
11
[root@elain ~]# iostat -x
Linux 2.6.18-194.11.3.el5 (elain)      20101022
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
0.17    0.10    0.12    0.05    0.00   99.55
Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.17     1.14  0.07  0.35     3.38    11.80    35.72     0.03   59.56   3.64   0.15
sda1              0.00     0.00  0.00  0.00     0.00     0.00    18.96     0.00    8.47   6.65   0.00
sda2              0.05     1.11  0.06  0.35     3.19    11.68    36.24     0.02   60.31   3.64   0.15
sda3              0.00     0.00  0.00  0.00     0.00     0.00    31.65     0.00    8.21   6.47   0.00
sda4              0.00     0.00  0.00  0.00     0.00     0.00     2.00     0.00    6.00   6.00   0.00
sda5              0.11     0.04  0.01  0.01     0.18     0.12    21.11     0.00   39.66   4.71   0.01

rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。
即 delta(use)/s/1000 (因为use的单位为毫秒)

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),
svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多
也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及
I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明
I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用
得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑
更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是
按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

六、vmstat 命令

vmstat 命令报告虚拟内存统计信息和CPU负荷:页面调度,交换,任务交换,CPU利用率。命令的语法是:

vmstat
-swap    现时可用的交换内存(k表示)
-free    空闲的内存(k表示)
-disk    显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
1
2
3
4
5
6
[root@elain ~]# vmstat 1 3 [一秒刷新一次 总共3次]
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 109036 123156 664444    0    0     1     3   37   12  0  0 100  0  0
0  0      0 109036 123156 664444    0    0     0     0 1022   28  0  0 100  0  0
0  0      0 109036 123156 664444    0    0     0     0 1003   17  0  0 100  0  0

如果 r经常大于 4 ,且id经常少于40[空闲CPU],表示cpu的负荷很重。

目前说来,对于服务器监控有用处的度量主要有:

r(运行队列)
us(用户CPU)
sy(系统CPU)
id(空闲)

通过VMSTAT识别CPU瓶颈

r(运行队列)展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了。
获得CPU个数的命令(LINUX环境):

cat /proc/cpuinfo|grep processor|wc -l

当r值超过了CPU个数,就会出现CPU瓶颈,解决办法大体几种:

1. 最简单的就是增加CPU个数
2. 通过调整任务执行时间,如大任务放到系统不繁忙的情况下进行执行,进尔平衡系统任务
3. 调整已有任务的优先级

通过VMSTAT识别CPU满负荷
首先需要声明一点的是,vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。
但要注意的是,CPU 满负荷工作并不能说明什么,UNIX总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r(运行队列)的值。
通过VMSTAT识别RAM瓶颈

数据库服务器都只有有限的RAM,出现内存争用现象是Oracle的常见问题。
首先察看RAM的数量,命令如下(LINUX环境):

1
2
3
4
5
[root@elain ~]# free
total       used       free     shared    buffers     cached
Mem:       1026824     918284     108540          0     123180     664448
-/+ buffers/cache:     130656     896168
Swap:      2096472          0    2096472

当然可以使用top等其他命令来显示RAM。

当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,
这样会出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,
但页导入操作就表明了服务器需要更多的内存了,页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。
解决的办法有几种:

1. 最简单的,加大RAM
2. 改小SGA,使得对RAM需求减少
3. 减少RAM的需求(如:减少PGA)

vmstat各项:
procs:
r–>在运行队列中等待的进程数
b–>在等待io的进程数
w–>可以进入运行队列但被替换的进程
memoy
swap–>现时可用的交换内存(k表示)
free–>空闲的内存(k表示)
pages
re--》回收的页面
mf--》非严重错误的页面
pi--》进入页面数(k表示)
po--》出页面数(k表示)
fr--》空余的页面数(k表示)
de--》提前读入的页面中的未命中数
sr--》通过时钟算法扫描的页面
disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
fault 显示每秒的中断数
in--》设备中断
sy--》系统中断
cy--》cpu交换
cpu 表示cpu的使用状态
cs--》用户进程使用的时间
sy--》系统进程使用的时间
id--》cpu空闲的时间
如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
如果pi,po 长期不等于0,表示内存不足。
如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。

七、mpstat 命令

mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。
在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat的语法如下:

1
2
3
4
[root@elain ~]# mpstat
Linux 2.6.18-194.11.3.el5 (elain)      20101022
161359秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
161359秒  all    0.17    0.10    0.07    0.05    0.02    0.03    0.00   99.56   1018.86

%user 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负 进程 (usr/total)*100
%nice 在internal时间段里,nice值为负进程的CPU时间(%)   (nice/total)*100
%sys  在internal时间段里,核心时间(%)   (system/total)*100
%iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
%irq 在internal时间段里,硬中断时间(%)      (irq/total)*100
%soft 在internal时间段里,软中断时间(%)    (softirq/total)*100
%idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%)(idle/total)*100
%intr/s 在internal时间段里,每秒CPU接收的中断的次数intr/total)*100

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre

其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。

实例: 每2秒产生了2个处理器的统计数据报告
下面的命令可以每2秒产生了2个处理器的统计数据报告,一共产生三个interval 的信息,然后再给出这三个interval的平
均信息。默认时,输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的
活跃状态。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@elain ~]# mpstat -P ALL 2 3
Linux 2.6.18-194.11.3.el5 (elain)      20101022

161743秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
161745秒  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00   1036.36
161745秒    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00   1036.36
161745秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00

161745秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
161747秒  all    0.00    0.00    0.00    0.00    0.00    0.25    0.00   99.75   1045.27
161747秒    0    0.00    0.00    0.00    0.00    0.50    0.00    0.00   99.50   1045.27
161747秒    1    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.50      0.00

161747秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
161749秒  all    0.00    0.00    0.25    0.50    0.00    0.00    0.00   99.25   1031.84
161749秒    0    0.00    0.00    0.50    1.49    0.00    0.00    0.00   98.01   1031.84
161749秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00

Average:     CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
Average:     all    0.00    0.00    0.08    0.17    0.00    0.08    0.00   99.67   1037.83
Average:       0    0.00    0.00    0.17    0.50    0.17    0.00    0.00   99.17   1037.83
Average:       1    0.17    0.00    0.00    0.00    0.00    0.00    0.00   99.83      0.00

八、sar 命令

该命令是系统维护 的重要工具,主要帮助我们掌握系统资源的使用情况,特别是内存和CPU 的使用情况, 是UNIX系统使用者应该掌握的工具之 一。

sar

1
2
3
4
5
6
7
8
9
10
11
12
-A:所有报告的总和。
-u:CPU利用率
-v:进程、I节点、文件和锁表状态。
-d:硬盘使用报告。
-r:没有使用的内存页面和硬盘块。
-g:串口I/O的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-R:进程的活动情况。
-y:终端设备活动情况。
-w:系统交换活动。

实例1:每60秒采样一次,连续采样5次,观察CPU的使用情况,并将采样结果以二进制形式存入当前目录下的文件/sar中,需键入如下命令:

1
2
3
4
5
6
7
8
9
[root@elain ~]# sar -u -o sar 60 5
Linux 2.6.18-194.11.3.el5 (elain)      20101022
162847秒       CPU     %user     %nice   %system   %iowait    %steal     %idle
162947秒       all      0.00      0.00      0.00      1.00      0.00     99.00
163047秒       all      0.00      0.00      0.00      1.00      0.00     99.00
163147秒       all      0.00      0.00      0.00      1.50      0.00     98.50
163247秒       all      0.00      0.00      0.00      1.00      0.00     99.00
163357秒       all      0.00      0.00      0.00      1.00      0.00     99.00
Average:          all      0.00      0.00      0.00      1.10      0.00     98.90

在显示内容包括:
%usr:   CPU处在用户模式下的时间百分比。
%sys:   CPU处在系统模式下的时间百分比。
%iowait: CPU等待输入输出完成时间的百分比。
%idle:  CPU空闲时间百分比。
我们应主要注意%wio%idle%wio的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高 但系统响应慢时,有可能是CPU等待分配内存,
此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要 解决的资源是CPU。

查看二进制文件sar中的内容,则需键入如下sar命令:

sar -u -f sar

实例2:每30秒采样一次,连续采样5次,观察核心表的状态,需键入如下命令:

1
2
3
4
5
6
7
8
9
[root@elain ~]# sar -v 30 5
Linux 2.6.18-194.11.3.el5 (elain)      20101022
163254秒 dentunusd   file-sz  inode-sz  super-sz %super-sz  dquot-sz %dquot-sz  rtsig-sz %rtsig-sz
163354秒     60602       510     50659         0      0.00         0      0.00         0      0.00
163454秒     60602       510     50659         0      0.00         0      0.00         0      0.00
163554秒     60602       510     50659         0      0.00         0      0.00         0      0.00
163654秒     60602       510     50659         0      0.00         0      0.00         0      0.00
163754秒     60602       510     50659         0      0.00         0      0.00         0      0.00
Average:        60602       510     50659         0      0.00         0      0.00         0      0.00

显示内容表示,核心使用完全正常,三个表没有出现溢出现象,核心参数不需调整,如果出现溢出时,要调整相应的核心参数,将对应的表项数加大。
小提示:
怀疑CPU存在瓶颈,可用sar -u 和sar -q来看,怀疑I/O存在 瓶颈,可用sar -b、sar -u和sar-d来看。

原文:http://blog.csdn.net/adparking/article/details/7440245

0、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

2、$row[’id’] 的速度是$row[id]的7倍。

3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

5、注销那些不用的变量尤其是大数组,以便释放内存。

6、尽量避免使用__get,__set,__autoload。

7、require_once()代价昂贵。

8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

10、函数代替正则表达式完成相同功能。

11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14、用@屏蔽错误消息的做法非常低效,极其低效。

15、打开apache的mod_deflate模块,可以提高网页的浏览速度。 gizp压缩

16、数据库连接当使用完毕时应关掉,不要用长连接。

17、错误消息代价昂贵。

18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

19、递增一个全局变量要比递增一个局部变量慢2倍。

20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

24、派生类中的方法运行起来要快于在基类中定义的同样的方法。

25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。xcache apc eaccelerator

29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”$$ }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”$$ }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

36、并非要用类实现所有的数据结构,数组也很有用。

37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

38、当你需要时,你总能把代码分解成方法。

39、尽量采用大量的PHP内置函数。

40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;

44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

48、多维数组尽量不要循环嵌套赋值;

49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

50、foreach效率更高,尽量用foreach代替while和for循环;

51、用单引号替代双引号引用字符串;

52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

53、对global变量,应该用完就unset()掉;

原文地址:http://blog.csdn.net/adparking/article/details/7440245

0%