[转载] FreeBSD 的 Ports 系统

什么是 Ports 系统

简单的讲,一个 port 就是一个被移植到了 FreeBSD 上的软件。所有这些软件的集合,加上 FreeBSD 处理这些软件的各种工具,就是 Ports 系统。
Ports 系统有什么用

每一个被移植到 FreeBSD 上的软件(就是 Port),都能通过 Ports 系统中的工具方便有序的安装,升级,卸载。而且符合 FreeBSD 系统对应用软件施加的各种规范。免去了你到处寻找软件,自己编译,安装,升级的麻烦。借助这些 ports 维护者的努力,你也不用担心这些软件与系统不兼容导致无法安装升级等等。
怎么安装 Ports 系统

有三种方法来安装 Ports 系统:
1 安装系统时选择安装 Ports 系统

这是最简单的方法,但是也有缺点。因为 Ports 系统总是随时更新的。因此你从安装光盘上安装的 Ports 系统肯定不是最新的了。
2 使用 portsnap 安装/同步 ports 系统

这是推荐的方法。使用portsnap不需要事先安装 ports tree,并且能够在任何时候恢复到已知的最新状态(即使手工对ports tree进行了修改)。

使用 portsnap 分成两个步骤:下载压缩的 portsnap 快照,和更新现有系统。下载或更新 portsnap 快照的方法是 portsnap fetch;首次安装,或希望将 ports tree 恢复到快照的样子,应使用 portsnap extract;之后更新系统中的 ports tree,则可以通过 portsnap update 来完成。对于服务器而言,推荐在 crontab 中增加在每天3点执行 portsnap cron,以减少使用时所需要的下载时间。

首次下载 portsnap 快照时,需要下载一个大约50MB的快照基础文件。在中国大陆,由于网络状况的原因,这可能需要较长时间。可以考虑用 portsnap fetch -s portsnap.cn.freebsd.org 做首次下载;之后的下载,还是推荐使用正常的 portsnap fetch。

可以使用下面步骤完成上述情况

1.首先设置一个比较快的portsnap服务器,如果系统默认的地址你的访问速度也很快,可以不修改

#vi /etc/portsnap.conf

设置SERVERNAME=portsnap.cn.freebsd.org ,你可以设置相对你速度快点的服务器的地址

2.执行下面命令

#portsnap fetch extract    这里直接下载ports并且解压

这样就完成了下载ports系统以及解压到/usr下面了

3.设置最快的ports镜像

用ports安装软件的时候,如果没有设置相对于你来说最快的ports服务器地址,那就会默认的 ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/,这个地址对于很多地方来说是很慢的。

修改 /etc/make.conf 加入以下代码

MASTER_SITE_OVERRIDE=\
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}\
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}

如果你有最快的地址,可以加到上面去,下载就会块了
3 使用 csup/cvsup 安装/同步 Ports 系统

这种方法已经不再推荐使用。

不管事先你有没有安装 Ports 系统,你都可以使用 csup/cvsup (推荐使用 csup,这是基本系统中自己带的)来安装/同步最新的 Ports 系统。把 /usr/share/examples/cvsup/ports-supfile 拷贝到一个地方(比如 /home/user/tmp/ports-supfile),然后作适当的修改(比如修改要连接的服务器)。最后使用如下命令来安装/同步:

csup -L 2 /home/user/tmp/ports-supfile

Ports 树的目录结构

假设你的 ports 树安装在默认位置 /usr/ports。

文件:

/usr/ports/CHANGES # ports 开发者、维护者等的记录文档。
/usr/ports/COPYRIGHT # ports 树的版权。
/usr/ports/GIDs # 一些 port 可能用到的组名称。
/usr/ports/INDEX-xxx # 每个 port 的摘要
/usr/ports/KNOBS # 编译 port 时需要的一些环境变量与解释。
/usr/ports/LEGAL # 某些 port 的协议限制。
/usr/ports/MOVED # 被移动/删除了的 port 列表。
/usr/ports/Makefile # ports 树总的 BSD Makefile。
/usr/ports/README
/usr/ports/UIDs # 一些 port 可能用到的用户名称。
/usr/ports/UPDATING # ports 树的更新记录以及建议。

目录:

/usr/ports/Mk # 编译 port 需要的 Makefile 集合。
/usr/ports/Templates # 一些模板。
/usr/ports/Tools # 一些工具。

除开以上文件和目录,其他所有的目录都是 ports。一个 port 的目录结构:

/usr/ports/分类/名称

比如 firefox 被分类在 www。因此 firefox 在 ports 树中的位置就是:

/usr/ports/www/firefox

使用 Ports 系统
1 查询

比如,你想知道 ports 中是否有 pidgin 这个软件,那么可以这样:

$cd /usr/ports
$make search key=pidgin

同样也可以使用

$cd /usr/ports
$make search name=pidgin

/usr/ports/README 中还有更多的例子可以参考。
2 安装

非常简单。比如你要安装 firefox,那么作为超级用户 root:

#cd /usr/ports/www/firefox
#make install clean

3 卸载

要卸载 firefox 的话:

#cd /usr/ports/www/firefox
#make deinstall clean

4 升级

要升级 firefox:

#cd /usr/ports/www/firefox
#make deinstall reinstall clean

定制 Ports 系统
1 自己设定 Ports 树的位置

当你把 Ports 树放在非默认位置(/usr/ports)的时候,就需要修改一些环境变量让 Ports 中的工具知道你的修改。这个变量就是 PORTSDIR。比如,你把 Ports 树放在了 /opt/ports,那么 在 sh/bash 中,执行如下命令:

export PORTSDIR=/opt/ports

在 csh 中,你需要执行如下命令:

setenv PORTSDIR /opt/ports

妥贴的办法是把这个环境变量放到超级用户 root 的 dot.cshrc 文件(/root/.cshrc)里面。又或者你想让普通用户也能用到这个环境变量,可以考虑放到 /etc/profile 或者 /etc/csh.cshrc 里面。

注意!如果你使用 portsnap 命令来同步 Ports 树,而你的 Ports 树不在默认位置,请在 /etc/portsnap.conf 中也设定你的 Ports 树的位置。

注意!如果你使用 csup/cvsup 同步 Ports 树,而你的 Ports 树不在默认位置,请在你的 ports-supfile 中也设定你的 Ports 树的位置。
2 自己设定 dist 文件的位置

所谓 dist 文件,就是 port 的源码。一般情况下,这些源码都是用 tar 打包然后用 bzip2 压缩的。默认的位置是在 $PORTSDIR/distfiles。但是,你也可以把这些 dist 文件放到另外的地方。需要设定的环境变量就是 DISTDIR。你可以根据上面的例子来设定这个环境变量。
常用的 Ports 管理工具
portsnap

这是推荐的升级 Ports 系统树的工具。
portupgrade

相当好用的升级 Ports 中软件的 Ruby 工具。支持从源码/包升级。
pkg 工具

FreeBSD 基本系统中自带的包管理工具。方便实用。都是 pkg_* 类型的系统命令,比如 pkg_add, pkg_delete 之类的。


通过PORTS安装软件的几个常用命令

1.怎样找到我想安装的包路径:# cd /usr/ports
# make search name=mysql

2.仅仅下载源码包,而不安装:

# cd /usr/ports/directory
# make fetch

3.预先知道需要那些包,才能安装这个软件:

# cd /usr/ports/directory
# make fetch-list

4.把软件装到指定的目录:

# cd /usr/ports/directory
# make PREFIX=/usr install

5.仅仅下载包,解包,而不安装:

# cd /usr/ports/directory
# make extract

6.用PORTS制作一个定制二进制包:

# cd /usr/ports/somewhere/frobble
# make extract
# cd work/frobble-2.8
[Apply your patches]
# cd ../..
# make package

7.强制安装:

# make install FORCE_PKG_REGISTER=yes clean

8.初始化一个port

# cd /usr/ports/directory
# make rmconfig
# make config

新手必杀技ports命令
cd /usr/ports
make deinstall
#删除所有软件,我刚用freebsd三个月的时候老使这个,删了安接着删…..费时费力哦,不推荐

cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports
make fetchindex
#别忘了使用ports安装软件前要升级ports系统啊,我现在天天用上边命令的脚本
#要是你没装cvsup,那就去装cd /usr/ports/net/cvsup-without-gui/ && make install

cd /usr/ports/sysutils/portupgrade
make install
#安装这个软件是新手省事而又带来新麻烦的好东西,尽管会带来一些新麻烦,但是还是推荐毕竟麻烦数量少了很多

rm -r /usr/ports
#损招、阴招,现在想不起来当初为什么要用这个命令,不推荐啊不推荐~~
#你要是用了找不到ports了,简单再用cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile命令就行了,费时费力

pkgdb -F
portversion | grep “<”
portupgrade -a
#安装了portupgrade套件之后可以使用的命令,好用啊推荐

pkg_info
#看看你都装什么软件了

portsclean -C
#不明原因就是编译不过八成因为这个,平常也请多用,能清理ports内的临时文件
#安装portupgrade套件之后才能使用
新手必杀技ports命令
cd /usr/ports
make deinstall
#删除所有软件,我刚用freebsd三个月的时候老使这个,删了安接着删…..费时费力哦,不推荐

cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports
make fetchindex
#别忘了使用ports安装软件前要升级ports系统啊,我现在天天用上边命令的脚本
#要是你没装cvsup,那就去装cd /usr/ports/net/cvsup-without-gui/ && make install

cd /usr/ports/sysutils/portupgrade
make install
#安装这个软件是新手省事而又带来新麻烦的好东西,尽管会带来一些新麻烦,但是还是推荐毕竟麻烦数量少了很多

rm -r /usr/ports
#损招、阴招,现在想不起来当初为什么要用这个命令,不推荐啊不推荐~~
#你要是用了找不到ports了,简单再用cvsup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/ports-supfile命令就行了,费时费力

pkgdb -F
portversion | grep “<”
portupgrade -a
#安装了portupgrade套件之后可以使用的命令,好用啊推荐

pkg_info
#看看你都装什么软件了

portsclean -C
#不明原因就是编译不过八成因为这个,平常也请多用,能清理ports内的临时文件
#安装portupgrade套件之后才能使用

Tags: ,

Leave a Comment

freebsd find命令使用参数

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍 一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。 Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。

1、vi的基本概念
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

1) 命令行模式command mode)

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。

2) 插入模式(Insert mode)

只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。

3) 底行模式(last line mode)

将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。

不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。

2、vi的基本操作
a) 进入vi

在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:

$ vi myfile

不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 「插入模式(Insert mode)」再说吧!

b) 切换至插入模式(Insert mode)编辑文件

在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。

c) Insert 的切换

您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。

d) 退出vi及保存文件

在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:

: w filename (输入 「w filename」将文章以指定的文件名filename保存)

: wq (输入「wq」,存盘并退出vi)

: q! (输入q!, 不存盘强制退出vi)

3、命令行模式(command mode)功能键
1). 插入模式

按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;

按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

2). 从插入模式切换为命令行模式

按「ESC」键。

3). 移动光标

vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。

按「ctrl」+「b」:屏幕往“后”移动一页。

按「ctrl」+「f」:屏幕往“前”移动一页。

按「ctrl」+「u」:屏幕往“后”移动半页。

按「ctrl」+「d」:屏幕往“前”移动半页。

按数字「0」:移到文章的开头。

按「G」:移动到文章的最后。

按「$」:移动到光标所在行的“行尾”。

按「^」:移动到光标所在行的“行首”

按「w」:光标跳到下个字的开头

按「e」:光标跳到下个字的字尾

按「b」:光标回到上个字的开头

按「#l」:光标移到该行的第#个位置,如:5l,56l。

4). 删除文字

「x」:每按一次,删除光标所在位置的“后面”一个字符。

「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。

「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。

「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。

「dd」:删除光标所在行。

「#dd」:从光标所在行开始删除#行

5). 复制

「yw」:将光标所在之处到字尾的字符复制到缓冲区中。

「#yw」:复制#个字到缓冲区

「yy」:复制光标所在行到缓冲区。

「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。

6). 替换

「r」:替换光标所在处的字符。

「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

7). 回复上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。

8). 更改

「cw」:更改光标所在处的字到字尾处

「c#w」:例如,「c3w」表示更改3个字

9). 跳至指定的行

「ctrl」+「g」列出光标所在行的行号。

「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

4、Last line mode下命令简介
在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。

A) 列出行号

「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。

B) 跳到文件中的某一行

「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。

C) 查找字符

「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。

「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

D) 保存文件

「w」:在冒号输入字母「w」就可以将文件保存起来。

E) 离开vi

「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。

「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

5、vi命令列表
1、下表列出命令模式下的一些键的功能:

h
左移光标一个字符

l
右移光标一个字符

k
光标上移一行

j
光标下移一行

^
光标移动至行首

0
数字“0”,光标移至文章的开头

G
光标移至文章的最后

$
光标移动至行尾

Ctrl+f
向前翻屏

Ctrl+b
向后翻屏

Ctrl+d
向前翻半屏

Ctrl+u
向后翻半屏

i
在光标位置前插入字符

a
在光标所在位置的后一个字符开始增加

o
插入新的一行,从行首开始输入

ESC
从输入状态退至命令状态

x
删除光标后面的字符

#x
删除光标后的#个字符

X
(大写X),删除光标前面的字符

#X
删除光标前面的#个字符

dd
删除光标所在的行

#dd
删除从光标所在行数的#行

yw
复制光标所在位置的一个字

#yw
复制光标所在位置的#个字

yy
复制光标所在位置的一行

#yy
复制从光标所在行数的#行

p
粘贴

u
取消操作

cw
更改光标所在位置的一个字

#cw
更改光标所在位置的#个字

2、下表列出行命令模式下的一些指令
w filename
储存正在编辑的文件为filename

wq filename
储存正在编辑的文件为filename,并退出vi

q!
放弃所有修改,退出vi

set nu
显示行号

/或?
查找,在/后输入要查找的内容

n
与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。

对于第一次用vi,有几点注意要提醒一下:
1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。
3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)

Tags: , , ,

Leave a Comment

[转载]SHELL技巧

看到这文章还真的好,WEB开发人员管理应该常用到吧,摘录下来:
原文URL:http://www.guhuai.com/?p=1331

1.删除0字节文件
find -type f -size 0 -exec rm -rf {} \;
2.查看进程
按内存从大到小排列
ps -e -o “%C : %p : %z : %a”|sort -k5 -nr
3.按cpu利用率从大到小排列
ps -e -o “%C : %p : %z : %a”|sort -nr
4.打印说cache里的URL
grep -r -a jpg /data/cache/* | strings | grep “http:” | awk -F’http:’ ‘{print “http:”$2;}’
5.查看http的并发请求数及其TCP连接状态:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
6. sed -i ‘/Root/s/no/yes/’ /etc/ssh/sshd_config sed在这个文里Root的一行,匹配Root一行,将no替换成yes.
7.1.如何杀掉mysql进程
ps aux|grep mysql|grep -v grep|awk ‘{print $2}’|xargs kill -9 (从中了解到awk的用途)
killall -TERM mysqld
kill -9 `cat /usr/local/apache2/logs/httpd.pid` 试试查杀进程PID

8.显示运行3级别开启的服务:
ls /etc/rc3.d/S* |cut -c 15- (从中了解到cut的用途,截取数据)
9.如何在编写SHELL显示多个信息,用EOF
cat
10. for 的巧用(如给mysql建软链接)
cd /usr/local/mysql/bin
for i in *
do ln /usr/local/mysql/bin/$i /usr/bin/$i
done
11. 取IP地址
ifconfig eth0 |grep “inet addr:” |awk ‘{print $2}’|cut -c 6- 或者
ifconfig | grep ‘inet addr:’| grep -v ‘127.0.0.1′ | cut -d: -f2 | awk ‘{ print $1}’
12.内存的大小:
free -m |grep “Mem” | awk ‘{print $2}’
13.
netstat -an -t | grep “:80″ | grep ESTABLISHED | awk ‘{printf “%s %s\n”,$5,$6}’ | sort
14.查看Apache的并发请求数及其TCP连接状态
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
15.因为同事要统计一下服务器下面所有的jpg的文件的大小,写了个shell给他来统计.原来用xargs实现,但他一次处理一部分,搞的有多个总和….,下面的命令就能解决啦.
find / -name *.jpg -exec wc -c {} \;|awk ‘{print $1}’|awk ‘{a+=$1}END{print a}’
CPU的数量(多核算多个CPU,cat /proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。
——————————————————————————————————————–
16 CPU负载 # cat /proc/loadavg
检查前三个输出值是否超过了系统逻辑CPU的4倍。
18 CPU负载 #mpstat 1 1
检查%idle是否过低(比如小于5%)
19 内存空间 # free
检查free值是否过低 也可以用 # cat /proc/meminfo
20 swap空间 # free
检查swap used值是否过高 如果swap used值过高,进一步检查swap动作是否频繁:
# vmstat 1 5
观察si和so值是否较大
21 磁盘空间 # df -h
检查是否有分区使用率(Use%)过高(比如超过90%) 如发现某个分区空间接近用尽,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录:
# du -cks * | sort -rn | head -n 10
22 磁盘I/O负载 # iostat -x 1 2
检查I/O使用率(%util)是否超过100%
23 网络负载 # sar -n DEV
检查网络流量(rxbyt/s, txbyt/s)是否过高
24 网络错误 # netstat -i
检查是否有网络错误(drop fifo colls carrier) 也可以用命令:# cat /proc/net/dev
25 网络连接数目 # netstat -an | grep -E “^(tcp)” | cut -c 68- | sort | uniq -c | sort -n
26 进程总数 # ps aux | wc -l
检查进程个数是否正常 (比如超过250)
27 可运行进程数目 # vmwtat 1 5
列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU的4倍
28 进程 # top -id 1
观察是否有异常进程出现
29 网络状态 检查DNS, 网关等是否可以正常连通
30 用户 # who | wc -l
检查登录用户是否过多 (比如超过50个) 也可以用命令:# uptime
31 系统日志 # cat /var/log/rflogview/*errors
检查是否有异常错误记录 也可以搜寻一些异常关键字,例如:
# grep -i error /var/log/messages
# grep -i fail /var/log/messages
32 核心日志 # dmesg
检查是否有异常错误记录
33 系统时间 # date
检查系统时间是否正确
34 打开文件数目 # lsof | wc -l
检查打开文件总数是否过多
35 日志 # logwatch –print 配置/etc/log.d/logwatch.conf,将 Mailto 设置为自己的email 地址,启动mail服务 (sendmail或者postfix),这样就可以每天收到日志报告了。
缺省logwatch只报告昨天的日志,可以用# logwatch –print –range all 获得所有的日志分析结果。
可以用# logwatch –print –detail high 获得更具体的日志分析结果(而不仅仅是出错日志)。
36.杀掉80端口相关的进程
lsof -i :80|grep -v “PID”|awk ‘{print “kill -9″,$2}’|sh
37.清除僵死进程
ps -eal | awk ‘{ if ($2 == “Z”) {print $4}}’ | kill -9
38.tcpdump 抓包 ,用来防止80端口被人攻击时可以分析数据
# tcpdump -c 10000 -i eth0 -n dst port 80 > /root/pkts
39.然后检查IP的重复数 并从小到大排序 注意 “-t\ +0″ 中间是两个空格
# less pkts | awk {’printf $3″\n”‘} | cut -d. -f 1-4 | sort | uniq -c | awk {’printf $1″ “$2″\n”‘} | sort -n -t\ +0
40.查看有多少个活动的php-cgi进程
netstat -anp | grep php-cgi | grep ^tcp | wc -l
chkconfig –list | awk ‘{if ($5==”3:on”) print $1}’
41.kudzu查看网卡型号
kudzu –probe –class=network

Tags: , ,

Leave a Comment

谈MYSQL limit的优化

今天,帮朋友优化一个网站,首先选择的就是从优化MySQL做起,添加了不少索引,后来发现有些索引居然没办法被使用,看了不少资料,解决了不少问题.然后和同事聊起关于select的优化,想起了之前看过的一篇Limit的优化,找到了下面的这文章,现在摘录下来:

转载正文如下

MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。
同样是取10条数据

select * from yanxue8_visit limit 10000,10

select * from yanxue8_visit limit 0,10
就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19)

1、offset比较小的时候。

select * from yanxue8_visit limit 10,10
多次运行,时间保持在0.0004-0.0005之间

Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10
多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。

2、offset大的时候。

select * from yanxue8_visit limit 10000,10
多次运行,时间保持在0.0187左右

Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10

多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

附上原文:

select * from table LIMIT 5,10; #返回第6-15行数据
select * from table LIMIT 5; #返回前5行
select * from table LIMIT 0,5; #返回前5行

性能优化:

基于MySQL5.0中limit的高性能,我对数据分页也重新有了新的认识.

1.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90001
) As tmp
) limit 100;

2.
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90000,1
) As tmp
) limit 100;

同样是取90000条后100条记录,第1句快还是第2句快?
第1句是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录
第2句择是仅仅取90000条记录后1条,然后取ID值作起始标识定位下100条记录
第1句执行结果.100 rows in set (0.23) sec
第2句执行结果.100 rows in set (0.19) sec

很明显第2句胜出.看来limit好像并不完全像我之前想象的那样做全表扫描返回limit offset+length条记录,这样看来limit比起MS-SQL的Top性能还是要提高不少的.

其实第2句完全可以简化成

Select * From cyclopedia Where ID>=(
Select ID From cyclopedia limit 90000,1
)limit 100;

直接利用第90000条记录的ID,不用经过Max运算,这样做理论上效率因该高一些,但在实际使用中几乎看不到效果,因为本身定位ID返回的就是1条记录,Max几乎不用运作就能得到结果,但这样写更清淅明朗,省去了画蛇那一足.

可是,既然MySQL有limit可以直接控制取出记录的位置,为什么不干脆用Select * From cyclopedia limit 90000,1呢?岂不更简洁?
这样想就错了,试了就知道,结果是:1 row in set (8.88) sec,怎么样,够吓人的吧,让我想起了昨天在4.1中比这还有过之的”高分”.Select * 最好不要随便用,要本着用什么,选什么的原则, Select的字段越多,字段数据量越大,速度就越慢. 上面2种分页方式哪种都比单写这1句强多了,虽然看起来好像查询的次数更多一些,但实际上是以较小的代价换取了高效的性能,是非常值得的.

第1种方案同样可用于MS-SQL,而且可能是最好的.因为靠主键ID来定位起始段总是最快的.

Select Top 100 * From cyclopedia Where ID>=(
Select Top 90001 Max(ID) From (
Select ID From cyclopedia Order By ID
) As tmp
)

但不管是实现方式是存贮过程还是直接代码中,瓶颈始终在于MS-SQL的TOP总是要返回前N个记录,这种情况在数据量不大时感受不深,但如果成百上千万,效率肯定会低下的.相比之下MySQL的limit就有优势的多,执行:
Select ID From cyclopedia limit 90000
Select ID From cyclopedia limit 90000,1
的结果分别是:
90000 rows in set (0.36) sec
1 row in set (0.06) sec
而MS-SQL只能用Select Top 90000 ID From cyclopedia 执行时间是390ms,执行同样的操作时间也不及MySQL的360ms.

个人测试分析:

这个例子非常经典,但个人感觉说明不详细,经分析,总结如下(其中,id为主键):
主要值得注意的有好几项:

第一:
SELECT * FROM tbl_name LIMIT 1000000,10
SELECT id FROM tbl_name LIMIT 1000000,10
第一条SQL没有能使用主键进行索引,而第二条则使用了,经测试,使用主键进行索引反而变慢,前者大约快一倍。
如果把第二条改为:
SELECT id FROM tbl_name IGNORE INDEX(primary) LIMIT 1000000,10

速度就一样了,因此,估计是因为多了对索引文件(这里是主键)的相关操作.不使用的话,就直接对主表进行扫描就行。

第二:
在第一点的基础上,加上ORDER BY,情况就完全不同了:
SELECT * FROM tbl_name ORDER BY id DESC LIMIT 1000000,10
SELECT id FROM tbl_name ORDER BY id DESC LIMIT 1000000,10
由于第二条SQL使用了索引,ORDER BY就能使用该索引,效果明显,前者需要5秒多,后者只要 0.6秒多点

第三:
这里解释一下引文中的例子:
Select * From cyclopedia Where ID>=(
Select Max(ID) From (
Select ID From cyclopedia Order By ID limit 90000,1
) As tmp
) limit 100;

正如引文所说,该语句可以改写为:
Select * From cyclopedia Where ID>=(
Select ID From cyclopedia Order By ID limit 90000,1
) limit 100;
好,为什么这里会比直接使用 LIMIT 快呢?

正如前两点说的,第一子查询中使用了ORDER BY,因此只使用 `ID`使用查询结果的字段,才会使用索引,如果这里在`ID`后加多一个不在索引内的字段(如:`ID`,`other_field`),那么也要5秒多的时间,这就是第一点快的原因。

第二,外层查询这里虽然使用 ‘*’作为要查询的字段,但由于使用了WHERE ID>=n ,因此使用了索引而作出了快速定位。

而单纯的Select * From cyclopedia ORDER BY `ID` DESC LIMIT 90000,1 由于是要查询的字段使用“*”,另外由于ORDER BY子句并不会使用索引,因此就会慢。

如果改定为:Select `ID` From cyclopedia ORDER BY `ID` DESC LIMIT 90000,1就会变快,但奇怪的是强制使用索引子句Select * From cyclopedia FORCE INDEX(PRIMARY) ORDER BY `ID` DESC LIMIT 90000,1居然无效,这样看来,MySQL的内置优先机制的优先级更高。

Tags: , , ,

Leave a Comment

拍婚纱照:我还是中招了

要结婚了,并不富有的我觉得拍一辑婚纱照还是少不了,于是就开始走上了一条人生必经的血路(应该都是必经的了吧,哈哈..)

早就听说婚纱店里的黑暗,于是我老早就找一些刚结婚的同事、朋友先咨询一篇,结果听得我毛骨悚然,基本上都是被砍得血淋淋的。有了心理准备的我开始选择婚纱店。

本来是打算在广州找(我在广州打工,家在离广州市约有2.5小时车程吧),然后去番禺拍外景(那里有我最喜欢的地方),后来想了一下,还是不行,老婆(先叫着吧,呵)不方便,她在家里上班,总不能说有事没事都叫她出来广州,所以,还是把范围定在了家里附近。

知己知彼,我并不聪明,实在是没有跟别人周旋的能力,就把老婆她姐跟我妈拉过来(她们可不是一般的牛人),去了一家全国比较出名的婚纱店(名字嘛,还是先不说,还真想知道的,可以私下解决),免得有什么麻烦--省心。

我老婆她姐刚结婚不到一年,也是同一家店,坐在店里跟我妈一起给我跟老婆上了一堂心理辅导课(汗,当着店员面,上了差不多一小时),看得出她早就已经先杀出了一条血路了吧,我还是跟着走就好了,前人栽树,后人遮荫嘛,还是老话--省心。 -_-!。结果是中午选到傍晚,接待我们的是上次接待老婆她姐的店员,好像是经理吧,然后给了我们一些优惠(别的什么优惠我忘了,就记得换了个好点大点的相册,好像还加了一本),最后任务单基本上定了下来,然后也选好了服装。我心里的一块铅也终于可以丢下了,完事,付帐…… (完事!!!? 我都想!,结果在路上又上了一堂心理辅导课,我也真是笨哪,居然付了全额的款)

一个星期后……

一大早就起来,到店里,要化妆什么的,店里人推荐了一些额外收费的项目,由于之前跟朋友了解过,关于这些东西早就有心理准备,已经是准备好了要些什么(预算之内,不知道的就会觉得受骗,以为之前交的钱已经是全包了吧)。然后拍内景,拍外景(丫的,一天都没有换过镜头,一支长焦就把我给打发了。不过专业就是专业,要你做的动作两三句话就能搞定,还能一边拍一边逗乐,级数就是不同呀),累了一天,老婆回去就倒下了,据说电脑都没关就睡着了。 Orz

两天后……

再次来到店里,等待了一段时间后,终于到我们选照片(今天来选的人还真不少,好像是前段时间好日子比较多),一位店员开始陪我们选照片,要把选好的照片放置到相应的相册里,然后店员就开始一轮解说,说到一半,我恍然大悟,不过到了这个时候也没办法了。

下面解说一下我悟出的东西:

首先,拿取额外的底片要钱我是知道的(这里是给我们基本底片42张),但超出42张的底片,这店可是比其它店的钱要多,别人都是10块一张,它就收20多块,当时我是觉得反正我是不会要超出的部分,只要选好基本的底片,而且别的东西的价格便宜就行了,所以就没管这个.. 呀,谁知就是在这个环节上面出了乱子:他有三本相册,还有一些其它的东西,这些东西都是消耗底片的,而最大的问题就是,这些消耗是超过42张的,大约是要60+张,好,(60-40)x 20元/张… 现在大家就知问题在哪里了吧(PS. 你总不会不要那多出来的相册吧,那相册是要用机把照片打上去的,不是你自己可以把照片放进去)。最后,他实在是砍不动了,就会告诉你,要不要一张DVD,再选一些照片加工,并做成一辑影片--180块。。反正我是要了(你选片时会觉得很多片都很好,都不想丢了)。。。So…

总结:不要以为别人送东西给你就是捡到便宜了,那不过是一个看上去美味的钩子,好戏还有后头呢。

Tags: ,

Comments (3)

Word添加目录和页码

好久没有动过Office了,今天要为已经排好版的书添加目录(从来没搞过这东西),搞了大半天,还真不容易,第一天用Office 2007,看得我差点都晕了,第二天回到公司又变成用Office 2003,汗… 完全是两种东西.. 不过总体来说,使用上还是一致的,现在说说过程。

首先,说说如何添加一书目
1、在文档中,选择要成为目录文字的内容,然后在“格式”中选择“标题一”(Word2007有点不同,好像叫标题),并设置你自己喜欢的格式(如文字颜色,字体,文字大小等),如果想在目录中使用副标题,就在正文部分选择要成为副标题的文字,并在“格式”中选择“标题二”(Word 2007叫“副标题”),如图:

选择要成为目录的文字

选择要成为目录的文字

在“格式”中选择“标题一”

在“格式”中选择“标题一”

第二步:把光标移到想插入书目的位置,然后在菜单栏选择“插入”=>”引用”=>”索引和目录”,设置好相应的选项,并点击“确定”按钮,如图:

选择菜单“插入”=>"引用"=>"索引和目录"

选择菜单“插入”=>

相关设置

相关设置

好,到这里Word已经为你插入一个漂亮的书目,你现在要做的就是就是为这目录设置好样式,如“行高”,文字大小等。

添加页码
单为文本添加页码还没什么,但如果同时为目录和文本添加页码,就要多注意些步骤了。
背景你可能只有一个目录页,也可能有多个目录页,也许要求目录页不显示页码,或多目录页时,目录页和内容使用不同的页码(内容页重新由1开始)

好,现在废话不多说,马上开始

如果你只有一页的目录页,又不想目录页中显示页码,那就先把目录页作为单独一页,然后选择:“插入”=>”页码”,把“首页显示页码”复选框架的勾掉(不选择),点击“格式”,点选“起始页码”,并设置为“0”,OK..搞定。

如果你有多个目录页:
1、把光标落在目录页的最后一页的最后一行(不包括多余的空行),然后在菜单中选择:“插入”=>”分隔符”,然后选择“下一页”,这是最关键的一步了。如图:

插入分隔符

插入分隔符

做到这里,估计90%的朋友都在晕了,我在目录页加这么多换行干嘛呀。。又要删除了,呵…Sorry…

2、添加页码
光标移到正文部分,在菜单中选择:“插入”=>”页码”,然后保留“首页显示页码”选择,然后点击“格式”,点选“起始页码”,并设置为“1”.OK..又搞定。如图:

设置页码

设置页码

好了,介绍完毕,如果有什么错漏,还请大家指正。另外,还有一些技巧在这里就不在这里作详细介绍了,大家多试试就行,呵..

Tags: , ,

Comments (2)

出海捕鱼

星期六,一班朋友从各处地方(包括广州,江门,中山)一起去到中山横门,租了艘渔船,打鱼食鱼,一个字爽

Tags: , ,

Leave a Comment

晓港公园烧烤外拍

和同学一起出去玩

Tags: , ,

Comments (1)

高呼:我开博啦!

经过长时间反复考虑,最后经不起诱惑,终于架设起我第一个Blog.

之前一直觉得玩博客是没事找事,消磨时间的行为--要保持文章的更新,就要同时不断更新自我,并且要有足够的时间惊人的毅力,对我来说实在是有压力,所以我迟迟不肯搞一个自己的Blog.

经不住朋友的游说(已经不是第一次了),咬了一下牙,下个决心(主要是因为看了朋友发过一的一个链接),说干就干,想一个域名并注册了(域名都注册了总不能让它闲放着吧),连夜赶工,下个WordPress,选个Themes,搞定..还好因为工作关系,之前要写WordPress的插件,对WordPress比较熟悉,几下就搞定了.呵呵..

说来惭愧,从事Web开发已经多年,还没正式架设过一个属于自己的站点,真的要BS一下自己.

今天,快要到一个特别的日子,我决定打破这个僵局,架设这个Blog,算是一个开始吧.同时,还强制了某人也搞了个Blog,嘻嘻..算是陪一下我嘛,别怪我心狠(终于知道,什么叫无毒不丈夫)

Any way.. 现在已经架好了,我会尽量多抽点时间上来,也算是对得起今天的几十大洋.

最后,自己贺喜一下,嘻..

Tags:

Comments (1)