引自: http://blog.chinaunix.net/space.php?uid=20746343&do=blog&id=730129
sysctl优化linux网络
1, 优化网络设备接收队列
net.core.netdev_max_backlog=3000
该文件表示在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
默认值:Red Hat Linux release 9 (Shrike)默认为300
rhel5 默认为1000
建议值为3000
2, net.ipv4.conf.lo.accept_redirects
accept_redirects:该参数位于 /proc/sys/net/ipv4/conf/DEV/accept_redirects (DEV表示具体的网络接口),如果你的主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经 过另外一个路由器,这时这个路由器就会给你发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向 icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用“安全重定向”(见下文) 以消除安全性隐患。
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
3, 打开TIME-WAIT套接字重用功能,对于存在大量连接的Web服务器非常有效。
net.ipv4.tcp_tw_recyle=1
net.ipv4.tcp_tw_reuse=1
10) /proc/sys/net/ipv4/tcp_tw_recyle
打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求,请不要随
意修改这个值。
缺省设置:0
11) /proc/sys/net/ipv4/tcp_tw_reuse
该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
缺省设置:0
下边的命令用来对连接数量非常大的服务器进行调优.
·对于同时支持很多连接的服务器,新的连接可以重新使用TIME-WAIT套接字. 这对于Web服务器非常有效:
如果你使用该命令,还要启动TIME-WAIT 套接字状态的快速循环功能:
图Figure 10-7显示出将这些功能启用,连接数量明显降低.因为每个TCP传输都包含远程客户端的协议信息缓存,所以有利于提高性能.缓存中存放round-trip时间、最大segment大小、拥塞窗口的信息。
4, 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
net.ipv4.tcp_fin_timeout=30
tcp_fin_timeout:在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,
在获 得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。
这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。
如果时间到了仍未收到对方的fin包就主动释放该会话。
参数值为整数,单位为秒,缺省为180秒
对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能
会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。过去在
2.2版本的内核中是 180 秒。您可以设置该值,但需要注意,如果您的机器为负
载很重的web服务器,您可能要冒内存被大量无效数据报填满的风险,
FIN-WAIT-2 sockets 的危险性低于 FIN-WAIT-1,因为它们最多只吃 1.5K
的内存,但是它们存在时间更长。另外参考 tcp_max_orphans。
·参数tcp_fin_timeout 是套接字关闭时,保持FIN-WAIT-2状态的时间。一个TCP连接以three-segment SYN序列开始, 以three-segment FIN序列结束.均不保留数据.通过改变tcp_fin_timeout的值, 从FIN序列到内存可以空闲出来处理新连接的时间缩短了,使性能得到改进.改变这个值的前要经过认真的监测,避免因为死套接字造成内存溢出.
5, 减少TCP KeepAlive连接侦测的时间,使系统可以处理更多的连接。
net.ipv4.tcp_keepalive_time=1800
/proc/sys/net/ipv4/tcp_keepalive_time
该文件表示从不再传送数据到向连接上发送保持连接信号之间所需的秒数。
缺省设置:7200(2小时)
服务器的一个问题是,同一时刻的大量TCP连接里有很多的连接被打开但是没有使用. TCP的keepalive功能检测到这些连接,缺省情况下,在2小时之后丢掉. 2个小时的可能导致内存过度使用,降低性能.因此改成1800秒(30分钟)是个更好的选择:
6, 增加TCP SYN队列长度,使系统可以处理更多的并发连接。
net.ipv4.tcp_max_syn_backlog=8192
/proc/sys/net/ipv4/tcp_max_syn_backlog
对于那些依然还未获得客户端确认的连接请求,需要保存在队列中最大数目。对于
超过 128Mb 内存的系统,默认值是 1024,低于 128Mb 的则为 128。如果
服务器经常出现过载,可以尝试增加这个数字。警告!假如您将此值设为大于
1024,最好修改 include/net/tcp.h 里面的 TCP_SYNQ_HSIZE,以保持
TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如
果tcp_adv_win_scale 128Mb 32768-610000)则系统将忽略所有发送给自己
的ICMP ECHO请求或那些广播地址的请求。
当服务器负载繁重或者是有很多客户端都是超长延时的连接故障,可能会导致half-open连接数量的增加。这对于Web服务器很来讲很平常,尤其有很多拨号客户时.这些half-open连接保存在 backlog connections 队列中.将这个值最少设置为4096 (缺省为1024). 即便是服务器不接收这类连接,设置这个值还能防止受到denial-of-service (syn-flood)的攻击.
7, 1) 优化系统套接字缓冲区
net.core.rmem_max=16777216
net.core.wmem_max=16777216
5) /proc/sys/net/core/rmem_default
该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)。
缺省设置:110592
6) /proc/sys/net/core/rmem_max
该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)。
缺省设置:131071
7) /proc/sys/net/core/wmem_default
该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。
缺省设置:110592
8) /proc/sys/net/core/wmem_max
该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。
缺省设置:131071
·对于所有协议的队列,设置最大系统发送缓存(wmem) 和接收缓存(rmem)到8MB
这些设置指定了创建TCP套接字时为其分配的内存容量. 另外,使用如下命令发送和接收缓存.该命令设定了三个值:最小值、初始值和最大值:
第三个值必须小于或等于wmem_max和rmem_max。
8 打开TCP SYN cookie选项,有助于保护服务器免受SyncFlood攻击。
net.ipv4.tcp_syncookies=1
/proc/sys/net/ipv4/tcp_syncookies
该文件表示是否打开TCP同步标签(syncookie),内核必须打开了 CONFIG_SYN_COOKIES项进行编译。 同步标签(syncookie)可以防止一个套接字在有过多试图连接到达时引起过载。
tcp_syncookies 参数类型:整型
只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。默认值是false。
注意:该选项千万不能用于那些没有收到攻击的高负载服务器,如果在日志中出现 synflood消息,但是调查发现没有收到synflood攻击,而是合法用户的连接负载过高的原因,你应该调整其它参数来提高服务器性能。参考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.
syncookie严重的违背TCP协议,不允许使用TCP扩展,可能对某些服务导致严重的性能影响(如SMTP转发)。
开启TCP SYN cookies,保护服务器避免受syn-flood攻击,包括服务取决denial-of-service (DoS) 或者分布式服务拒绝distributed denial-of-service (DDoS) (仅适用Red Hat Enterprise Linux AS)
9 关闭路由相关功能
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.eth0.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.lo.secure_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.eth0.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.default.send_redirects=0
/proc/sys/net/ipv4/*/secure_redirects
其实所谓的“安全重定向”就是只接受来自网关的“重定向”icmp包。该参数就是
用来设置“安全重定向”功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值
为启用。
send_redirects - 布尔类型
如果是router,发送重定向消息,默认值是TRUE
accept_redirects - 布尔类型
收发接收ICMP重定向消息。对于主机来说默认为True,对于用作路由器时默认值为False。
·以下命令使服务器忽略来自被列入网关的服务器的重定向。因重定向可以被用来进行攻击,所以我们只接受有可靠来源的重定向。
另 外,你可以配置接受或拒绝任何ICMP重定向。ICMP重定向是路由器传输路由信息的机制。比如,当网关接收到来自所接网络主机的Internet数据报 时,网关可以发送重定向信息到一台主机。网关检查路由表获得下一个网关的地址,第二个网关将数据报路由到目标网络.关闭这些重定向得命令如下:
·如果这个服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能:
10 优化TCP接收/发送缓冲区
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
25) /proc/sys/net/ipv4/tcp_wmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于发送缓冲的内存最小值。每个TCP socket都可以使用它。
Default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:为TCP socket预留用于发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。
缺省设置:4096 16384 131072
26) /proc/sys/net/ipv4/tcp_rmem
该文件包含3个整数值,分别是:min,default,max
Min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
Default: 为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem中default的值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 默认值情况下,TCP 窗口大小为65535。
Max:为TCP socket预留用于接收缓冲的内存最大值。该值不会影响 net.core.wmem中max的值,今天选择参数 SO_SNDBUF则不受该值影响。
tcp_wmem - 三个整数的向量: min, default, max
min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4K。
default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16K。
max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,今天选择参数SO_SNDBUF则不受该值影响。默认值为128K。
tcp_rmem - 三个整数的向量: min, default, max
min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多数量的内存用于接收缓冲,默认值为8K。
default:为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem_default 值。该值决定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win:0是默认值情况下,tcp 窗口大小为65535。
max:用于TCP socket接收缓冲的内存最大值。该值不会影响 net.core.wmem_max,今天选择参数 SO_SNDBUF则不受该值影响。默认值为 128K。默认值为87380*2 bytes。
11,
配置服务器拒绝接受广播风暴或者smurf 攻击attacks:
12,
·有些路由器针对广播祯发送无效的回应,每个都产生警告并在内核产生日志.这些回应可以被忽略:
13,
# don't cache ssthresh from previous connection net.ipv4.tcp_no_metrics_save = 114,# Increase the maximum number of skb-heads to be cachednet.core.hot_list_length = 25615,# Increase the tcp-time-wait buckets pool sizenet.ipv4.tcp_max_tw_buckets = 36000016# Lower syn retry ratesnet.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 317,# Set TCP Re-Ordering value in kernel to ‘5′net.ipv4.tcp_reordering = 5
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1792184
第四章 系统优化概要
概述
1. “/etc/profile”文件
2. “bdflush”参数
3. “ip_local_port_range”参数
4. “/etc/nsswitch.conf”文件
5. “/proc”文件系统
6. “ulimit”参数
7. 增加系统打开的文件数目
8. 文件“atime”属性
9. 文件的“noatime”属性
10. 特定的TCP/IP栈
11. 交换分区
12. 调整IDE硬盘性能
Linux的优化
概述
优化网络性能在很大程度上与网络上使用的软硬件相关。如何优化网络是很难用一本书说得清楚的。在网络真正运行起来之前是很难知道网络的瓶颈所在。性能优化并不是很简单和直观的,必须当作一个很复杂的任务。而且,不仅受到很多约束还需要很高的精确度。除非进行专门的测试以诊断系统中的瓶颈,否则对一些现象很难做出解释。有时,性能优化会变成一项让人十分失望并且乏味的工作,尤其是在经过大量的分析之后所得到的结果仍然不可确定的时候。但是,对系统性能的优化是一项很有回报的工作,并且会给整个系统带来长期的益处。
1. “/etc/profile”文件
“etc/profile”文件含有系统大量的环境和启动程序的配置信息。你在该文件中进行的配置,可以通过申请全局环境变量来实现。因此,在该文件中设置优化标志,是一种明智的选择。要想使x86程序获得最佳性能,可以在编译时,使用最佳的优化选项-O9 。许多程序的“Makefile”文件中已经含有-O2选项,而-O9使编译器采用最高级别的优化。尽管它将增加最终程序的大小,但这样可以获得更高的运行速度。编译时,使用“-fomit-frame-pointer”选项,程序运行时,访问变量时将使用堆栈。但是,使用这一选项,生产的代码将无法调试。使用“-mcpu=cpu_type”和“-march=cpu_type”选项,Gcc将针对这种型号CPU进行专门的优化,但生成的代码只能在所指定的CPU或更高系列的CPU上运行。
对于CPU i686或PentiumPro、Pentium II、Pentium III
在“/etc/profile”文件中 , 加入一行:
CFLAGS=’-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-
frame-pointer -fno-exceptions’
对于CPU i586或Pentium
在“etc/profile”文件中, 加入一行:
CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-
mem -fforce-addr -malign-double -fno-exceptions’
对于CPU i486
在“etc/profile”文件中, 加入一行:
CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’
在进行完以上设置之后,紧接者着把“CFLAGS LANG LESSCHARSET”加入到“etc/profile”文件中的“export”行中:
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
然后,重新登录,这时,环境变量CFLAGS已经被赋值,编译器和其它配置工具可以使用它。对Pentium(Pro/II/III)的优化
必须使用egcs或pgcc编译器。Linux的缺省安装中,已经装上了egcs,所以无需担心。
基准测试结果(按体系结构分类):
由于CPU的体系结构和使用的gcc/egcs的版本不同,优化选项也会不同。下面的图表可以帮助你根据自己的CPU和编译器,选择最佳的编译选项。
Redhat 6.1中安装的编译器的版本是egcs 2.91.66,但是,即使你安装的就是Redhat 6.1,在选择编译选项之前也务必检查一下编译器的版本.
为了确认编译器的版本,使用如下命令:
[root@deep]# egcs --version。
注意:所有的测试结果可以从GCC的主页: http://egcs.cygnus.com/
上检索到。
现举例说明:
对于CPU pentium II/III(i686),安装了egcs-2.91.66,最佳的编译选项是:
CFLAGS=’-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions’
对于CPU pentium (i586),安装了egcs-2.91.66, 最佳的编译选项是:
CFLAGS=’-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions’
对于 CPU i486,安装了egcs-2.91.66,最佳的编译选项是:
CFLAGS=’-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions’
-funroll-loops选项
对“loop unrolling”进行优化,只对在编译或运行时循环次数能确定的循环语句有效。
-funroll-all-loops
对“loop unrolling”进行优化,对所有的循环语句有效,担通常使程序运行变慢。
-ffast-math
该选项使GCC可以不遵从ANSI或IEEE的规则,以获得运行更快的优化代码。例如:它允许编译器假设sqrt()函数的
输入参数非负以及所有的浮点数的值都是NaNs。
-malign-double
GCC把 double, long double, and long long类型变量定界在双字还是单字边界上,由该选项控制。
double类型变量定界于双字边界时,产生的代码在Pentium机器上可以运行得更快一些,但是会占用更多的内存。
-mcpu=cpu_type
设定在生成指令时缺省的机器和CPU类型,设定好某一特定的CPU类型后,编译器将针对这种芯片产生相应的指令,如果不使用“-march=cpu_type”选项,编译器不会产生任何不能在i386上运行的代码。“i586”等价于“pentium”,
“i686”等价于“pentiumpro”,“k6”指明是使用AMD的芯片而非Intel系列。
-march=cpu_type
为指定类型的机器和CPU产生指令。这里的CPU类型与“-mcpu”中列出的相同。而且,使用本选项已经隐含了“-mcpu=cpu_type”选项。
-fforce-mem
对于涉及内存操作的运算,强制把操作数拷贝到寄存器中。这是通过把所有的内存引用转换成潜在的普通子表达式,以获得优化代码。如果,这些内存引用不是普通子表达式,可以通过指令的组合,消除单独的寄存器装载。
-fforce-addr
运算前把内存地址常数拷贝到寄存器中。所产生的优化代码与选项“-fforce-mem”类似。
-fomit-frame-pointer
对于不必要的框架指针(frame pointer),不在寄存器中保存。这就避免了相应的用于保存、设置和恢复框架指针所需的指令;这样,许多函数中可以使用额外的寄存器。但是,这一选项使得在大多数机器上无法进行调试。
注意:本书将要讨论的所有优化,缺省都是针对Pentium II/III 系列CPU。因此,如有必要,对于某些专门的CPU需要调整编译参数。
2. “bdflush”参数
下文讨论目录“/proc/sys/vm”下的系统控制文件,且只在Linux内核版本2.2下有效。控制该目录下的文件,可以调整Linux内核
子系统--虚拟内存(VM)的行为,其中bdflush文件对于硬盘使用有一定影响。
该文件控制了bdflush内核守护进程的行为。我们通常使用以下命令来提高文件系统的性能:
echo \"100 1200 128 512 15 5000 500 1884 2\">/proc/sys/vm/bdflush
修改某些值,可以使系统响应更快,例如:可以使系统在写入硬盘之前等待更长时间,从而避免了一些硬盘访问的冲突。
把该命令加入文件“etc/rc.d/rc.local”之中,每次重新启动机器时,就不必再次手工敲入这条命令了。
如果需要进一步理解如何改进有关虚拟内存、硬盘缓冲和交换空间(swap)的内核参数,可以参照“/usr/src/linux/Documentation/sysctl/vm.txt”。
3. “ip_local_port_range”参数
下文讨论目录“/proc/sys/net/ipv4/ip_local_port_range”下的系统控制文件,且只在Linux内核版本2.2下有效。
“ip_local_port_range”文件中有两个参数分别定义了用作TCP和UDP本地端口的端口范围。第一个参数是第一个端口号。第二个参数是最后一个本地端口号。对于使用率很高的系统,可以修改为:32768到61000。
echo *32768 61000* > /proc/sys/net/ipv4/ip_local_port_range
把该命令加入文件“/etc/rc.d/rc.local”之中,每次重新启动机器时,就不必再次手工敲入这条命令了。
4. “/etc/nsswitch.conf”文件
“etc/nsswitch.conf”文件定义了系统使用哪些服务来解析主机名、获得口令文件和组文件(group file)。我们的系统中由于没有使用NIS服务,因此口令文件和组文件我们没有使用。这里,我们只讨论该文件中的hosts这一行。
编辑“nsswitch.conf”文件(vi /etc/nsswitch.conf),把host一行改为:
\"hosts: dns files\"
含义:当请求解析地址时,首先访问DNS服务器,如果DNS服务器没有响应,则使用“/etc/hosts”文件。
我建议把该文件中每一行中的NIS都删掉。当然,如果你一定要使用NIS,就不能删掉NIS。最后,这个文件会是这样:
passwd: files
shadow: files
group: files
hosts: dns files
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
automount: files
aliases: files
5. “/proc”文件系统
下文讨论目录“proc/sys/fs”下的系统控制文件,且只在Linux内核版本2.2下有效。该目录下的文件可以用来调整和监测Linux内核的一些行为。对这些文件的误操作可能搅乱系统,因此在实际调整系统之前,最好把文档和源代码都读一下。
适当的增加“/proc/sys/fs/file-max”的值:每4M内存对应256,例如:内存为128M的机器,该值可以设为8192(128/4=32 32*256=8192)。同理,可以增加“/proc/sys/fs/inode-max”的值,使其值为打开文件数目的3到4倍(8192*4=32768)。这是因为:i节点的数目至少等于打开的文件数,一般而言,对于大文件,i节点数远大于打开的文件数目。
用于改变/proc目录及其子目录下的任意参数的常用命令是(必须以root登录): echo “新的参数值”> “/proc/所需更改的文件”,对于上面所涉及的修改,其命令为:
echo \"8192\" >/proc/sys/fs/file-max
echo \"32768\" >/proc/sys/fs/inode-max
上文所讨论的方法修改了内核源代码的常数。但是,在新的内核源代码树中并不能起作用,因此还不能算是最好的方法。最好的一种方法是把上述命令加入文件“etc/rc.d/rc.local”之中。在该文件的最后加入以下两行(假设系统有128M内存):
echo \"8192\" >/proc/sys/fs/file-max
echo \"32768\" >/proc/sys/fs/inode-max
其中的数值因系统不同,差异很大,应该根据各自系统,按照上述的公式计算。一台文件服务器或WEB服务器需要打开的文件数目就很大,而用于数值的服务器该数值就较小。
对于内存非常多的系统,特别是512M或更多内存的系统,打开的文件数和i节点数最好不要超过50,000和150,000。
“file-max”参数是指Linux内核可以分配的文件句柄的最大数目。当系统经常报错:文件句柄不够时,就需要适当增大该参数的值。系统缺省值为:4096。
“inode-max”参数是指系统i节点句柄的最大数目。其值应该是file-max值的3到4倍。因为标准输入输出文件和网络套接字
都要使用i节点来进行处理。如果系统经常性的出现i节点被耗尽的情况,就需要增大其值。
6. “ulimit”参数
Linux本身对每个用户拥有的最大进程数有限制。可以在用户根目录下的“.bashrc”文件或者实际使用与“.bashrc”功能相当的
shell的脚本中加入这种限制。编辑“.bashrc”文件(例如:vi /root/.bashrc)并加入下面一行:
ulimit -u unlimited
然后退出,重新登录。为了验证,可以以root身份登录,然后键入: “ulimit –a”,在最大用户进程数一项中应该
显示“unlimited”,例如:
[root@deep]# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited * this line.
pipe size (512 bytes) 8
open files 1024
virtual memory (kbytes) 2105343
注意:你可能更倾向于在命令行键入“unlimit –u”而不是把它加入到文件“/root/.bashrc”中。但为保险起见,建议
还是把它加入文件“/root/.bashrc”中。
7. 增加系统打开的文件数目
增加当前进程打开文件的数目。RedHat 6.0(内核2.2.5)中,用这种方法进程可以至少打开31000个文件描述符;内核版本为2.2.12中,可以至少打开90000个文件描述符(在适当的限制下)。它的上限仅受限于可用内存。
编辑“.bashrc”文件(例如:vi /root/.bashrc)并加入下面一行:
ulimit -n 90000
然后退出,重新登录。为了验证,可以以root身份登录,然后键入“ulimit –a”,在打开文件数一项中应该显示“90000”,例如:
[root@deep]# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited
pipe size (512 bytes) 8
open files 90000 * this line.
virtual memory (kbytes) 2105343
注意:在早于2.2版内核的系统中,即使进行了上述修改,每个进程所能打开的文件数目仍然限制为1024。
8. 文件“atime”属性
Linux除了记录文件的创建和修改时间外,还记录文件最近的访问时间。该信息作用不大,但为保留它,系统需要消耗相应的资源。ext2文件系统允许超级用户对单个文件进行标记,以忽略对这条信息的记录。
这种优化调整,对于文件查找操作,系统性能提高显著,另外,对于需要经常访问的文件(如:/var/spool/news)也是很有用的。设置该属性的命令为:
[root@deep]# chattr +A filename
若需要对某个目录下的所有文件进行这种设置,可以使用:
[root@deep /root]# chattr -R +A /var/spool/
[root@deep /root]# chattr -R +A /cache/
[root@deep /root]# chattr -R +A /home/httpd/ona/
9. 文件的“noatime”属性
Linux在mount文件系统时,可以使用“noatime”选项。并可以在文件“/etc/fstab”的mount选项区域中加入。当含有该选项的
文件系统被挂入(mount)系统时,对该文件系统中的文件的读访问,不再更新文件的atime信息。一般情况下,atime信息没有用,所以不更新该域并无大碍。这一选项的重要性在于:当只对文件进行读操作时,不再需要向文件系统中该文件的相应区域写入信息。因为写入操作的开销某种意义下是昂贵的,因此该选项可以获得明显的性能的改善。该选项对于文件的wtime属性没有影响,每次文件写操作时,都会更新文件的wtime信息。
编辑“fstab”文件(vi /etc/fstab)并且加入如下一行(举例说明):
E.I: /dev/sda7 /chroot ext2 defaults,noatime 1 2
重新启动系统, 然后用以下命令测试结果:
[ root@deep ]# reboot
[ root@deep ]# cat /proc/mounts
10. 特定的TCP/IP栈
RedHat Linux , 一般情况下,并不优化 TCP/IP 窗口大小。这能使系统性能的差别很大。如需更多的信息,参阅:RFC 1106 - High Latency WAN links - Section 4.1 and RFC 793 - Transmission Control Protocol。
编辑文件“/etc/sysconfig/network-scripts/ifup”,在110、112、117、125和134行,有:
110: \"route add -net ${NETWORK} netmask ${NETMASK} ${DEVICE}\"
112: \"route add -host ${IPADDR} ${DEVICE}\"
117: \"route add default gw ${GATEWAY} metric 1 ${DEVICE}\"
125: \"route add default gw ${GATEWAY} ${DEVICE}\"
134: \"route add default gw $gw ${DEVICE}\"
修改为:
110: \"route add -net ${NETWORK} netmask ${NETMASK} window 8192 ${DEVICE}\"
112: \"route add -host ${IPADDR} window 8192 ${DEVICE}\"
117: \"route add default gw ${GATEWAY} window 8192 metric 1 ${DEVICE}\"
125: \"route add default gw ${GATEWAY} window 8192 ${DEVICE}\"
134: \"route add default gw $gw window 8192 ${DEVICE}\"
11. 交换分区
尽量把交换分区放在硬盘的开始区域。硬盘的开始区域物理上位于硬盘柱面的外环部分,因此硬盘的每转能在这一部分读写更多的信息。我曾经见过,在运行命令“hdparm –t”时,把交换分区放在硬盘的结尾部分市,系统的读写速度比放在硬盘的开始部分低3MB/s。
12. 调整IDE硬盘性能
在有大量的磁盘 I/O 操作时,设置IDE硬盘使用 DMA 、32 位的传送和多重的扇区模式(Multiple sector mode),可以大幅
提高系统性能。除非显式的告诉内核使用这些模式,内核缺省是使用保守设置的。
使用如下命令,以使PCI总线允许32位I/O操作:
[root@deep]# /sbin/hdparm -c 1 /dev/hda (或hdb, hdc 等等)
hdparm(8) 的帮助信息(manpage)中说明了:对于某些芯片需要使用选项“-c 3”。所有的(E)IDE硬盘与接口卡相连的扁平电缆中只用16-bit的连接。
使用如下命令,以允许DMA方式:
[root@deep]# /sbin/hdparm -d 1 /dev/hda (或hdb, hdc 等等)
这取决于编译内核时选择的主板芯片组。
使用如下命令,以允许多字的DMA模式2传送:
[root@deep]# /sbin/hdparm -d 1 -X34 /dev/hda (或hdb, hdc 等等)
这为较新的(E)IDE/ATA2硬盘设置IDE的传送模式。(参阅硬盘手册,以核实你的硬盘是否支持这种模式)
使用如下命令,以允许UltraDMA 模式2:
[root@deep]# /sbin/hdparm -d 1 -X66 /dev/hda (或hdb, hdc 等等)
使用该命令之前,事先应该有支持UltraDMA的芯片组,并参看hdparm的帮助信息。使用该命令时,务必小心。
使用如下命令,以允许多扇区I/O模式:
[root@deep]# /sbin/hdparm -m XX /dev/hda (或hdb, hdc 等等)
其中,参数XX是指使用硬盘支持的最大设置。可以使用“-i”选项来自动查找所装硬盘支持的最大设置。可以在输出中查看MaxMultSect的值。例如:
[root@deep]# /sbin/hdparm -i /dev/hda (或hdb, hdc 等等)
/dev/hda:
Model=Maxtor 7540 AV, FwRev=GA7X4647, SerialNo=L1007YZS
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>5Mbs FmtGapReq }
RawCHS=1046/16/63, TrkSize=0, SectSize=0, ECCbytes=11
BuffType=3(DualPortCache), BuffSize=32kB, MaxMultSect=8, MultSect=8
DblWordIO=yes, maxPIO=2(fast), DMA=yes, maxDMA=1(medium)
CurCHS=523/32/63, CurSects=379584528, LBA=yes, LBA=yes, LBAsects=1054368
tDMA={min:150,rec:150}, DMA modes: sword0 sword1 *sword2 *mword0
IORDY=on/off, tPIO={min:240,w/IORDY:180}, PIO modes: mode3
目前的大多数的硬盘驱动器都支持多扇区模式(Multiple sector mode 或aka IDE Block Mode),它允许一次中断中传送多个扇区而不是一次中断传送一个扇区。具有这种特性的硬盘驱动器,能使操作系统在硬盘I/O时的负载下降30-50%。在许多系统中,它能提高数据的吞吐率5-50%。
可以用hdparm的测试模式,来测试所作修改的结果:
[root@deep]# /sbin/hdparm -t /dev/hda (或hdb, hdc 等等)
进行了以上修改后,不要忘记把它们加入到文件“/etc/rc.d/rc.local”中,以便每次重启系统时,能够自动运行。
调谐LINUX网络性能之调谐方法概述
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
在《调谐LINUX网络性能之调试工具篇》和《调谐LINUX网络性能之网络配置文件详解》两篇文章中,我们介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能和网络配置文件的内容,本文我们将从实战的角度介绍网络性能调谐的方法。
下面,我们先来介绍网络性能调谐的第一种方法:服务方式选择。
服务方式选择
网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务,由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题,不在讨论的范围内。增大系统线程的数量:限制线程的数量的因素很多,主要有进程数量的限制,内存大小的限制,mutex/semaphore/shm/ipc的限制;一般情况下先增大进程最大数,再扩充内存,在增大线程最大数,而增大线程最大数的方法很简单,只需改变glibc中两处即可:线程最大数和线程堆栈区的大小;线程最大数的增加是以进程的异步I/O性能下为代价;所以需要加以平衡。
络配置文件中有用的内容
1. 对于数据库而言,增大共享内存段和信号量的多少,对数据传输效率的提高起到很重要的作用;
方法:只需编辑文件linux/include/linux/sem.h和linux/include/asm-i386/shmparam.h即可。
2. 先增大进程最大数,再扩充内存,再增大线程最大数,而增大线程最大数的方法很简单,只需改变glibc中两处即可:线程最大数和线程堆栈区的大小;
3. 把"/etc/inittab"文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方,这非常重要。
编辑inittab文件(vi /etc/inittab)把这一行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
用下面的命令使改变生效:
[root@deep]# /sbin/init q
4. /etc/host.conf 文件指定如何解析主机名。Linux通过解析器库来获得主机名对应的IP地址。下面是一个"/etc/host.conf"的示例:
order bind,hosts :指定主机名查询顺序,这里规定先使用DNS来解析域名,然后再查询"/etc/hosts"文件(也可以相反)。
可以在该文件后加上以下两句:
multi on:指定的主机可以有多个地址,拥有多个IP地址的主机一般称为多穴主机。
ospoof on:指不允许对该服务器进行IP地址欺骗,以提高服务器的安全性。IP欺骗是一种攻击系统安全的手段,通过把IP地址伪装成别的计算机,来取得其它计算机的信任。
可调谐的Linux内核网络参数
ICMP相关内核配置参数
概述:通常我们使用icmp包来探测目的主机上的其它协议(如tcp和udp)是否可用。比如包含"destination unreachable"信息的icmp包就是最常见的icmp包。
(1) icmp_destunreach_rate:设置内容为"Destination Unreachable"icmp包的响应速率。设置值应为整数。
应用实例: 假设有A、B两部主机,首先我们在主机A上执行以下ipchains语句:
ipchains -A input -p icmp -j REJECT
这里的REJECT和DENY不同,DENY会丢掉符合条件的包如同没有接收到该包一样,而REJECT会在丢掉该包的同时给请求主机发回一个"Destination Unreachable"的icmp。
然后在主机B上ping主机A,这时候我们会发现"Destination Unreachable"icmp包的响应速度是很及时的。接着我们在主机A上执行:
echo "1000" > /proc/sys/net/ipv4/icmp_destunreach_rate
也即每10秒钟响应一个"Destination Unreachable"的icmp包。
这时候再从主机B上ping主机A就会发现"Destination Unreachable"icmp包的响应速度已经明显变慢,我很好奇的测试了一下,发现刚好是每10秒响应一次。
(2)icmp_echo_ignore_broadcasts:设置是否响应icmp echo请求广播,设置值应为布尔值,0表示响应icmp echo请求广播,1表示忽略。
注意:windows系统是不响应icmp echo请求广播的。
应用实例:
在我的RedHat6.x和RedHat7上该值缺省为0,这样当有个用户ping我的服务器所在的网段的网络地址时,所有的linux服务器就会响应,从而也能让让该用户得到我的服务器的ip地址,可以执行
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
来关闭该功能。从而防止icmp风暴,防止网络阻塞。
(3)icmp_echoreply_rate:设置系统响应icmp echo请求的icmp包的响应速度,设置值为整数。
应用实例:
假设有A、B两部主机,首先我们在主机B上ping主机A,可以看到响应很正常,然后在主机A上执行
echo "1000" > /proc/sys/net/ipv4/icmp_echoreply_rate
也即每10秒钟响应一个icmp echo请求包。然后再ping主机A就可以看到响应速度已经变成10秒一次。
最好合理的调整该参数的值来防止icmp风暴。
(4)icmp_echo_ignore_all:设置系统是否忽略所有的icmp echo请求,如果设置了一个非0值,系统将忽略所有的icmp echo请求。其实这是icmp_echoreply_rate的一种极端情况。参数值为布尔值,1:表示忽略,0:表示响应。
(5)icmp_paramprob_rate:当系统接收到数据报的损坏的ip或tcp头时,就会向源发出一个包含有该错误信息的icmp包。这个参数就是用来设置向源发送这种icmp包的速度。当然,在通常情况下ip或tcp头出错是很少见的。参数值为整数。
(6) icmp_timeexceed_rate:数据报在网络上传输时,其生存时间(time to live)字段会不断减少,当生存时间为0时,正在处理该数据报的路由器就会丢弃该数据报,同时给源主机发送一个"time to live exceeded"的icmp包。该参数就是用来设置这种icmp包的发送的速度。当然,这通常用于充当路由器的linux主机。
IP相关内核配置参数
linux内核网络参数中关于ip的配置参数通常是用来定义或调整ip包的一些特定的参数,除此之外还定义了系统的一些网络特性。
(1) ip_default_ttl:设置从本机发出的ip包的生存时间,参数值为整数,范围为0~128,缺省值为64。在windows系统中,ip包的生存时间通常为128。如果你的系统经常得到"Time to live exceeded"的icmp回应,可以适当增大该参数的值,但是也不能过大,因为如果你的路由坏路的话,就会增加系统报错的时间。
(2) ip_dynaddr:该参数通常用于使用拨号连接的情况,可以使系统能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该参数的参数值可以是:
1:启用该功能
2:使用冗余模式启用该功能
0:禁止该功能
应用实例:在使用ipchains配置ip欺骗带动局域网共享一个ppp连接上网时,有时会出现刚开时连接一个站点连不通,再次刷新又可以连接的情况,这时候就可以设置该参数的值为1,从而立即改变伪装地址为新的ip地址,就可以解决这类问题。命令为:
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
(3)ip_forward:可以通过该参数来启用包转发功能,从而使系统充当路由器。参数值为1时启用ip转发,为0时禁止ip转发。注意,我们可以在单网卡或双网卡的主机上实现ip转发。
应用实例:
假设我们使用一部装有双网卡的linux主机充当防火墙,这时候我们就必须执行以下命令来打开ip转发功能:
echo "1" > /proc/sys/net/ipv4/ip_forward
(4) ip_local_port_range:设置当本地系统向外发起tcp或udp连接请求时使用的端口范围。设置值为两个整数,缺省为"1024 4999"。
应用实例:
echo "1450 6000" > /proc/sys/net/ipv4/ip_local_port_range
tcp相关内核配置参数
通过tcp配置参数可以控制tcp会话过程中的各个方面。
(1) tcp_fin_timeout:在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,在获得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。如果时间到了仍未收到对方的fin包就主动释放该会话。参数值为整数,单位为秒,缺省为180秒。
(2) tcp_syn_retires:设置开始建立一个tcp会话时,重试发送syn连接请求包的次数。 参数值为小于255的整数,缺省值为10。假如你的连接速度很快,可以考虑降低该值来提高系统响应时间,即便对连接速度很慢的用户,缺省值的设定也足够大了。
(3) tcp_window_scaling:设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。Tcp/ip 通常使用的窗口最大可达到65535字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力。
针对每一网络接口的内核网络参数
通过针对每一网络接口的内核网络参数,你可以为诸如eth0、eth1等具体的网络接口指定响应的内核网络参数。注意:/proc/sys/net/ipv4/conf/all/下的参数将应用于所有的网络接口。
(1) accept_redirects:该参数位于/proc/sys/net/ipv4/conf/DEV/accept_redirects(DEV表示具体的网络接口),如果你的主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你发一个所谓的"重定向"icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。建议将其改为0,或者使用"安全重定向"(见下文)以消除安全性隐患。
(2) log_martians:将包含非法地址信息的ip包记录到内核日志。参数值为布尔值。
应用实例:
上面我们讲过rp_filter反向路径过滤参数,同时我们可以执行下面的语句
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
然后就可以将进行ip假冒的ip包记录到/var/log/messages。
(3) forwarding:启用特定网络接口的ip转发功能。参数值为布尔值,1表示进行记录。
应用实例:
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding
(4) accept_source_route:是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。从安全性角度出发,建议你关闭该功能。
(5) secure_redirects:前面我们已经提到过"安全重定向"的概念,其实所谓的"安全重定向"就是只接受来自网关的"重定向"icmp包。该参数就是用来设置"安全重定向"功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值为启用。
(6) proxy_arp:设置是否对网络上的arp包进行中继。参数值为布尔值,1表示中继,0表示忽略,缺省值为0。该参数通常只对充当路由器的linux主机有用。
改变有关系统缺省参数限制
1. _SHM_ID_BITS:在/usr/src/linux/include/asm/shmparam.h文件中定义了该值;
作用:定义共享内存段表识的数量;其缺省值为7,变化范围:1-128;
调谐:可将该值增大到9,需重新编译内核;
2. MSGMNI:/proc/sys/kernel/msgmni文件中定义了该值;
作用:该值定义了消息队列的最大长度;要使db2(7.1版)正常运行,其最小值为128;
对于高负荷的DB2服务器,可将该值调整为 >= 1024;
调谐:对于2.4.6版本的内核,其缺省值为16;可用以下三中方法改变该值
(1) bash# sysctl -w kernel.msgmni=128
(2) bash# sysctl -w kernel.msgmni=128
(3) 如果要在系统启动时改变该值,可在/etc/sysctl.conf文件中加入以下几句:
# Sets maximum number of message queues to 128
# Set this to 1024 or higher on production systems
kernel.msgmni = 128
(用ipcs -l 命令来查看当前ipc 参数的各种设置)
3. NR_TASKS:/usr/src/linux/include/linux/tasks.h文件中定义了该
MAX_TASKS_PER_USER被定义为NR_TASKS/2;linux 将DB2的每个实例看作用户,每个连结一般都使用一个进程,而每个实例的最大连结数被限制为NR_TASKS/2;尽管2.4的内核对该值无限制,但有linux该缺省值仍为512;
调谐:>= 1024, 重新编译内核;
4. SEMMNI:/usr/src/linux/include/linux/sem.h 文件中定义了该值;
作用:该值定义了linux所能支持的最大信号量表识;
调谐:其缺省值为128,增大到1024;
从IPV4过渡到IPV6
尽管IPv6比IPv4具有明显的先进性,要想在短时间内将Internet和各个企业网络中的所有系统全部从IPv4升级到 IPv6是不可能的。为此,做为IPv6研究工作的一个部分,IETF制定了推动IPv4向IPv6过渡的方案,其中包括三个机制:兼容IPv4的 IPv6地址、双IP协议栈和基于IPv4通道的IPv6。
兼容IPv4的IPv6地址是一种特殊的IPv6单点广播地址,一个 IPv6节点与一个IPv4节点可以使用这种地址在IPv4网络中通信。这种地址是由96个0位加上32位IPv4地址组成的,例如,假设某节点的 IPv4地址是192.56.1.1,那么兼容IPv4的IPv6地址就是:
0: 0:0:0:0:0:C038:101。
双 IP协议栈是在一个系统(如一个主机或一个路由器)中同时使用IPv4和IPv6两个协议栈。这类系统既拥有IPv4地址,也拥有IPv6地址,因而可以收发IPv4和IPv6两种IP数据报。也就是用两套,需要使用IPv4的时候就使用IPv4,需要使用IPv6的时候就使用IPv6。
与双IP协议栈相比,基于IPv4通道的IPv6是一种更为复杂的技术,它是将整个IPv6数据报封装在IPv4数据报中,由此实现在当前的IPv4网络(如Internet)中IPv6节点与IPv4节点之间的IP通信。基于IPv4通道的IPv6实现过程分为三个步骤:封装、解封和通道管理。封装,是指由通道起始点创建一个IPv4包头,将IPv6数据报装入一个新的IPv4数据报中。解封,是指由通道终结点移去IPv4包头,还原原始的IPv6数据报。通道管理,是指由通道起始点维护通道的配置信息。IPv4通道有四种方案:路由器对路由器、主机对路由器、主机对主机、路由器对主机。
当进行通信的两个主机都有兼容IPv4的IPv6地址时,数据发送方主机将建立一个主机对主机通道。通道起始点(数据发送方主机)确定数据接收方主机就是通道终结点,并自动从其兼容IPv4的IPv6地址中抽取后32个地址位以确定通道终结点的IPv4地址,这种类型的通道被称为自动通道(automated tunneling)。
双IP协议栈和基于IPv4通道的IPv6网络使IPv4网络能够以可控的速度向 IPv6迁移。在开始向IPv6过渡之前,必须设置一个同时支持IPv4和IPv6的新的DNS服务器。有关设置或关于IPv6更多的详细内容可访问 IPv6相关网站。我们在这里仅为在Linux下使用IPV6提供一种简单的理论叙述。
小结
至此,我们已经详细介绍了Linux系统的网络性能调谐方面的内容,包括网络调谐测试工具的使用方法及其可实现的功能,网络配置文件解析,网络性能调谐方法等。您对这系列文章有什么想法,请直接在下面留言。如果您对网络调谐技术有更好的见解,欢迎您来稿。来稿请寄
[email protected]
调谐LINUX网络性能之网络配置文件详解
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
在《调谐LINUX网络性能之调试工具篇》中,我们介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能。本文我们将着重介绍网络配置文件的内容,帮您读懂这些文件。
/etc/modules.conf 文件
该配置文件定义了各种需要在启动时加载的模块的参数信息,这里主要着重讨论关于网卡的配置。为了减少启动时可能出现的问题,Linux内核不会自动检测多个网卡。对于没有将网卡的驱动编译到内核而是作为模块动态载入的系统若需要安装多块网卡,应该在“modules.conf”文件中进行相应的配置。若设备驱动被编译为模块(内核的模块):对于PCI设备,模块将自动检测到所有已经安装到系统上的设备;对于ISA卡,则需要向模块提供IO地址,以使模块知道在何处寻找该卡,这些信息在“/etc/conf.modules”中提供。
例如,我们有两块ISA总线的3c509卡,一个IO地址是0x300,另一个是0x320。编辑“modules.conf”文件如下:
alias eth0 3c509
alias eth1 3c509
options 3c509 io=0x300,0x320
对于PCI卡,仅仅需要alias命令来使ethN和适当的驱动模块名关联,PCI卡的IO地址将会被自动的检测到。对于PCI卡,编辑"modules.conf"文件如下:
alias eth0 3c905
alias eth1 3c905
若驱动已经被编译进了内核:系统启动时的PCI检测程序将会自动找到所有相关的网卡。ISA卡一般也能够被自动检测到,但是在某些情况下,ISA卡仍然需要做下面的配置工作:在"/etc/lilo.conf"中增加配置信息,其方法是通过LILO程序将启动参数信息传递给内核。对于ISA卡,编辑 "lilo.conf"文件,增加如下内容:
append=" ether="0,0,eth0 ether="0,0,eth1"
/etc/sysconfig/network-scripts/ifcfg-ethN 文件
在 RedHat中,系统网络设备的配置文件保存在"/etc/sysconfig/network-scripts"目录下,ifcfg-eth0包含第一块网卡的配置信息,ifcfg-eth1包含第二块网卡的配置信息等,若希望手工修改网络地址或在新的接口上增加新的网络界面,可以通过修改对应的文件(ifcfg-ethN)或创建新的文件来实现。
DEVICE=name name表示物理设备的名字
IPADDR=addr addr表示赋给该卡的IP地址
NETMASK=mask mask表示网络掩码
NETWORK=addr addr表示网络地址
BROADCAST=addr addr表示广播地址
ONBOOT=yes/no 启动时是否激活该卡
none:无须启动协议
bootp:使用bootp协议
dhcp:使用dhcp协议
USERCTL=yes/no 是否允许非root用户控制该设备
/etc/resolv.conf 文件
该文件是由域名解析器(resolver,一个根据主机名解析IP地址的库)使用的配置文件,示例如下:
search domainname.com
nameserver 208.164.186.1
nameserver 208.164.186.2
“search domainname.com”表示当提供了一个不包括完全域名的主机名时,在该主机名后添加domainname.com的后缀; “nameserver”表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的。
/etc/host.conf 文件
该文件指定如何解析主机名。Linux通过解析器库来获得主机名对应的IP地址。下面是一个“/etc/host.conf”的示例:
order bind,hosts
multi on
ospoof on
“order bind,hosts”指定主机名查询顺序,这里规定先使用DNS来解析域名,然后再查询“/etc/hosts”文件(也可以相反)。
“multi on”指定是否“/etc/hosts”文件中指定的主机可以有多个地址,拥有多个IP地址的主机一般称为多穴主机。
“nospoof on”指不允许对该服务器进行IP地址欺骗。IP欺骗是一种攻击系统安全的手段,通过把IP地址伪装成别的计算机,来取得其它计算机的信任。
/etc/hosts 文件
当机器启动时,在可以查询DNS以前,机器需要查询一些主机名到IP地址的匹配。这些匹配信息存放在/etc/hosts文件中。在没有域名服务器情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址。
下面是一个“/etc/hosts”文件的示例:
IP Address Hostname Alias
127.0.0.1 Localhost Gate.openarch.com
208.164.186.1 gate.openarch.com Gate
………… ………… ………
最左边一列是主机IP信息,中间一列是主机名。任何后面的列都是该主机的别名。一旦配置完机器的网络配置文件,应该重新启动网络以使修改生效。使用下面的命令来重新启动网络:/etc/rc.d/init.d/network restart。
/etc/inetd.conf 文件
众所周知,作为服务器来说,服务端口开放越多,系统安全稳定性越难以保证。所以提供特定服务的服务器应该尽可能开放提供服务必不可少的端口,而将与服务器服务无关的服务关闭,比如:一台作为www和ftp服务器的机器,应该只开放80 和25端口,而将其他无关的服务如:finger auth等服务关掉,以减少系统漏洞。
而inetd,也叫作“超级服务器”,就是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求。inetd.conf则是inetd的配置文件。inetd.conf文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。在任何的网络环境中使用Linux系统,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最好卸载掉,这样黑客就少了一些攻击系统的机会。查看"/etc/inetd.conf"文件,了解一下inetd提供哪些服务。用加上注释的方法(在一行的开头加上#号),禁止任何不需要的服务,再给inetd进程发一个SIGHUP信号:
· 第一步:把文件的许可权限改成600。
[root@deep]# chmod 600 /etc/inetd.conf
· 第二步:确信文件的所有者是root。
[root@deep]# stat /etc/inetd.conf
· 第三步:编辑"inetd.conf"文件(vi /etc/inetd.conf),禁止所有不需要的服务,如:ftp、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、auth,等等。如果你觉得某些服务有用,可以不禁止这些服务。
· 第四步:改变了“inetd.conf”文件之后,别忘了给inetd进程发一个SIGHUP信号(killall -HUP inetd)。
[root@deep /root]# killall -HUP inetd
· 第五步:为了保证“inetd.conf”文件的安全,可以用chattr命令把它设成不可改变。把文件设成不可改变的只要用下面的命令:
[root@deep]# chattr +i /etc/inetd.conf
“i”属性的文件是不能被改动的:不能删除或重命名,不能创建这个文件的链接,不能往这个文件里写数据。只有系统管理员才能设置和清除这个属性,如果要改变inetd.conf文件,你必须先清除这个不允许改变的标志:
[root@deep]# chattr -i /etc/inetd.conf
但是对于诸如sendmail,named,www等服务,由于它们不象finger,telnet等服务,在请求到来时由inet守护进程启动相应的进程提供服务,而是在系统启动时,作为守护进程运行的。而对于redhat linux,提供了一个linuxconfig命令,可以通过它在图形界面下交互式地设置是否在启动时运行相关服务。也可以通过命令来设置是否启动时启动某个服务,如:[root@deep]# chkconfig -level 35 named off 。
/etc/hosts.allow 文件
但是对于telnet、ftp等服务,如果将其一同关闭,那么对于管理员需要远程管理时,将非常不方便。Linux提供另外一种更为灵活和有效的方法来实现对服务请求用户的限制,从而可以在保证安全性的基础上,使可信任用户使用各种服务。Linux提供了一个叫TCP wrapper的程序。在大多数发布版本中该程序往往是缺省地被安装。利用TCP wrapper你可以限制访问前面提到的某些服务。而且TCP wrapper的记录文件记录了所有的企图访问你的系统的行为。通过last命令查看该程序的log,管理员可以获知谁曾经或者企图连接你的系统。
在/etc目录下,有两个文件:hosts.deny hosts.allow通过配置这两个文件,你可以指定哪些机器可以使用这些服务,哪些不可以使用这些服务。
/etc/services 文件
端口号和标准服务之间的对应关系在RFC 1700 “Assigned Numbers”中有详细的定义。“/etc/services”文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每一台主机上都存在,其文件名是“/etc/services”。只有“root”用户才有权限修改这个文件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删除和改变。为了保护这个文件可以用下面的命令:
[root@deep]# chattr +i /etc/services
/etc/securetty 文件
“/etc/securetty” 文件允许你规定“root”用户可以从那个TTY设备登录。登录程序(通常是“/bin/login”)需要读取“/etc/securetty”文件。它的格式是:列出来的tty设备都是允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的。
/etc/inittab文件
将文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方,这非常重要。
编辑inittab文件(vi /etc/inittab)把这一行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
用下面的命令使改变生效:
[root@deep]# /sbin/init q
/etc/rc.d/init.d/
/etc/rc.d/init.d/下的脚本主要包含了启动服务的脚本程序。一般用户没有什么必要知道脚本文件的内容。所以应该改变这些脚本文件的权限。
[root@deep]# chmod -R 700 /etc/rc.d/init.d/*
这样只有root可以读、写和执行这个目录下的脚本。
Linux的配置与优化
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
Linux作为一个免费的类似UNIX的操作系统,正日益受到人们的重视。本人作为一名Linux爱好者,出于学习,比较了各种不同的Linux发行套件,安装过各种Linux的发行套件,但是每一次安装完成,大量的配置与优化工作花费笔者许多时间,并且非常容易遗漏一些细节。本文以安装与使用RedHat 6.1为例,参考了/usr/doc/HOWTO/Config-HOWTO文档,结合自己的工作经验,谈一些自己的做法。以下的做法基本上适合各种liunx发行套件。
一、关于硬盘分区
关于安装Linux如何建立硬盘分区、交换分区等问题,已经超出本文范围,但是我的经验是安装Linux时一定要建立单独的分区,用于存储用户的私人数据,同时可以用于备份系统的配置文件(如像域名服务器,Samba的配置文件等),便于以后配置。
二、编辑/etc/inittab文件
大部分Linux的发行套件都建立六个虚拟控制台,实际上三个已经足够,并且可以节省可贵的内存空间。编辑/etc/inittab文件,在下面三行的前面加上#。
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
然后执行init q,使系统重新读取/etc/inittab文件,关闭tty4、tty5、tty6虚拟控制台。如果不考虑系统的安全,你可以利用第四个虚拟控制台来查看各种系统信息,编辑/etc/syslog.conf文件,在最后一行加入:
*.* /dev/tty4
最后再执行killall -HUP syslog。
三、建立或者编辑/etc/inputrc、/etc/profile、/etc/bashrc文件
虽然最近几年个人计算机的潮流已经从命令行方式转向图形方式,采用鼠标操作,但是shell在Linux中依然有很强的生命力。shell有好几种,主要有bash、ksh、tcsh、zsh、ash, 用得最多的是bash。只要编辑/etc/inputrc文件,设置INPUTRC的环境变量,利用Tab键的命令补全功能,就可以实现类似于MSDOS的DOSKEY的功能。这样对文件与目录的各种操作,也一样方便与快捷。(附/etc/inputrc文件)
__________________________________________________________________
set bell-style none # don't beep
set meta-flag on # allow 8-bit input
set convert-meta off # don't strip 8-bit characters
set output-meta on # display 8-bit characters correctly
set horizontal-scroll-mode On # scroll long command lines
set show-all-if-ambiguous On # after TAB is pressed
"e[1~": beginning-of-line # home
"e[2~": insert-last-argument # insert
"e[3~": delete-char # delete
"e[4~": end-of-line # end
"e[5~": backward-kill-word # page up
"e[6~": kill-word # page down
# define F7 F8 like msdos doskey
"e[18~": history-search-forward # F7
"e[19~": history-search-backward # F8
__________________________________________________________________
编辑/etc/profile文件,在其尾部插入下面内容:
_________________________________________________
# add by zws
# customize less
#LESS='-M-Q-r'
PS1="[u@h w]$ "
INPUTRC=/etc/inputrc
LESS='-M-r' # -r 为了ls | less 支持彩色。
LESSEDIT="%E ?lt+%lt. %f"
LESSOPEN="| lesspipe.sh %s"
LESSCHARSET=latin1
PAGER=less
export LESS LESSEDIT LESSOPEN LESSCHARSET INPUTRC
_________________________________________________
建立/usr/bin/lesspipe.sh文件,内容如下:
__________________________________________________________________________
#!/bin/sh
# This is a preprocessor for 'less'. It is used when this environment
# variable is set: LESSOPEN="|lesspipe.sh %s"
lesspipe() {
case "$1" in
*.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tvvf - ;;
*.tar) tar tf $1 2>/dev/null ;; # View contents of .tar and .tgz files
*.tgz|*.tar.gz|*.tar.Z|*.tar.z) tar ztf $1 2>/dev/null ;;
*.Z|*.z|*.gz) gzip -dc $1 2>/dev/null ;; # View compressed files correctly
*.zip) unzip -l $1 2>/dev/null ;; # View archives
*.arj) unarj l $1 2>/dev/null ;;
*.rpm) rpm -qpil $1 2>/dev/null ;;
*.cpio) cpio --list -F $1 2>/dev/null ;;
*.bz2) bzip2 -dc $1 2>/dev/null ;; # View compressed files correctly
*.1|*.2|*.3|*.4|*.5|*.6|*.7|*.8|*.9|*.n|*.l|*.man) FILE=`file -L $1`
FILE=`echo $FILE | cut -d ' ' -f 2`
if [ "$FILE" = "troff" ]; then
groff -s -p -t -e -Tascii -mandoc $1
fi ;;
*) file $1 | grep text > /dev/null ;
if [ $? = 1 ] ; then # it's not some kind of text
strings $1
fi ;;
esac
}
lesspipe $1
_________________________________________________________________这样就可以使用less查看以上文件格式的信息与内容。
注意要利用chmod 755 /usr/bin/lesspipe.sh命令将此文件设置为可执行!
/etc/bashrc文件的例子:
____________________________________________
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# For some unknown reason bash refuses to inherit
# PS1 in some circumstances that I can't figure out.
# Putting PS1 here ensures that it gets loaded every time.
# PS1="[u@h w]$ "
eval `dircolors -b`
alias ls='ls --color=yes -F -N' # ls 支持彩色
alias l='ls --color=yes -l -F -N' # l
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
alias df='df -h'
alias ln='ln -i'
lrpm() # list information on an .rpm file
{
if [ $# != 0 ]; then rpm -qilf `which $1` | less; fi
}
lsrpm() # list information on an .rpm file
{
if [ $# != 0 ]; then rpm -qif `which $1` | less; fi
}
set -o noclobber # 避免覆盖与重写文件
____________________________________________
四、编辑/etc/rc.local文件
如果需要定制自己的登录信息,注意要修改/etc/rc.d/rc.local文件,因为每次执行/etc/rc.d/rc.local文件,都需要修改/etc/issue与/etc/issue.net文件,可以注解掉这些命令,编辑定制自己的/etc/issue文件,加快Linux引导过程,并且加入以下内容:
echo "base=0xd8000000 size=0x800000 type=write-combining" >> /proc/mtrr
# Enable NumLock
for tty in /dev/tty[1-3]; do
setleds -D +num < $tty
done
说明:关于第一行命令请看/usr/src/linux/Documentation/mtrr.txt文件。
五、定制vim的环境
在Linux环境中,有许多编辑器,主要有emacs、vim、joe等,对于从没有使用过UNIX或者Linux的人,我的建议是最好找几本有关的参考书,先了解这些编辑器的使用方法,这样安装好Linux后,在编辑与查看一些配置文件时,不至于茫然不知所措。特别是vi,一开始难以掌握,最好开始能够得到高手的指点,一旦上手,简直就像驾驶一辆高速奔驰的赛车,初学者可以到 ftp://ftp.cs.pdx.edu/pub/elvis或者 http://www.vim.org下载相应的版本,它提供支持MSDOS、Windows 98等操作系统的版本,解压后就可以在自己熟悉的环境学习与使用vi。
以下是/usr/share/vim/vimrc的例子:
___________________________________________________________
"" (for Chinese)
" Set file encoding format as 'prc' for Simplified Chinese
" Valid values for 'set fe=' is ansi, japan, korea, prc, taiwan
" We set fe to prc for default, if you need single-byte editing,
" just type ':set fe=ansi' will do the work.
set fe=prc
"" (for Chinese)
"" Set ruler on, you must set this to ensure
"" the Chinese functionality of gvim
set ru
"" For syntax color
if &term=="xterm"
set term=rxvt
set t_Co=8
set t_Sb=^[4%dm
set t_Sf=^[3%dm
endif
syntax on
"" Set visual bell and disable screen flash
" :set vb t_vb=
set bs=2
"" Toggle on/off highlightsearch
map <F8> :set hls!<bar>set hls?<cr>
"" Toggle on/off paste mode
map <F9> :set paste!<bar>set paste?<cr>
"" You can toggle the syntax on/off with this command
if has("syntax_items") | syntax off | else | syntax on | endif
map <F7> :if has("syntax_items") <Bar> syntax off <Bar> else <Bar> syntax on <Bar> endif <CR>
"" Set non-compatible with vi
set nocompatible
"" Set backup extension
" set backup
" set backupext=.bak
" add by zws
set autoindent
set ignorecase
set shiftwidth=4
set showmode
set tabstop=4
set nowrap
"if &t_Co > 1
" syntax on
"endif
"" Map for parenthesis matching
map %
"" search English word
map <F3> <Esc>:set keywordprg=/usr/local/bin/cdict<Esc>K<Esc>:set keyword=man<CR>
map <F6> <Esc>:set keywordprg=man<Esc>K
" backspace
map <BS> X
___________________________________________________________
六、编辑/etc/mtools.conf文件
一般情况下,都是在自己的机器安装Windows 98与Linux两种操作系统,通过安装mtools包,可以不用安装相应的文件系统,允许在MSDOS、Windows 98与Linux的文件系统之间,实现文件的读、写、移动、显示等操作。假设Windows 98安装在/dev/hda1、/dev/hda5分区下,修改/etc/mstools.conf文件,加入以下内容:
drive c: file="/dev/hda1"
drive d: file="/dev/hda5"
这样就可以执行mdir c:等命令。
七、拷贝各种配置文件
根据机器的用途,编辑拷贝相应的配置文件,例如:samba的配置文件/etc/smb.conf,域名服务器的配置文件,DHCP的配置文件/etc/dhcpd.conf等文件,在一般情况下,这些文件一旦配置好,很少发生改动,这样可以节约许多时间,注意原来的配置文件一定要做好备份,如果配置文件发生改动也要做好备份!
八、编译Linux内核
一般各种Linux系统套件安装的内核,都适合大部分的机器,但缺点是大而全,模块中包含有许多自己根本不需要的模块。只有根据自己的要求及机器硬件配置,来配置内核才能达到最优配置。注意在编译内核前,一定要对自己机器有一个全面的了解,这样才能做到心中有数。
以下是编译内核的简要步骤:(以redhat6.1为例说明)
1.进入/usr/src/linux,编辑Makefile文件,修改EXTRAVERSION= -xx,其中xx表示编译的版本号,最好用数字,并且大于原来的数值。
2.根据自己机器的硬件配置,选择相应的选项来配置内核。
#make menuconfig
3.理顺各文件的依存关系,清理以前生成的目标文件及其他文件。
#make clean ; make dep
4.编译内核与安装,并且安装模块。
#make bzImage
#make modules; make modules_install
5.安装内核。
# cp arch/i386/boot/bzImage /boot/vmlinuz-y.y.yy-xx
将内核复制到/boot目录下,其中y.y.yy表示Linux版本号,xx表示编译的版本号。
# cp System.map /boot/System.map-y.y.yy-xx
# cd /boot
# ln -s System.map-y.y.yy-xx System.map
6.编辑lilo的配置文件/etc/lilo.conf(略)。
注意最好保留原来的内核,这样如果新建的内核引导Linux不成功,可以利用旧的内核引导Linux操作系统。
7.测试新内核。
引导完成后,注意检查/lib/modules/y.y.yy-xx目录下,是否建立modules.dep文件。如果文件存在,可以修改/etc/rc.d/rc.sysinit,将有关执行模块依赖的命令的内容注解掉,这样可以加快Linux的启动过程。
linux系统提速手记
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
我的计算机配备如下∶
处理器∶Intel 赛扬 500 MHz
记忆体∶256 Mb PC100 RAM
硬碟∶80Gb 7200 rpm ATA100
显示卡∶tnt2 AGP
声卡∶sb live!
网络卡∶8139
显示器∶mac 796fd2
操作系统∶安装 Win2k server 与 RH7.3 + suse 8.1
一、开启硬盘 DMA 支持。
系统安装完毕後,硬盘的 DMA 是没有打开的,我的方法是在
/etc/rc.d/rc.local 最後面加上一行 /sbin/hdparm -d1 -c3 -m16 /dev/hda 这样每次开机後,硬盘的 DMA 就会开启,不必每次手动设定。
如果您的硬盘机支持 ATA33 可以加上 -X66 这个参数,ATA66则是 -X68,像我的硬盘是 ATA66 那麽完整参数就是 /sbin/hdparm -d1 -X68 -c3 -m16 /dev/hda 经过我的测试 ,在 DMA 未开启以前,实际读取效率是每秒约 4.10 Mb 左右,开启 DMA 後,每秒实际读取效率跃升为 20 Mb 大约提升 5 倍之多。
§未开启 DMA 时的测试
[root@firefly /root]# hdparm -d0 /dev/hda
/dev/hda:
setting using_dma to 0 (off)
using_dma = 0 (off)
[root@firefly /root]# hdparm -Tt /dev/hda
/dev/hda:
Timing buffer-cache reads: 128 MB in 2.75 seconds = 46.55 MB/sec
Timing buffered disk reads: 64 MB in 15.58 seconds = 4.11 MB/sec
§开启 DMA 後的测试结果
[root@firefly /root]# hdparm -d1 -X68 -c3 -m16 /dev/hda
/dev/hda:
setting 32-bit I/O support flag to 3
setting multcount to 16
setting using_dma to 1 (on)
setting xfermode to 69 (UltraDMA mode5)
multcount = 16 (on)
I/O support = 3 (32-bit w/sync)
using_dma = 1 (on)
[root@firefly /root]# hdparm -Tt /dev/hda/dev/hda:
Timing buffer-cache reads: 128 MB in 2.75 seconds = 46.55 MB/sec
Timing buffered disk reads: 64 MB in 3.20 seconds = 20.00 MB/sec
由以上的数据,可以看得出来,硬盘 DMA 是否开启,对读取效率影响很大。
二、关闭多馀的系统服务。
这是老生常谈的题目了,一般我们当作桌上型工作站的时候,只需要激活几个基本的?Service 即可,其他的不但没用,一方面会占用系统资源,另一方面则会有安全上的顾虑,我平常只用来连网、打打文件、听听音乐、看看电影,多半时间只是一个 Client 端,实在没必要激活 Server 端的服务,所以,我在 Setup System Services时,只留下以下几个 Service,其馀的都关闭。
1. crond
2. network
3. syslogd
真的,相信我,只要这四个就足够了!
三、下载 Kernel 重新编程。
因为系统所默认安装的 Kernel 是为了适用大部分的计算机而做的,并未对你的计算机作最优化,所以显得臃肿肥大,因为 Kernel 直接掌控著计算机的一切,所以对系统效率影响当然很大。
我的作法是∶下载最新的 Kernel 重新编程,将我计算机上的硬件直接编程进 Kernel 里面,不要作成 Module ,对於不需要的就不编程,这样,打造出完全面向自己环境的 Kernel ,才能完全发挥计算机的威力。
至於 Kernel 怎样编程?这就不是我的主题了,大家可以到CLDP 自行参考 KERNEL HOW-TO 中译版。
四、减少虚拟终端机的数量。
系统默认是6个,也就是 CTRL+ALT F1~F6 那六个,我关掉其中四个,只留下 CTRL+ALT F1~F2,大约省下 4 Mbytes 的记忆体,但是这样一来,X-Window 会从原来的 CTRL+ALT F7 变成 CTRL+ALT F3 。
修改 /etc/inittab 中,将 mingetty 3 ~6 全部加上 # 字号,然後下指令 #init q
五、调整 X-Windows 环境
我习惯操作 KDE ,对 GNOME 不熟,所以,以下是都是面向 KDE而设,GNOME 的使用者,我想,应该也差不多啦!
1、颜色数设为 16 Bit 就有很好的效果了,24 Bit 除了浪费资源,看不出有何好处。
2、不要使用屏幕保护程序。
3、取消动画窗口功能。
4、尽量使用同一种字型。
5、浏览器用 Mozilla 不要用 Netscape。
6、不要激活音效服务器 artd
Speed Up X by Managing Font Setting 在你抱怨 X 跑得不够快之前,
先检查字型设定, 很可能就是影响效能的一大元凶。
先看一下 /etc/X11/XF86Config-4 档案里的 FontPath 设定值, 如果是
如下∶
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Mandrake 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "unix/:-1"
EndSection
可参考 /etc/X11/fs/config 档案里的字型设定值, 挑选几个喜欢的字型目录(全部比较不会错)
来修改, 例如我直接设定下列几个字型目录∶
Section "Files"
RgbPath "/usr/X11R6/lib/X11/rgb"
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Mandrake 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "/usr/X11R6/lib/X11/fonts/misc:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/Type1"
FontPath "/usr/X11R6/lib/X11/fonts/mdk:unscaled"
FontPath "/usr/share/fonts/ttf/big5"
EndSection
修改之後, 重新激活 startx 感受看看棉。
原本的 FontPath "unix/:-1" 将字型由 X Font Server 来提供,
一般使用者未蒙其利、先受其害, 可以考虑等熟悉 X Font Server 功能後再使用。
如此就可以关掉xfs了
ps:试用时不要用默认开机直接进x-window,若不行会卡在x-window
ps:引用自 http://twopensource.org/~marr/xfont_tip.html
六、调整应用程序优先权。
一般时候,我们使用任何程序时,其 NICE 值都是 0,意思是CPU 的使用权值。如果我们常用程序有较高的优先权的话,自然效率就会比较好,优先权的值从 -20 到 19 ,数字越小优先权就越高,但要注意的是一般使用者只能调低( 0~19),只有 root 有权调高优先权( -20 ~ 19 )。我们可以用 ps -fel 来观察 NI 那栏就知道。
说了半天,到底如何调整呢?有一个指令 /bin/nice 就是用来作这件事的,用法如下∶nice?-n?程序名称?参数....
n 的值从 -20 到 19,这是手动操作,在 KDE 中,可以用选单编辑器来设定,方法是在你要调整优先权的程序的 [ 命令 ] 那一栏的前面,加上 /bin/nice --n 就可以了。
比方说我常用 Mozilla 来浏览网页,我改成 /bin/nice --10 /usr/local/mozilla/mozilla 这样我的 Mozilla 执行时,就比其他程序有更高的优先权,在实际测试的时候,Mozilla 激活速度以及回应都快了不少,其他一些常用的程序,也可以比照办理。
後记
Linux 真的是一套很棒的操作系统,经过这样调整後,光是开机到登入窗口画面出现,从原来的 48 秒,变成 30 秒,用 top 指令(每秒)观察CPU idle 时间也从 82% 提升到 93%,而窗口程序的反应感觉上与 Win me 差不多了。
hdparm硬盘加速
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
06/29/2000 Are you running an Intel Linux system with at least one (E)IDE hard drive? Wouldn't it be neat if there were a magical command to instantly double the I/O performance of your disks? Or, in some cases, show 6 to 10 times your existing throughput? Did you ever just wonder how to tell what kind of performance you're getting on your "tricked-out" Linux box? Don't overlook hdparm(icon_cool.gif. If you've never heard of it, don't worry. Most people I've talked to haven't either. But if you're running an IDE/Linux system (as many folks are,) you'll wonder how you ever got this far without it. I know I did. What's the big deal? So, you've got your brand-new UltraATA/66 EIDE drive with a screaming brand-new controller chipset that supports multiple PIO modes and DMA and the leather seat option and extra chrome... But is your system actually taking advantage of these snazzy features? The hdparm(icon_cool.gif command will not only tell you how your drives are performing, but will let you tweak them out to your heart's content. Now before you get too excited, it is worth pointing out that under some circumstances, these commands CAN CAUSE UNEXPECTED DATA CORRUPTION! Use them at your own risk! At the very least, back up your box and bring it down to single-user mode before proceeding. With the usual disclaimer out of the way, I'd like to point out that if you are using current hardware (i.e. your drive AND controller AND motherboard were manufactured in the last two or three years), you are at considerably lower risk. I've used these commands on several boxes with various hardware configurations, and the worst I've seen happen is the occasional hang, with no data problems on reboot. And no matter how much you might whine at me and the world in general for your personal misfortune, we all know who is ultimately responsible for the well-being of YOUR box: YOU ARE. Caveat Fair Reader. Now, then. If I haven't scared you away yet, try this (as root, preferably in single-user mode): hdparm -Tt /dev/hda You'll see something like: /dev/hda: Timing buffer-cache reads: 128 MB in 1.34 seconds =95.52 MB/sec Timing buffered disk reads: 64 MB in 17.86 seconds = 3.58 MB/sec What does this tell us? The -T means to test the cache system (i.e., the memory, CPU, and buffer cache). The -t means to report stats on the disk in question, reading data not in the cache. The two together, run a couple of times in a row in single-user mode, will give you an idea of the performance of your disk I/O system. (These are actual numbers from a PII/350 / 128M Ram / newish EIDE HD; your numbers will vary.) But even with varying numbers, 3.58 MB/sec is PATHETIC for the above hardware. I thought the ad for the HD said something about 66MB per second!!?!? What gives? Well, let's find out more about how Linux is addressing your drive: hdparm /dev/hda /dev/hda: multcount = 0 (off) I/O support = 0 (default 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) nowerr = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 1870/255/63, sectors = 30043440, start = 0 These are the defaults. Nice, safe, but not necessarily optimal. What's all this about 16-bit mode? I thought that went out with the 386! And why are most of the other options turned off? Well, it's generally considered a good idea for any self-respecting distribution to install itself in the kewlest, slickest, but SAFEST way it possibly can. The above settings are virtually guaranteed to work on any hardware you might throw at it. But since we know we're throwing something more than a dusty, 8-year-old, 16-bit multi-IO card at it, let's talk about the interesting options: multcount: Short for multiple sector count. This controls how many sectors are fetched from the disk in a single I/O interrupt. Almost all modern IDE drives support this. The man page claims: When this feature is enabled, it typically reduces operating system overhead for disk I/O by 30-50%. On many systems, it also provides increased data throughput of anywhere from 5% to 50%. I/O support: This is a big one. This flag controls how data is passed from the PCI bus to the controller. Almost all modern controller chipsets support mode 3, or 32-bit mode w/sync. Some even support 32-bit async. Turning this on will almost certainly double your throughput (see below.) unmaskirq: Turning this on will allow Linux to unmask other interrupts while processing a disk interrupt. What does that mean? It lets Linux attend to other interrupt-related tasks (i.e., network traffic) while waiting for your disk to return with the data it asked for. It should improve overall system response time, but be warned: Not all hardware configurations will be able to handle it. See the manpage. using_dma: DMA can be a tricky business. If you can get your controller and drive using a DMA mode, do it. But I have seen more than one machine hang while playing with this option. Again, see the manpage (and the example on the next page)! Turbocharged So, since we have our system in single-user mode like a good little admin, let's try out some turbo settings: hdparm -c3 -m16 /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 multcount = 16 (on) I/O support = 3 (32-bit w/sync) Great! 32-bit sounds nice. And some multi-reads might work. Let's re-run the benchmark: hdparm -tT /dev/hda /dev/hda: Timing buffer-cache reads: 128 MB in 1.41 seconds =90.78 MB/sec Timing buffered disk reads: 64 MB in 9.84 seconds = 6.50 MB/sec WOW! Almost double the disk throughput without really trying! Incredible. But wait, there's more: We're still not unmasking interrupts, using DMA, or even a using decent PIO mode! Of course, enabling these gets riskier. (Why is it always a trade-off between freedom and security?) The man page mentions trying Multiword DMA mode2, so: hdparm -X34 -d1 -u1 /dev/hda ...Unfortunately this seems to be unsupported on this particular box (it hung like an NT box running a Java app.) So, after rebooting it (again in single-user mode), I went with this: hdparm -X66 -d1 -u1 -m16 -c3 /dev/hda /dev/hda: setting 32-bit I/O support flag to 3 setting multcount to 16 setting unmaskirq to 1 (on) setting using_dma to 1 (on) setting xfermode to 66 (UltraDMA mode2) multcount = 16 (on) I/O support = 3 (32-bit w/sync) unmaskirq = 1 (on) using_dma = 1 (on) And then checked: hdparm -tT /dev/hda /dev/hda: Timing buffer-cache reads: 128 MB in 1.43 seconds =89.51 MB/sec Timing buffered disk reads: 64 MB in 3.18 seconds =20.13 MB/sec 20.13 MB/sec. A far cry from the miniscule 3.58 we started with... By the way, notice how we specified the -m16 and -c3 switch again? That's because it doesn't remember your hdparm settings between reboots. Be sure to add the above line to your /etc/rc.d/* scripts once you're sure the system is stable (and preferably after your fsck runs; having an extensive fs check run with your controller in a flaky mode may be a good way to generate vast quantities of entropy, but it's no way to administer a system. At least not with a straight face...) Now, after running the benchmark a few more times, reboot in multi-user mode and fire up X. Load Netscape. And try not to fall out of your chair. In conclusion This is one of those interesting little tidbits that escapes many "seasoned" Linux veterans, especially since one never sees any indication that the system isn't using the most optimal settings. (Gee, all my kernel messages have looked fine....) And using hdparm isn't completely without risk, but is well worth investigating. And it doesn't stop at performance: hdparm lets you adjust various power saving modes as well. See the hdparm(icon_cool.gif for the final word. Many thanks to Mark Lord for putting together this nifty utility. If your particular distribution doesn't include hdparm (usually in /sbin or /usr/sbin), get it from the source at http://metalab.unc.edu/pub/Linux/system/hardware/ Happy hacking! icon_lol.gif
开启硬盘DMA支持
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
系统安装后没有开启dma支持,为了提高效率,可以开启它。
/etc/rc.d/rc.local 加入一行/sbin/hdparm -d1 -c3 -m16 /dev/hda
如果您的硬盘支持 ATA33 可以加上 -X66 这个参数,ATA66是 -X68。比如ATA66就是:/sbin/hdparm -d1 -X68 -c3 -m16 /dev/hda
我们可以用 hdparm -Tt /dev/hda测试加入前和加入后的效果。以上测试注意有可能带来数据的灾难问题,请不要随意使用。
关于存储器的读和写
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
在计算机内部,数据的读和写是逐级实现的。
1、读的情况:一个数据要从外部到达cpu,则要通过外存---》内存---》二级缓存---》一级缓存---》cpu寄存器---》参与计算。
2、写的情况:一般情况下,cpu产生的数据并没有(也不一定会)马上要写到外存上。那么这些数据往往是先保留在缓存或内存里,直到cpu通知写,写动作才会发生。
3、多个数据要读时,则要排队;同样,多个数据要写时,也要排队。
4、当同时有读和写的动作请求时,cpu必须安排好他们的顺序。
例子:
1、cpu要读一个数据:当前指令寄存器中找不到该数据,则cpu会从一级缓存当中查找,没有则查二级缓存,然后依次是内存、外存。
2、cpu读入一个数据后,内存、二级缓存、一级缓存都有该数据。随着数据读入的增加,缓存会满。这时就需要一个放弃的策略。先进后出法或先进先出法,还有一种策略:使用率最高的数据保留。
3、这样,缓存或内存中就有好多数据。当cpu要查找数据时,也要有一种策略:相联(全相联、半相联、部分相联)。就是把缓存划分成若干个相对独立的区域,查找数据时按照某个策略查找,这样效率会高些。
4、当cpu有数据要“写”到缓存时,这种数据要优先考虑保留,直到cpu“写”通知到达。
5、当读和写要求同时发生时,会发生2种情况:先读后写,先写后读。这两种情况都要认真考虑。比如:
(1)要写的数据地址刚好是要读的数据地址。先读后写使得读的是旧数据,当你需要的是最新的数据时,就出错了;先写后读使得原来的数据被覆盖了,当你需要原来的数据时,这时读出来的数据也是错。
(2)要写的数据地址虽然不是马上要读的数据,但它的中间结果还保留在缓存中。这样也会产生错误。
这也称为数据相关性。设计程序时应尽量避免(或减少)发生数据相关。虽然程序编译时会优化数据相关性。
分区大小调整完全手册
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
摘要
本文以一个例子介绍调整分区大小的完整过程。(2004-03-25 16:59:41)
环境
服务器安装有一个60G的硬盘,目前已经划分为/、/home、/chroot和/swap,详细的分区信息如何下所示:
Command (m for help): p
Disk /dev/hda: 61.4 GB, 61492838400 bytes
255 heads, 63 sectors/track, 7476 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 915 7349706 83 Linux
/dev/hda2 916 1414 4008217+ 83 Linux
/dev/hda3 1415 7476 48693015 5 Extended
/dev/hda5 1415 1477 506016 82 Linux swap
/dev/hda6 1478 7476 48186936 83 Linux
然后现在希望从/home分区里面分出大约4GB的空间用于安装FreeBSD。
过程
首先,我们需要调整文件系统的大小(注意是文件系统,而不是分区的大小),然后对调整完毕的文件系统进行检查,然后再进一步调整分区的大小。
文章以我自己用的系统为例子,实际操作时根据情况调整即可。
用惯了传统调整硬盘工具的人可能会认为文件系统和硬盘的分区之间是统一的,实际上他们之间并不是完整的整体(这也就是为什么BSD可以在一个硬盘分区里面制作多个文件系统分区)。想像一下带有移动式书架的书橱。你可以通过移动式书架调整书橱里面书籍的位置。把书当成文件系统,你可以在书橱里面放满书籍,也可以通过移动式书架调整书橱的空间。当然也可以通过书架调整书橱里面书籍存放的位置。如下图所示:
|<-- hda1------>|<-- hda2------>|
+---------------+---------------+
|XXXXXXXXXXXXXXX|XXXXXXXXXX| |
|XXXXXXXXXXXXXXX|XXXXXXXXXX| |
+---------------+---------------+
硬盘分区/dev/hda1中的文件系统占满了整个分区,而/dev/hda2中的文件系统只占用了2/3左右的分区。
基本的原理就是这样,现在让我们开始调整/dev/hda6中文件系统的大小:
[root@ringmail root]# umount /home
[root@ringmail root]# resize_reiserfs -s 43000M /dev/hda6
<-------------resize_reiserfs, 2002------------->
reiserfsprogs 3.6.4
You are running BETA version of reiserfs shrinker.
This version is only for testing or VERY CAREFUL use.
Backup of you data is recommended.
Do you want to continue? [y/N]:y
Processing the tree: 0%
....20%....40%....60%....80%....100% left 0, 301020 /sec
nodes processed (moved):
int 56 (0),
leaves 8124 (0),
unfm 6313240 (0),
total 6321420 (0).
check for used blocks in truncated region
ReiserFS report:
blocksize 4096
block count 11008000 (12046734)
free blocks 4678034 (5716736)
bitmap block count 336 (368)
Syncing..done
由于/home原来的大小是47057,而我们希望在/home里面划分4G的空间出来,取整数/home的目标大小就是43000。所以在resize_reiserfs时为-s提供大小为43000M。
这样我们就已经完成了文件系统大小调整的工作,下面让我们计算一下目标分区的大小,这个大小需要根据你的fdisk里面的Units值来计算,因为硬盘分区都是按照柱面来划分的,基本的计算方法为:43000*1024*1024/8225280= 5481.7304699657640834111422346716,然后我们取最接近的值5482+1478=6960来作为分区结束的柱号,这里面的1478是/home分区开始的柱面号,在前面的fdisk里面可以看到。
调整完文件系统的大小以后,再使用以下命令以文件系统进行全面的检查:
[root@ringmail root]# reiserfsck --check --fix-fixable /dev/hda6
现在我们已经完成文件系统的大小调整工作,但是硬盘分区的大小仍然没有调整,还是跟先前一样大(可以想像我们从书橱里面拿走了几本书,而书架的大小并没有调整,依然占用着原来的空间)。
现在我们要开始进行整个操作里面最危险的操作:如果没有必要的话,最好不要进行下去:-D,不过不必过于担心,按照以下操作进行即可。
启动fdisk,并按照以下步骤进行:
[root@ringmail root]# fdisk /dev/hda
The number of cylinders for this disk is set to 7476.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): p
Disk /dev/hda: 61.4 GB, 61492838400 bytes
255 heads, 63 sectors/track, 7476 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 915 7349706 83 Linux
/dev/hda2 916 1414 4008217+ 83 Linux
/dev/hda3 1415 7476 48693015 5 Extended
/dev/hda5 1415 1477 506016 82 Linux swap
/dev/hda6 1478 7476 48186936 83 Linux
Command (m for help): d
Partition number (1-6): 6
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (1478-7476, default 1478): 1478
Last cylinder or +size or +sizeM or +sizeK (1478-7476, default 7476): 6960
Command (m for help): p
Disk /dev/hda: 61.4 GB, 61492838400 bytes
255 heads, 63 sectors/track, 7476 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 915 7349706 83 Linux
/dev/hda2 916 1414 4008217+ 83 Linux
/dev/hda3 1415 7476 48693015 5 Extended
/dev/hda5 1415 1477 506016 82 Linux swap
/dev/hda6 1478 6960 44042166 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource
busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
这里需要说明的是,由于内核仍然使用旧的分区表,我需要通过重新启动才可以刷新刚制作的分区信息,所以在进行完重划分区操作以后,我对系统进行了重新启操作。系统重启后再继续后续的操作过程。
通过以上步骤,我们已经完成了硬盘分区大小调整的操作,接下来回到重新调整文件系统大小的问题上来。由于硬盘分区是按照柱面来计划的,我们要在 resize_reiserfs步骤上就一步到位调整文件系统大小与硬盘分区大小正好相等是比较困难的事情。所以一般是调硬盘分区比文件系统要大一点点,然后再通过以下命令进行同步(当然如果你不在意硬盘分区里面存在部分空间的话也可以忽略以下步骤):
[root@ringmail root]# umount /home/
[root@ringmail root]# resize_reiserfs /dev/hda6
<-------------resize_reiserfs, 2002------------->
reiserfsprogs 3.6.4
ReiserFS report:
blocksize 4096
block count 11010541 (11008000)
free blocks 4680574 (4678034)
bitmap block count 337 (336)
Syncing..done
完成以后原有分区的大小调整操作已经结束,接下来需要创建新分区:
[root@ringmail root]# fdisk /dev/hda
The number of cylinders for this disk is set to 7476.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): p
Disk /dev/hda: 61.4 GB, 61492838400 bytes
255 heads, 63 sectors/track, 7476 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 915 7349706 83 Linux
/dev/hda2 916 1414 4008217+ 83 Linux
/dev/hda3 1415 7476 48693015 5 Extended
/dev/hda5 1415 1477 506016 82 Linux swap
/dev/hda6 1478 6960 44042166 83 Linux
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (6961-7476, default 6961):
Using default value 6961
Last cylinder or +size or +sizeM or +sizeK (6961-7476, default 7476):
Using default value 7476
Command (m for help): t
Partition number (1-7): 7
Hex code (type L to list codes): a5
Changed system type of partition 7 to a5 (FreeBSD)
Command (m for help): p
Disk /dev/hda: 61.4 GB, 61492838400 bytes
255 heads, 63 sectors/track, 7476 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 915 7349706 83 Linux
/dev/hda2 916 1414 4008217+ 83 Linux
/dev/hda3 1415 7476 48693015 5 Extended
/dev/hda5 1415 1477 506016 82 Linux swap
/dev/hda6 1478 6960 44042166 83 Linux
/dev/hda7 6961 7476 4144738+ a5 FreeBSD
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource
busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
至此,整个调整分区大小及创建新分区的操作全部完成。
blockdev --rereadpt /dev/hda
kernel can re-read the partitions table.
hdparm -z <dev>
is also okay, and easier to remember
调谐LINUX网络性能之调试工具篇
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
本文是调协Linux系统网络性能的第一篇,主要介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能。
route
在配置网络时,要为机器指定接收数据包时该包要经过的路径。在Linux系统中,提供一个命令route,这个命令可以为ifconfig命令配置的网卡设置静态路由。这种设置工作通常在/etc/rc.d/rc.inet1中引入,在系统引导时进行。
我们通过几个例子来说明如何使用route命令:
route add -net 127.0.0.0
这个命令将向路由表中添加一个指定地址或者网络的路由。注意此时网络为A类地址,掩码被设置为255.0.0.0,这个新添加的条目被连接到lo设备上。
route add -net xxx.xxx.xxx.xxx netmask 255.255.255.0 dev eth0
这个命令为IP地址为xxx.xxx.xxx.xxx的主机增加一个路由,它的网络掩码被设置为255.255.255.0。
route del -net xxx.xxx.xxx.xxx
此命令将删除xxx.xxx.xxx.xxx这个网络的路由。
使用route命令还可以很方便地对整个网络的路由信息进行管理,其输出结果是网络的路由表。如下所示:
-----------------------------------------------------------------
[root@lee /root]#route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.10.8.224 * 255.255.255.255 UH 0 0 0 eth0
10.10.8.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default dgc8.njupt.edu 0.0.0.0 UG 0 0 0 eth0
default dgc8.njupt.edu 0.0.0.0 UG 1 0 0 eth0
[root@lee /root]#
-----------------------------------------------------------------
输出结果中各个字段的含义是:
· Destination表示路由的目标IP地址。
· Gateway表示网关使用的主机名或者是IP地址。上面输出的"*"表示没有网关。
· Genmask表示路由的网络掩码。在把它与路由的目标地址进行比较之前,内核通过Genmask和数据包的IP地址进行按位"与"操作来设置路由。
· Flags是表示路由的标志。可用的标志及其意义是:U表示路由在启动,H表示target是一台主机,G表示使用网关,R表示对动态路由进行复位设置;D表示动态安装路由,M表示修改路由,!表示拒绝路由。
· Metric表示路由的单位开销量。
· Ref表示依赖本路由现状的其它路由数目。
· Use表示路由表条目被使用的数目。
· Iface表示路由所发送的包的目的网络。
通过查看这些输出信息,我们就可以方便地管理网络的路由表了。
netstat
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。在计算机上执行netstat后,其输出结果如下所示:
-----------------------------------------------------------------
[root@lee /root]#netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Types State I-Node Path
Unix 5 [ ] DGRAM 460 /dev/log
Unix 0 [ ] STREAM CONNECTED 173 @00000014
Unix 0 [ ] DGRAM 662
Unix 0 [ ] DGRAM 631
Unix 0 [ ] DGRAM 544
Unix 0 [ ] DGRAM 484
Unix 0 [ ] DGRAM 470
[root@lee /root]#
-----------------------------------------------------------------
从整体上看,netstat的输出结果可以分为两个部分:第一部分:是Active Internet connections,称为有源TCP连接,在上面的输出结果中,这一部分没有内容,表示暂时还没有TCP连接。第二部分:是Active UNIX domain sockets,称为有源Unix域套接口。输出结果显示的是Unix域套接口的连接情况:
· Proto显示连接使用的协议。
· RefCnt表示连接到本套接口上的进程号。
· Types显示套接口的类型。
· State显示套接口当前的状态。
· Path表示连接到套接口的其它进程使用的路径名。
可以用netstat -a来查看所有套接字的状态,这在您调试网络程序的时候是非常有用的。netstat -r将显示路由表的内容,一般还要同时指定"-n"选项,这样可以得到数字格式的地址,也可显示默认路由器的IP地址。使用netstat -i则将显示所有的网络接口信息。使用netstat还可以获得当前的网络状态以及网络的拓扑结构,这在实际中是非常有用的。
tcpdump
tcpdump命令用于监视TCP/IP连接并直接读取数据链路层的数据包头。您可以指定哪些数据包被监视、哪些控制要显示格式。例如我们要监视所有Ethernet上来往的通信,执行下述命令:
tcpdump -i eth0
即使是在一个相对平静的网络上,也有很多的通信,所以我们可能只需要得到我们感兴趣的那些数据包的信息。在一般情况下,TCP/IP栈只为本地主机接收入站的数据包绑定同时忽略网络上的其它计算机编址(除非您使用的是一台路由器)。当运行tcpdump命令时,它会将TCP/IP栈设置为 promiscuous模式。该模式可接收所有的数据包并使其有效显示。如果我们关心的只是我们本地主机的通信情况,一种方法是使用“-p”参数禁止 promiscuous模式,还有一种方法就是指定主机名:
tcpdump -i eth0 host hostname
此时,系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
tcpdump -i eth0 src host hostname
下面的命令可以监视所有送到主机hostname的数据包:
tcpdump -i eth0 dst host hostname
我们还可以监视通过指定网关的数据包:
tcpdump -i eth0 gateway Gatewayname
如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
tcpdump -i eth0 host hostname and port 80
该命令将显示从每个数据包传出的头和来自主机hostname对端口80的编址。端口80是系统默认的HTTP服务端口号。如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
巧用tmpfs加速你的linux服务器
2004-04-23 15:18 pm
来自:Linux文档
现载: Www.8s8s.coM
地址:无名
今天又学了一招,就是使用虚拟磁盘来存放squid的缓存文件和php的seesion。速度快不少哦!
默认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样。象虚拟磁盘一样,tmpfs可以使用您的RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个mkfs之类的命令才能真正地使用它,tmpfs是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
tmpfs有以下优势:
1. 动态文件系统的大小;
2. tmpfs的另一个主要的好处是它闪电般的速度。因为典型的tmpfs文件系统会完全驻留在RAM中,读写几乎可以是瞬间的;
3. tmpfs数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。
好了,讲了一些大道理,大家看烦了吧,还是讲讲我的应用吧:)
首先在/dev/shm建个tmp文件夹,然后与实际/tmp绑定:
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp
应用实例: 1. squid的缓存目录设置
vi /etc/squid/squid.conf
修改成
cache_dir ufs /tmp 256 16 256
这里的第一个256表示使用256M内存,我觉得 http://www.linuxaid.com.cn/articles/4/4/441672019.shtml里使用ramdisk的方法还不如直接使用tmpfs,至少每次启动不用mkfs,还可以动态改变大小。这时的/tmp实际就是dev/shm/tmp。
然后重启一下服务,ok,现在所有的squid缓存文件都保存倒tmpfs文件系统里了,很快哦。
2. 对php性能的优化
对于一个访问量大的以apache+php的网站,可能tmp下的临时文件都会很多,比如seesion或者一些缓存文件,那么你可以把它保存到tmpfs文件。
保存seesion的方法很简单了,只要修改php.ini就行了,由于我已经把/dev/stm/tmp与/tmp绑定,所以不改写也行,至于php程序产生的缓存文件那只能改自己的php程序了:)
至于tmpfs的其他应用,我想大家可能通过这篇文章会有所启发。
性能优化参考2007-08-23 12:35性能分析工具
CPU性能分析工具:
vmstat
ps
sar
time
strace
pstree
top
Memory性能分析工具:
vmstat
strace
top
ipcs
ipcrm
cat /proc/meminfo
cat /proc/slabinfo
cat /proc/<pid #>/maps
I/O性能分析工具:
vmstat
iostat
repquota
quotacheck
Network性能分析工具:
ifconfig
ethereal
tethereal
iptraf
iwconfig
nfsstat
mrtg
ntop
netstat
cat /proc/sys/net
Linux 性能调优工具
当通过上述工具及命令,我们发现了应用的性能瓶颈以后,我们可以通过以下工具或者命令来进行性能的调整。
CPU性能调优工具:
nice / renic
sysctl
Memory性能调优工具:
swapon
ulimit
sysctl
I/O性能调优工具:
edquota
quoton
sysctl
boot line:
elevator= <ioscheduler>
Network性能调优工具:
ifconfig
iwconfig
sysctl
CPU性能调整
当一个系统的CPU空闲时间或者等待时间小于5%时,我们就可以认为系统的CPU资源耗尽,我们应该对CPU进行性能调整。
CPU性能调整方法:
编辑/proc/sys/kernel/中的文件,修改内核参数。
#cd /proc/sys/kernel/
# ls /proc/sys/kernel/
acct hotplug panic real-root-dev
cad_pid modprobe panic_on_oops sem
cap-bound msgmax pid_max shmall
core_pattern msgmnb powersave-nap shmmax
core_uses_pid msgmni print-fatal-signals shmmni
ctrl-alt-del ngroups_max printk suid_dumpable
domainname osrelease printk_ratelimit sysrq
exec-shield ostype printk_ratelimit_burst tainted
exec-shield-randomize overflowgid pty threads-max
hostname overflowuid random version
一般可能需要编辑的是pid_max和threads-max,如下:
# sysctl kernel.threads-max
kernel.threads-max = 8192
# sysctl kernel.threads-max=10000
kernel.threads-max = 10000
Memory性能调整
当一个应用系统的内存资源出现下面的情况时,我们认为需要进行Memory性能调整:
页面频繁换进换出;
缺少非活动页。
例如在使用vmstat命令时发现,memory的cache使用率非常低,而swap的si或者so则有比较高的数据值时,应该警惕内存的性能问题。
Memory性能调整方法:
1。关闭非核心的服务进程。
相关的方法请见CPU性能调整部分。
2。修改/proc/sys/vm/下的系统参数。
# ls /proc/sys/vm/
block_dump laptop_mode nr_pdflush_threads
dirty_background_ratio legacy_va_layout overcommit_memory
dirty_expire_centisecs lower_zone_protection overcommit_ratio
dirty_ratio max_map_count page-cluster
dirty_writeback_centisecs min_free_kbytes swappiness
hugetlb_shm_group nr_hugepages vfs_cache_pressure
# sysctl vm.min_free_kbytes
vm.min_free_kbytes = 1024
# sysctl -w vm.min_free_kbytes=2508
vm.min_free_kbytes = 2508
# cat /etc/sysctl.conf
…
vm.min_free_kbytes=2058
…
3。配置系统的swap交换分区等于或者2倍于物理内存。
# free
total used free shared buffers cached
Mem: 987656 970240 17416 0 63324 742400
-/+ buffers/cache: 164516 823140
Swap: 1998840 150272 1848568
I/O性能调整
系统出现以下情况时,我们认为该系统存在I/O性能问题:
系统等待I/O的时间超过50%;
一个设备的平均队列长度大于5。
我们可以通过诸如vmstat等命令,查看CPU的wa等待时间,以得到系统是否存在I/O性能问题的准确信息。
I/O性能调整方法:
1。修改I/O调度算法。
Linux已知的I/O调试算法有4种:
deadline - Deadline I/O scheduler
as - Anticipatory I/O scheduler
cfq - Complete Fair Queuing scheduler
noop - Noop I/O scheduler
可以编辑/etc/yaboot.conf文件修改参数elevator得到。
# vi /etc/yaboot.conf
image=/vmlinuz-2.6.9-11.EL
label=linux
read-only
initrd=/initrd-2.6.9-11.EL.img
root=/dev/VolGroup00/LogVol00
append="elevator=cfq rhgb quiet"
2。文件系统调整。
对于文件系统的调整,有几个公认的准则:
将I/O负载相对平均的分配到所有可用的磁盘上;
选择合适的文件系统,Linux内核支持reiserfs、ext2、ext3、jfs、xfs等文件系统;
# mkfs -t reiserfs -j /dev/sdc1
文件系统即使在建立后,本身也可以通过命令调优;
tune2fs (ext2/ext3)
reiserfstune (reiserfs)
jfs_tune (jfs)
3。文件系统Mount时可加入选项noatime、nodiratime。
# vi /etc/fstab
…
/dev/sdb1 /backup reiserfs acl, user_xattr, noatime, nodiratime 1 1
4。调整块设备的READAHEAD,调大RA值。
[root@overflowuid ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
…
rw 256 512 4096 0 71096640 /dev/sdb
rw 256 512 4096 32 71094240 /dev/sdb1
[root@overflowuid ~]# blockdev --setra 2048 /dev/sdb1
[root@overflowuid ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
…
rw 2048 512 4096 0 71096640 /dev/sdb
rw 2048 512 4096 32 71094240 /dev/sdb1
Network性能调整
一个应用系统出现如下情况时,我们认为该系统存在网络性能问题:
网络接口的吞吐量小于期望值;
出现大量的丢包现象;
出现大量的冲突现象。
Network性能调整方法:
1。调整网卡的参数。
# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Half
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: d
Wake-on: d
Current message level: 0x00000007 (7)
Link detected: yes
#ethtool -s eth0 duplex full
#ifconfig eth0 mtu 9000 up
2。增加网络缓冲区和包的队列。
# cat /proc/sys/net/ipv4/tcp_mem
196608 262144 393216
# cat /proc/sys/net/core/rmem_default
135168
# cat /proc/sys/net/core/rmem_max
131071
# cat /proc/sys/net/core/wmem_default
135168
# cat /proc/sys/net/core/wmem_max
131071
# cat /proc/sys/net/core/optmem_max
20480
# cat /proc/sys/net/core/netdev_max_backlog
300
# sysctl net.core.rmem_max
net.core.rmem_max = 131071
# sysctl -w net.core.rmem_max=135168
net.core.rmem_max = 135168
3。调整Webserving。
# sysctl net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_reuse = 0
# sysctl -w net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_reuse = 1
# sysctl net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_recycle = 0
# sysctl -w net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_recycle = 1
优化squid性能
一.文件系统调节
1.硬盘不要使用RAID
2.使用性能好的FS(例如: ReiserFS)
在fstab里面添加noatime,async项,提高文件系统的性能.
二. aufs存储机制
编辑squid-2.6.STABLE13/src/fs/aufs/store_asyncufs.h
#define ASYNC_WRITE 0 (把0修改为:1)
pthread_create(), SMP优越. (线程制)
编辑squid-2.6.STABLE13/include/autoconf.h
define DEFAULT_FD_SETSIZE 1024{1024修改为:65536}
diskd存储机制
通过消息队列和共享内存来实现进程间通信
使用Diskd存储机制而对 kernel.msgmnb等的调整
kernel.msgmnb = 16384
每个消息队列的最大字节限制
kernel.msgmni = 16 (此值可以根据需要增大)
整个系统的最大数量的消息队列, Squid对每个Cache_dir 使用两个队列, 假如你有2个磁盘,那就有2个队列.
kernel.msgmax = 8192
每个消息的最大size.
[root@jackbillow~]# sysctl -a |grep msgmnb
kernel.msgmnb = 16384
[root@jackbillow ~]# sysctl -a |grep msgmni
kernel.msgmni = 16
[root@jackbillow ~]# sysctl -a |grep msgmax
kernel.msgmax = 8192
[root@jackbillow ~]# sysctl -a |grep shmall
kernel.shmall = 2097152
[root@jackbillow ~]# sysctl -a |grep shmmni
kernel.shmmni = 4096
[root@jackbillow~]# sysctl -a |grep shmmax
kernel.shmmax = 2147483648
Linux优化[翻译]
在
http://www.faqs.org
上面有一篇
《Securing and Optimizing Linux》
以前看过一些!
这几天使用FC2感觉速度磁盘读写有点慢,因此想做一个系统优化。
于是想到了这篇文章(应该说时book才对)。
我就准备就我了解的写下来,就当作是这本书的摘要翻译吧,改写RedHat编写这样好的书本。
我的E文一般,翻译的目的一方面方便一些E文比我菜的人(这样的人有吗?哦,我白费了),二方面锻炼自己的E文水平吧,主要是专业英语,通用英语我现在忘得差不多了。
如果翻译得不对得,请大家指出来,在翻译得同时,我也会加上我个人的见解(也许是不正确的),所有我个人的见解会特别指出。
这本书的前5章是将linux安全的,现在还不想翻译。从第六章开始,有些是有关程序编译优化的,我可能会跳过。
完整的文章,可以点击下面的链接
http://www.faqs.org/docs/securing/index.html
chapter 6. Linux General Optimization
Generally, if you don't use a x386 Intel processor, Red Hat Linux out of the box is not optimized for your specific CPU architecture, most people now run Linux on a Pentium processor. The sections below will guide you through different steps to optimize your Linux server for your specific processor, memory, and network, as well as your file system.
第六章:Linux通用优化
一般来讲,你现在应该没有使用Intel 386的CPU了,RedHat没有针对特定的CPU做优化(使用的是通用的方式,译者 加)。大多数人们现在的计算机都是使用奔腾级或者更新的CPU。这一节将指导你使用各种办法针对你的特定的CPU,内存,网络和文件系统来优化你的linux服务器(其实linux个人版也是一样的,译者加),
6.1. The /etc/profile file
The /etc/profile file contains system wide environment stuff and startup programs. All customizations that you put in this file will apply for the entire environment variable on your system, so putting optimization flags in this file is a good choice. To squeeze the most performance from your x86 programs, you can use full optimization when compiling with the -O9 flag. Many programs contain -O2 in the Makefile. -O9 is the highest level of optimization. It will increase the size of what it produces, but it runs faster.
6.1 /etc/profile文件
/etc/profile文件包含了系统的大量环境变量和程序开始运行的信息。对这个文件的修改和定制将影响你系统的整个环境变量(不管你是什么用户,译者加,这和修改家目录的.bashrc, .bash_profile不一样)。因此从这里开始优化和把一些优化信息的标志写到这里是一个不错的选择。为了尽可能提高你在X86上编译的程序的性能,你可以在编译车程序时,使用-O9的标志。大部分Makefile(绝大部分源代码编译的配置文件)使用的是-O2的标志。-O9表示最大的优化。他会增加文件的大小,但是运行的更快(不要认为小就快,译者注)。
2004-5-23 18:12 mlsx
Please Note it is not always true that the -O9 flag will make the best performance for your processor. If you have an x686 and above processor, surely, but below x686, not necessarily.
When compiling, use the -fomit-frame-pointer switch for any kind of processor you may have. This will use the stack for accessing variables. Unfortunately, debugging is almost impossible with this option. You can also use the -mcpu=cpu_type and -march=cpu_type switch to optimize the program for the CPU listed to the best of GCC's ability. However, the resulting code will only be run able on the indicated CPU or higher.
The optimization options apply only when we compile and install a new program in our server. These optimizations don't play any role in our Linux base system; it just tells our compiler to optimize the new programs that we will install with the optimization flags we have specified in the /etc/profile file.
Below are the optimization flags that we recommend you put in your /etc/profile file depending on your CPU architecture.
Recommended optimization flags
注意:并不是说使用-O9的标志就一定能获得最佳性能。如果你是686或以上CPU,而不是古老的386CPU,那么这个标志就没有必要了。
当编译一个程序时,可以使用 -fomit-frame-pointer 开关(标志)来针对各种CPU。这样编译出来的程序将使用堆栈(stack)来访问变量。不幸的时,如果要调试这样的程序几乎不可能。你可以使用-mcpu=cpu_type 和 -march=cpu_type 开关来优化程序。这些CPU类型会在GCC可以优化的CPu列表中列出,但是这样的程序只能在对应的或者更高级别的系列CPU上面运行(同一个程序,有-i386和-i586的rpm包,就是这个意思,译者加)。
这些优化选项只有在当我们编译和安装一个新程序(指源代码安装方式,译者加)才有效。这些优化标志不会对我们安装好的基本linux系统产生任何影响。他只是告诉编译器来优化新的程序。这些标志我们可以放到/etc/profile文件中。
下面列出了有些我们建议的根据不同CPU架构的优化标志。
建议的优化标志
For CPU i686 or PentiumPro, Pentium II, Pentium III In the /etc/profile file, put this line for a PentiumPro, Pentium II and III Pro Processor family:
对于i686或者 PentiumPro, Pentium II, Pentium III 的CPU,可以在/etc/profile 文件中加入下面的一些优化标志:
[code:8eb8c8c901]
CFLAGS=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions [/code:8eb8c8c901]
or CPU i586 or Pentium: In the /etc/profile file, put this line for a Pentium Processor family:
对于i586或者 Pentium ,在/etc/profile文件中加入下面这行
[code:8eb8c8c901]
CFLAGS=-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions[/code:8eb8c8c901]
For CPU i486: In the /etc/profile file, put this line for a i486 Processor family:
对于i486 CPU,加入下面这行:
[code:8eb8c8c901]
CFLAGS=-O3 -funroll-all-loops -malign-double -mcpu=i486
-march=i486 -fomit-frame-pointer -fno-exceptions [/code:8eb8c8c901]
Now after the selection of your CPU settings -i686, i586, or i486 a bit further down in the /etc/profile file, add CFLAGS LANG LESSCHARSET to the export line:
现在,在上面设置CPU类型的优化标志后面增加CFLAGS LANG LESSCHARSET 环境变量来导出:
[code:8eb8c8c901]
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER
LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET[/code:8eb8c8c901]
Log out and log back in; after this, the new CFLAGS environment variable is set, and software and other configure tool will recognize that. Pentium Pro/II/III optimizations will only work with egcs or pgcc compilers. The egcs compiler is already installed on your Server by default so you don't need to worry about it.
注销再登陆,新的CFLAGS环境变量及设置好了,这个标志将被需要使用他的软件或者其他配置文件来识别。 Pentium Pro/II/III优化只能使用 egcs或 pgcc编译器。这些编译器缺省安装好了,不用担心没有。
2004-5-23 20:06 mlsx
Below is the explanation of the different optimization options we use:
下面是对不同的优化的解释:
-funroll-loops
The -funroll-loops optimization option will perform the optimization of loop unrolling and will do it only for loops whose number of iterations can be determined at compile time or run time.
-funroll-loops 标志将优化循环指令,他只对那些编译时或者运行时就知道循环次数的指令优化(比如for(i=0;i<33;i++),译者加)。
-funroll-all-loops
The -funroll-all-loops optimization option will also perform the optimization of loop unrolling and is done for all loops.
-funroll-all-loops优化所有的循环。
-ffast-math
The -ffast-math optimization option will allow the GCC compiler, in the interest of optimizing code for speed, to violate some ANSI or IEEE rules/specifications.
-ffast-math 优化选项将运行GCC编译器为了提高速度而产生一些优化代码,这些代码可能与ANSI 后者IEEE规定/规章相冲突。
-malign-double
The -malign-double optimization option will control whether the GCC compiler aligns double, long double, and long long variables on a two-word boundary or a one-word boundary. This will produce code that runs somewhat faster on a Pentium at the expense of more memory.
-maling-double优化标志将决定GCC编译器是否将 double, long double, and long long 变量按照双字或者字边界对齐。这种情况下产生的代码在Pentium 的CPU上面可能会运行得快一些,但是花费了更多得内存。
-mcpu=cpu_type
The -mcpu=cpu_type optimization option will set the default CPU to use for the machine type when scheduling instructions.
改标志时根据指定得CPU类型来使用缺省得优化标志和机器代码。
-fforce-mem
The -fforce-mem optimization option will produce better code by forcing memory operands to be copied into registers before doing arithmetic on them and by making all memory references potential common subexpressions.
该标志通过迫使在做算术运算时将数据copy到寄存器中来产生更好得代码。(似乎不通,译者加)
-fforce-addr
The -fforce-addr optimization option will produce better code by forcing memory address constants to be copied into registers before doing arithmetic on them.
该标志通过迫使做算术运算时将内存地址常量copy到寄存器中来产生更好的代码。
-fomit-frame-pointer
The -fomit-frame-pointer optimization option, one of the most interesting, will allow the program to not keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restores frame pointers; it also makes an extra register available in many functions and makes debugging impossible on most machines.
该标志时优化标志中最感兴趣的一个,他将使程序不保留那些函数不需要的桢指针。这就避免指令来保存、设置和恢复桢指针;它也使得在很多函数中有了一个额外得寄存器,这种方式使得程序在很多机器上都不能调试。
2004-5-23 21:25 mlsx
6.2-6.4 节是上面优化开关的测试结果,省略。
6.5 The bdflush parameters
The bdflush file is closely related to the operation of the virtual memory VM subsystem of the Linux kernel and has a little influence on disk usage. This file /proc/sys/vm/bdflush controls the operation of the bdflush kernel daemon. We generally tune this file to improve file system performance. By changing some values from the default as shown below, the system seems more responsive; e.g. it waits a little more to write to disk and thus avoids some disk access contention.
The default setup for the bdflush parameters under Red Hat Linux is: "40 500 64 256 500 3000 500 1884 2" To change the values of bdflush, type the following command on your terminal:
6.5 bdflush参数
bdflush文件和Linux内核的VM(Virtual Machine)子系统中的虚拟内存操作有很大的关系,对磁盘使用影响不大。文件//proc/sys/vm/bdflush控制bdflush内核后台(精灵或者守护)经常的行为。我们通常调试该文件来提高文件系统的性能。通过改变下面列出的缺省值,文件系统应答就会更积极。比如,将磁盘写时间设置稍微长一点就可以避免磁盘访问竞争。
RedHat Linux的bdflush缺省设置是“ 40 500 64 256 500 3000 500 1884 2”。在在命令行键入下面的命令来改变bdflush的值:
redhat6.1中使用下面的命令
[root@deep] /# echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush
You may add the above commands to the /etc/rc.d/rc.local script file and you'll not have to type it again the next time you reboot your system.
你可以将上面的命令加入到/etc/rc.d/rc.local脚本中,这样系统再次重启使你不必要再键入这个命令,它会自动运行。
Edit the /etc/sysctl.conf file and add the following line:
对于redhat6.2及以后的版本,编辑/etc/sysctl.conf文件,加入下面这行
# Improve file system performance
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
You must restart your network for the change to take effect. The command to manually restart the network is the following:
你必须重新起动网络来使改动值生效。手工重启网络的命令如下:
[root@deep] /# /etc/rc.d/init.d/network restart
In our example above, according to the/usr/src/linux/Documentation/sysctl/vm.txt file-
上面的例子是根据/usr/src/Linux/Documention/sysctl/vm.txt文件来设置的,下面说明:
The first parameter 100 %
governs the maximum number of dirty buffers in the buffer cache. Dirty means that the contents of the buffer still have to be written to disk as opposed to a clean buffer, which can just be forgotten about. Setting this to a high value means that Linux can delay disk writes for a long time, but it also means that it will have to do a lot of I/O at once when memory becomes short. A low value will spread out disk I/O more evenly.
第一个参数是指收集,支配缓冲区中脏缓冲的最大数目。“脏”是指数据从内存中读取出来,已经被修改,但是还没有写到磁盘。将该值设高意味着Linux可是延缓写磁盘的时间,但那也意味着当内存不够需要写磁盘时需要更多的I/O操作。低值可以使用磁盘I/O更平缓。
The second parameter 1200 ndirty
This gives the maximum number of dirty buffers that bdflush can write to the disk in one time. A high value will mean delayed, bursty I/O, while a small value can lead to memory shortage when bdflush isn't woken up often enough.
第二个参数是一次往磁盘写脏数据的最大数目。高值意味着延迟的,骤然的I/O,而小值则会当bdflush没有足够快的时间来唤醒时导致内存来存储它。
The third parameter 128 nrefill
This is the number of buffers that bdflush will add to the list of free buffers when refill_freelist() is called. It is necessary to allocate free buffers beforehand, since the buffers often are of a different size than memory pages and some bookkeeping needs to be done beforehand. The higher the number, the more memory will be wasted and the less often refill_freelist() will need to run.
第三个参数是当freelist函数被调用时,bdflush加入到自由缓冲区的数目。
refill_freelist() 512
When this comes across more than nref_dirt dirty buffers, it will wake up bdflush.
当该函数值超过nref_dirt脏缓冲区的数目时,它将唤醒bdflush。
age_buffer 50*HZ, age_super parameters 5*HZ
Finally, the age_buffer 50*HZ and age_super parameters 5*HZ govern the maximum time Linux waits before writing out a dirty buffer to disk. The value is expressed in jiffies (clockticks); the number of jiffies per second is 100. Age_buffer is the maximum age for data blocks, while age_super is for file system metadata.
最后, age_buffer 50*HZ 和 age_super parameters 5*HZ支配linux在等待脏数据写到磁盘的最到时间。该值时jiffies的表达式(jiffies可以在c语言中找到,译者加);每秒的jiffes的数目时100.age_buffer时数据块的最大年龄,而age_super时文件系统元数据的年龄。
The fifth 15 and the last two parameters 1884 and 2
These are unused by the system so we don't need to change the default ones.
这些系统没有用,因此我们没有必要改变他们的缺省值。
2004-5-23 22:02 mlsx
6.6. The buffermem parameters
The buffermem file is also closely related to the operation of the virtual memory VM subsystem of the Linux kernel. The value in this file /proc/sys/vm/buffermem controls how much memory should be used for buffer memory in percentage. It is important to note that the percentage is calculated as a percentage of total system memory.
The default setup for the buffermem parameters under Red Hat Linux is: "2 10 60"
6.6 buffermem参参数
buffermem文件和VM子系统的操作关系非常密切。文件/proc/sys/vm/buffermem的值控制内存应该用来做内存缓冲的百分比。这个百分比对系统总内存百分比的计算很重要(这句话不通,译者加)。buffermem在redhat linux中的缺省设置时“2 10 60”。
To change the values of buffermem, type the following command on your terminal:
对redhat6.1,通过键入下面的命令来修改buffermem的值。
[code:85355977a3]
[root@deep] /# echo "70 10 60" >/proc/sys/vm/buffermem
[/code:85355977a3]
You may add the above commands to the /etc/rc.d/rc.local script file and you'll not have to type it again the next time you reboot your system.
你可以将这个命令加入到/etc/rc.d/rc.local文件中,以便系统下次起动时不要在键入该命令而就起作用。
Edit the /etc/sysctl.conf file and add the following line:
对于redhat 6.2及以后的版本,编辑/etc/sysctl.conf文件,加入下面一行
[code:85355977a3]
# Improve virtual memory performance
vm.buffermem = 70 10 60
[/code:85355977a3]
You must restart your network for the change to take effect. The command to manually restart the network is the following:
必须通过手工方式重新起动网络来是设置生效,命令如下:
[code:85355977a3]
[root@deep] /# /etc/rc.d/init.d/network restart
[/code:85355977a3]
According to the /usr/src/linux/Documentation/sysctl/vm.txt file, the first parameter 80 % means to use a minimum of 80 percent of memory for the buffer cache; the minimum percentage of memory that should be spent on buffer memory.The last two parameters 10 and 60 are unused by the system so we dont need to change the defaults.
Depending of the amount of RAM you have in the server the value of 80% may vary. When your server is highly loaded and when all application are used, you can know in detail how much memory are required and used by the system. 80 % for the buffermem parameters seem to be too much for systems under 256 MB of RAM. Doing a free -m command on the prompt your system will display amount of free and used memory in the system. Once you have executed this command free -m, check for -/+ buffers/cache:values and get the one related to the minimal (-) to set your value for buffermem.
根据/usr/src/linux/Documentation/sysctl/vm.txt文件,第一个参数80%表示使用内存的至少80%来当作缓冲区;内存的最小百分比将在缓冲区中用尽。最后两个参数10和60系统没有使用,我们没有必要修改。
依赖与内存的大小,你可以改变80%这样的缺省设置。当你的机器处于高负载时,当所有的应用应用程序都在使用时,你需要详细地知道系统需要多少内存来使用。对于有256MB内存地机器,80%地设置似乎太大了。(FC2是70%,译者加)。使用free -m 命令看查看剩余内存和使用内存的情况。一旦你已经执行了free -m 命令,检查-/+ buffers/cache 的值,并根据最小内存的需要来设置buffermem的值。
Example 6-1. For 128 MB of RAM
128 * 80% = 102.4 MB
128 - 102.4 = 25.6 MB
[root@deep] /#free -m
total used free shared buffers cached
Mem: 124 121 3 30 43 48
-/+ buffers/cache: 29 95
Swap: 128 2 126
The result shows us that the -/+ buffers/cache: need 29 MB at minimum to run the system properly and with 128 MB of RAM set at 80% we have only 25.6 MB available. Hmmm! problem, i guess. so we go back to the calculator again and do this:
128 * 70% = 89.6
128 - 89.6 = 38.4 MB
well solved good!.
上面是一个内存为128M的例子。通过free -m命令我们可以看到缓冲区最少需要29M内存来正确的运行系统。而我们设置80%,因此只有25.6M可以使用,因此这是一个问题。于是我们采用设置70%来解决这个问题,这样就有38.4M内存来使用,解决了这个问题。(根据这个设置,我的系统设置buffermem是50%,译者加)
2004-5-23 22:23 mlsx
6.7. The ip_local_port_range parameters
The /proc/sys/net/ipv4/ip_local_port_range defines the local port range that is used by TCP and UDP traffic to choose the local port. You will see in the parameters of this file two numbers: The first number is the first local port allowed for TCP and UDP traffic on the server, the second is the last local port number. For high-usage systems you may change its default parameters to 32768-61000 -first-last.
The default setup for the ip_local_port_range parameters under Red Hat Linux is: "1024 4999"
文件/proc/sys/net/ipv4/ip_local_port_range 定义了被TCP和UDP用来传送的本地端口的范围。你将看到这个文件有两个参数,第一个是允许TCP和UDP在服务器上传送的第一个本地端口,第二个则是最后的本地端口。对于高利用的系统,你可能要修改缺省值成32768-61000 first-last
linux下的缺省值是1024 4999
To change the values of ip_local_port_range, type the following command on your terminal:
对于redhat6.1,通过下面的命令修改起参数
[code:9ae4686b92]
[root@deep] /# echo "32768 61000"
>/proc/sys/net/ipv4/ip_local_port_range
[/code:9ae4686b92]
Add the above commands to the /etc/rc.d/rc.local script file and you'll not have to type it again the next time you reboot your system.
同样你也加入到/etc/rc.d/rc.local起动脚本中。
Edit the /etc/sysctl.conf file and add the following line:
对于redhat6.2及以后的版本,编辑/etc/sysctl.conf文件,加入下面一行:
[code:9ae4686b92]
# Allowed local port range
net.ipv4.ip_local_port_range = 32768 61000
[/code:9ae4686b92]
You must restart your network for the change to take effect. The command to manually restart the network is the following:
重启网络服务来使修改值生效
[root@deep] /# /etc/rc.d/init.d/network restart
2004-5-24 19:34 mlsx
6.8. The /etc/nsswitch.conf file
The /etc/nsswitch.conf file is used to configure which services are to be used to determine information such as hostnames, password files, and group files. The last two ones, password files, and group files in our case are not used, since we don't use NIS services on our server. Thus, we will focus on the hosts line in this file.
Edit the nsswitch.conf file vi /etc/nsswitch.conf and change the hosts line to read:
[code:3fa06beaf8] "hosts: dns files"[/code:3fa06beaf8]
Which means, for programs that want to resolve an address. They should use the dns feature first, and the /etc/hosts file if the DNS servers are not available or can't resolve the address.
Also, we would recommend deleting all instances of NIS services from each line of this file unless you are using NIS! The result should look like this: [code:3fa06beaf8]
passwd:files
shadow:files
group:files
hosts:dns files
bootparams:files
ethers:files
netmasks:files
networks:files
protocols:files
rpc:files
services:files
automount:files
aliases:files
[/code:3fa06beaf8]
6.8 /etc/nsswitch.conf 文件
/etc/nsswitch.conf文件用来配置那些需要探测诸如主机名,密码文件,组文件等信息的服务。密码文件和组文件在我们这个例子中没有使用,因为我们没有使用到NIS服务,因此我们重点看看这个文件中有关主机这行。
编辑nsswitch.conf文件,改变成下面这行
"hosts: dns files"
这行的意思是,对于那些想要解析IP地址的程序,他们应该线先使用DNS服务,如果没有找到,然后使用/etc/hosts中提供的ip和主机的关系表。
我们也建议你删除下面的有关NIS的信息,除非你使用了NIS,因此最后该文件的结果应该象下面这样:
[code:3fa06beaf8]passwd:files
shadow:files
group:files
hosts:dns files
bootparams:files
ethers:files
netmasks:files
networks:files
protocols:files
rpc:files
services:files
automount:files
aliases:files [/code:3fa06beaf8]
2004-5-24 20:05 mlsx
6.10. The ulimit parameter
Linux itself has a Max Processes per user limit. This feature allows us to control the number of processes an existing user on the server may be authorized to have. To improve performance, we can safely set the limit of processes for the super-user root to be unlimited. Edit the .bashrc file vi /root/.bashrc and add the following line:
6.10 ulimit 参数
Linux自身对每个用户有最大的进程数。这个特征使得我们可以控制目前系统存在的用户的进程数目。为了提高性能,我们可以安全地对超级用户root设置进程的数目为无限。编辑/root/.bashrc文件,加入下面一行:
ulimit -u unlimited
You must exit and re-login from your terminal for the change to take effect.
你必须退出并重新登陆才会生效。[code:e873aa1904]
[root@deep] /# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited (1)
pipe size (512 bytes) 8
open files 1024
virtual memory (kbytes) 2105343 [/code:e873aa1904]
(1)
Make sure that when you type as root the command ulimit -a on your terminal, it shows unlimited next to max user processes.
确定你是用root身份键入了ulimit -a,那么在"max user processes”应该显示为无限。
tips: You may also do ulimit -u unlimited at the command prompt instead of adding it to the /root/.bashrc file.
注意:你也可以在命令行模式键入ulimit -u unlimited 来取得这样地效果而不要修改文件。
Increases the system limit on open files for instance a process on Red Hat 6.0 with kernel 2.2.5 could open at least 31000 file descriptors this way and a process on kernel 2.2.12 can open at least 90000 file descriptors this way. The upper bound seems to be available memory. To increases the number of open files to 90000 for the root account do the following: Edit the .bashrc file vi /root/.bashrc and add the following line:
对于redhat6.0,内核为2.2.5地linux系统,增加每个进程实例打开文件地限制,就可以打开至少31000个文件描述符,而2.2.12地内核则可以打开90000个文件描述符。这个数目地上限似乎决定与你地内存。为了为root增加到可以打开90000个文件描述符数目,编辑/root/.bashrc文件,增加下面这行:
[code:e873aa1904] ulimit -n 90000[/code:e873aa1904]
You must exit from your terminal and re-login for the change to take effect.
同样地,你应该注销再登陆,设置才会生效。[code:e873aa1904]
[root@deep] /# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited
pipe size (512 bytes) 8
open files 90000 (1)
virtual memory (kbytes) 2105343
[/code:e873aa1904]
2004-5-24 20:36 mlsx
6.11. The atime and noatime attribute
Linux records information about when files were created and last modified as well as when it was last accessed. There is a cost associated with recording the last access time. The ext2 file system of Linux has an attribute that allows the super-user to mark individual files such that their last access time is not recorded. This may lead to significant performance improvements on often accessed frequently changing files such as the contents of the /var/spool/news directory.
To set the attribute to a file, use:
6.11 atime和noatime 属性
Linux下,当文件被创建和最后被修改以及最后被访问时,这些信息都会记录下来。记录组后访问时间会需要一些时间开销。Linux中地ext2文件系统有这样地一个属性:它允许超级用户可以标记某些特殊地文件使得他们地诸如最后访问时间等不被修改。这就对那些需要经常访问诸如/var/spool/news 目录地系统来说可以显著地提高系统性能。对这个文件设置这个属性使用下面地命令:[code:53e53aafa8]
[root@deep] /#chattr +A filename (1)[/code:53e53aafa8]
(1)
For a specific file ,For a whole directory tree, do something like:
这是对指定地文件,如果时整个目录,那么就需要这样做:[code:53e53aafa8]
[root@deep /root]#chattr -R +A /var/spool/ (1)
[root@deep /root]#chattr -R +A /cache/ (2)
[root@deep /root]#chattr -R +A /home/httpd/ona/ (3)[/code:53e53aafa8]
(1)For a news and mail 对新闻和邮件
(2) For a proxy caches 针对代理服务器
(3) For a web pages 针对web服务器
Linux has a special mount option for file systems called noatime that can be added to each line that addresses one file system in the /etc/fstab file. If a file system has been mounted with this option, reading accesses to the file system will no longer result in an update to the atime information associated with the file like we have explained above. The importance of the noatime setting is that it eliminates the need by the system to make writes to the file system for files which are simply being read. Since writes can be somewhat expensive, this can result in measurable performance gains. Note that the write time information to a file will continue to be updated anytime the file is written to. In our example below, we will set the noatime option to our /chroot file system.
Edit the fstab file vi /etc/fstab and add in the line that refer to /chrootfile system the noatime option after the defaults option as show below:
Linux文件系统挂载时可以增加一个noatime地属性,因此你可以把这个属性加入到/etc/fstab文件中对应地行。如果一个文件系统通过这样地参数来挂载,那么对其访问就不再有因为更新atime来消费时间。noatime属性地重要性在于:它抹掉了对那些只是简单读取文件而需要写信息到文件系统地需要。因为无论写什么到系统,它都需要花费时间,这样就可以获得性能效益。下面地例子,我们给出对于/chroot文件系统挂载使用noatime选项。
编辑/etc/fstab文件,增加noatime地选择到defaults后面,以逗号隔开,应该象下面这样:[code:53e53aafa8]
/dev/sda7 /chroot ext2 defaults,noatime 1 2 [/code:53e53aafa8]
You need not reboot your system for the change to take effect, just make the Linux system aware about the modification you have made to the /etc/fstab file. This can be accomplished with the following commands:
并不需要重启系统才会生效,你只要告诉Linux系统,让它知道/etc/fstab被我们修改了。我们可以通过下面地命令来让系统知道:
[root@deep] /#mount -o remount /chroot/
Then test your results with the flowing command:
下面的命令可以测试结果:[code:53e53aafa8]
[root@deep]# cat /proc/mounts
/dev/root / ext2 rw 0 0 /proc /proc proc rw 0 0 /dev/sda1 /boot ext2 rw 0 0 /dev/sda8 /cache ext2 rw 0 0 /dev/sda7 /chroot ext2 rw,noatime 0 0 /dev/sda6 /home ext2 rw 0 0 /dev/sda11 /tmp ext2 rw 0 0 /dev/sda5 /usr ext2 rw 0 0 /dev/sda9 /var ext2 rw 0 0 none /dev/pts devpts rw 0 0 [/code:53e53aafa8]
If you see something like: /dev/sda7 /chroot ext2 rw,noatime 0 0, congratulations!
如果你看到了/dev/sda7 /chroot ext2 rw,noatime 0 0, 恭喜你!
2004-5-24 21:27 mlsx
6.12. Tuning IDE Hard Disk Performance
Putting your swap partitions near the beginning of your drive, see This chart to get a better idea, may give you some acceptable improvement. The beginning of the drive is physically located on the outer portion of the cylinder, and the read/write head can cover much more ground per revolution. We typically see partitions placed at the end of the drive work 3MB/s slower using the hdparm -t command.
Performance increases have been reported on massive disk I/O operations by setting the IDE drivers to use DMA, 32-bit transfers and multiple sector modes. The kernel seems to use more conservative settings unless told otherwise. The magic command to change the setting of your drive is hdparm. To enable 32-bit I/O over the PCI buses, use the command:
6.12调谐IDE硬盘性能
讲你的swap分区靠近你的硬盘开始区会获得一些高的性能。驱动器的开始部分在物理上磁道的外围边缘,这样在每转中,读写头可以覆盖更大的区域。我们可以通过hdparm -t 命令看到驱动器的最后分区的读写速度慢到3MB/s。
[root@deep] /# /sbin/hdparm -c1 /dev/hda or hdb, hdc etc.
This will usually, depending on your IDE Disk Drive model, cut the timing buffered disk reads time by 2. The hdparm(8) manpage says that you may need to use -c 3 for some chipsets. All (E)IDE drives still have only a 16-bit connection over the ribbon cable from the interface card. To enable DMA, use the command:
上面的设置要根据你的磁盘驱动器模式。如果你的”timing buffered“磁盘读写时间设置为2,那么hdparm 8 上的man 手册上会告诉你应该使用 -c 3的参数来设置。所有的(E)IDE驱动器仍然使用仅16位的总线链接接口卡。为了使用DMA,使用下面的命令(实际上,目前的版本都使用了DMA,相差一倍,译者加)
[code:9391be63a6][root@deep] /# /sbin/hdparm -d1 /dev/hda or hdb, hdc etc. [/code:9391be63a6]
This may depend on support for your motherboard chipset being compiled into your kernel. Also, this command will enable DMA support for your hard drive, it will cut the timing buffered disk reads time and will improve the performance by 2. To enable multiword DMA mode 2 transfers, use the command:
该命令依赖与你的内核是否讲对主板芯片的执行编译了进去。这个命令激活DMA,使”timing buffered”磁盘读时间设置为2。为了可以使用多字的MDA模式2 传送。
[code:9391be63a6] [root@deep] /#/sbin/hdparm -d1 -X34 /dev/hda or hdb, hdc etc. [/code:9391be63a6]
This sets the IDE transfer mode for newer (E)IDE/ATA2 drives. check your hardware manual to see if you have it. To enable UltraDMA mode2 transfers, use the command:
上面的命令设置IDE传送使用较新的(E)IDE/ATA2驱动模式。检查你的硬件手册看是否支持。 UltraDMA 模式 2传送,使用下面的命令:
[code:9391be63a6] [root@deep] /# /sbin/hdparm -d1 -X66 /dev/hda or hdb, hdc etc. [/code:9391be63a6]
You'll need to prepare the chipset for UltraDMA beforehand. Also, see your manual page about hdparm for more information. Use this with extreme caution! To set multiple sector mode I/O, use the command:
使用这个命令前,你需要知道你的硬件是否支持。你可以查看hdparm手册来获得更多的信息。使用这个命令是要极端小心。为了设置多扇区I/O模式,使用下面的命令:
[code:9391be63a6] [root@deep] /#/sbin/hdparm -m XX /dev/hda or hdb, hdc etc. [/code:9391be63a6]
Where XX is the maximum setting supported by your drive. The -i flag can be used to find the maximum setting supported by an installed drive: look for MaxMultSect in the output.
这里XX是你的硬盘能够支持的最大值。下面的-i标志可以找到这个最大值:
[code:9391be63a6] [root@deep] /#/sbin/hdparm -i /dev/hda or hdb, hdc etc.
/dev/hda:
Model=Maxtor 7540 AV, FwRev=GA7X4647, SerialNo=L1007YZS
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>5Mbs FmtGapReq }
RawCHS=1046/16/63, TrkSize=0, SectSize=0, ECCbytes=11
BuffType=3(DualPortCache), BuffSize=32kB, MaxMultSect=8, MultSect=8
DblWordIO=yes, maxPIO=2(fast), DMA=yes, maxDMA=1(medium)
CurCHS=523/32/63, CurSects=379584528, LBA=yes, LBA=yes, LBAsects=1054368
tDMA={min:150,rec:150}, DMA modes: sword0 sword1 *sword2 *mword0
IORDY=on/off, tPIO={min:240,w/IORDY:180}, PIO modes: mode3[/code:9391be63a6]
Multiple sector mode aka IDE Block Mode, is a feature of most modern IDE hard drives, permitting the transfer of multiple sectors per I/O interrupt, rather than the usual one sector per interrupt. When this feature is enabled, it typically reduces operating system overhead for disk I/O by 30-50%. On many systems it also provides increased data throughput of anywhere from 5% to 50%. You can test the results of your changes by running hdparm in performance test mode:
多扇区模式和IDE块模式一样,是最新的IDE硬盘的特征,允许在每个I/O中断时采用多扇区传送而不是通常的单扇区传送。当这个功能起动时,它一般能将OS对磁盘的I/O开支减低30-50%。在很多系统中它也可以将数据吞吐量从5%提高到50%。你使用hdparm的测试模式来测试这个结果,使用下面的命令
[code:9391be63a6] [root@deep] /#/sbin/hdparm -t /dev/hda or hdb, hdc etc. [/code:9391be63a6]
Linux Journal 发表了一篇优化 Oracle 数据库的文章,感觉十分的有用。简要介绍其摘要和大家共同分享 Linux 在企业级数据库上应用。
原作者:Bert Scalzo
目前,HP,Compaq,Dell,IBM 以及 Oracle 都在加快速度拥抱 Linux ,这个开放源码的操作系统。根据 eWeek 的统计,去年 Linux 服务器的销售量大约占据了 Compaq 的 30%,Dell 的 13.7%,IBM 的 13.5%。而且 IBM 2001年度在 Linux 上的投入有 10 个亿。 Intel 最新的 64 位的 Itanium CPU 只支持四种操作系统:Windows, Linux, AIX 和 HP-UX。我们也不要忘记 Oracle 的 9i 数据库 Linux 版本要比 Windows 版本早一个月。
尽管 Linux 能跑在从 IBM S/390 到 Sun SPARC 结构的服务器,但是对于大多数人来说,Intel 还是 Linux 跑得最多的平台。本文就是要讲述通过简单的性能调正,使 Oracle 的性能提升 1000% 的办法。
本文采用的测试环境是一台 Compaq 4 CPU,512 MB ,8 部 7200 rpm SCSI 磁盘的服务器,然后在几乎同样的单 CPU Athlon 系统上作了测试,内存一样,但是只有一部 7200 rpm 的 Ultra 100 IDE 磁盘。尽管最后的结果和得到的百分比不一样,但是观测得到的性能提升是一致的。
为了简单起见,我们的测试环境采用 TPC 基准测试,它广泛地用于 OLTP 的负荷测试。Quest 公司有一个叫做 Benchmark Factory 的工具,使测试工作变得就像发送电子邮件一样简单。
下面我们将分别通过 DB 的调整和 OS 的调整来看测试的结果。
DB1 的初始化参数一般不常见,为了说明问题,我们使用这些参数并作为基准。
DB1: Initial Database
Database Block Size 2K
SGA Buffer Cache 64M
SGA Shared Pool 64M
SGA Redo Cache 4M
Redo Log Files 4M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 49.41
Transactions / Second 8.152
显然需要加大 SGA 大小,我们来看 DB2 的结果:
DB2: Cache & Pool
Database Block Size 2K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 4M
Redo Log Files 4M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 48.57
Transactions / Second 9.147
增大 SGA 已经缓冲看来对于性能的提升并不显著,加载时间只提升了 1.73%。下面我们增加 SGA 重做日志的大小:
DB3: Log Buffer
Database Block Size 2K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 41.39
Transactions / Second 10.088
我们可以看到加载时间提升了 17.35%,TPS 也提升了 9.33%。因为加载和同时插入,更新,删除需要比 8M 大的空间,但是看起来增加内存性能并没有显著提升,我们加大块大小:
DB4: 4K Block
Database Block Size 4K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Dictionary
TPC Results Load Time (Seconds) 17.35
Transactions / Second 10.179
我们看到加载时间提升了 138%!而对 TPS 值没有很大的影响。下面一个简单的念头是表空间的管理从目录切换为本地:
DB5: Local Tablespaces
Database Block Size 4K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Local
TPC Results Load Time (Seconds) 15.07
Transactions / Second 10.425
下面我们把数据库块加大到 8K 来看结果:
DB6: 8K Block
Database Block Size 8K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Local
TPC Results Load Time (Seconds) 11.42
Transactions / Second 10.683
看来结果并不坏,我们没有理由继续增加块大小了,我们还没有根据 CPU 个数调整相应的参数,这次我们设置 I/O 的进程数来继续调整:
DB7: I/O Slaves
Database Block Size 8K
SGA Buffer Cache 128M
SGA Shared Pool 128M
SGA Redo Cache 16M
Redo Log Files 16M
Tablespaces Local
dbwr_io_slaves 4
lgwr_io_slaves (derived) 4
TPC Results
Load Time (Seconds) 10.48
Transactions / Second 10.717
我们的测试是基于 Red Hat 6.2 进行的,内核版本为 2.2.14-5smp。对于 Linux 的内核而言,有将近几百个参数可以调整,包括对 CPU 类型,SMP 支持,APIC 支持,DMA 支持,IDE DMA 缺省参数的使用以磁盘限额支持。根据 Oracle 的文档,我们要做的主要调整是共享内存和信号量的大小,SHMMAX 最少配置 0x13000000,SEMMNI, SEMMSL 和 SEMOPN 分别至少设置 100, 512, 100。这些参数的设置可以通过下面的命令实现:
# echo 0x13000000 >/proc/sys/kernel/shmmax
# echo 512 32000 100 100 >/proc/sys/kernel/sem
OS1: 单内核和 IPC
TPC Results
Load Time (Seconds) 9.54
Transactions / Second 11.511
我们有理由相信采用新的内核版本(2.2.16-3smp)也应该有性能的提升:
OS2: Newer minor version kernel TPC Results
Load Time (Seconds) 9.40
Transactions / Second 11.522
目前已经有 2.4 版本的内核,和 2.2 相比,性能上有了很大的提升,我们采用 2.4.1smp:
OS3: Newer major version kernel TPC Results
Load Time (Seconds) 8.32
Transactions / Second 12.815
Linux 缺省读操作时更新最后一次读的时间,但是这个对我们来说并不重要,因此我们关闭这个选项,通过设置 noatime 的文件属性来实现。(对于 Win NT 和 2000 有相似的设置)
如果只是相对 Oracle 的数据文件设置,我们的命令是
chattr +A file_name
对整个目录的实施办法:chattr -R +A directory_name
最好的办法是修改 /etc/fstab ,针对每个文件系统入口,添加 noatime 关键字。
OS4: noatime file attribute
TPC Results
Load Time (Seconds) 5.58
Transactions / Second 13.884
另外一个调整 Linux I/O 的办法是虚拟内存子系统的调整,修改 /ect/sysctl.cong 文件,增加下面一行:
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
根据 /usr/src/Linux/Documentation/sysctl/vm.txt 的说法:
第一个参数100 %:控制缓冲区中最大的脏缓冲数据,增加这个值意味着 Linux 可以延迟磁盘写。
第二个参数 1200 ndirty:给出 bdflush 一次能够写入磁盘的最大脏缓冲。
第三个参数 128 nrefill:当调用 refill_freelist() 时,bdflush 添加到自由缓冲区中的最大缓冲数目。
refill_freelist() 512:当这个数目超过 nref_dirt 脏缓冲时,将唤醒 bdflush。
第五个 15 和最后两个参数 1884 和 2,系统未使用,我们不做修改。
age_buffer 50*HZ, age_super 参数 5*HZ:控制 Linux 把脏缓冲写到磁盘的最多等待时间。数值用时钟滴答数(jiffies)表示,每秒为 100 个 jiffies 。
OS5: bdflush settings TPC Results
Load Time (Seconds) 4.43
Transactions / Second 14.988
经过以上一系列调整后,我们得到的最终加载时间减少了 1015.35%,TPS 增加了 45.61%。
Oracle数据库设计开发阶段性能优化策略开发者在线 Builder.com.cn 更新时间:2007-10-05作者:中国IT实验室 来源:中国IT实验室
本文关键词: 设计 数据库
摘 要 通过对Oracle 数据库系统物理结构和逻辑结构的分析,阐述了在Oralce数据库设计开发阶段性能优化的一些策略和方法。
关键词 Oracle 数据库 性能优化 策略
引言
Oracle是目前使用最为广泛的大型数据库管理系统,提高Oracle数据库系统的运行效率,是整个计算机信息系统高效运转的前提和保证。影响Oracle数据库应用系统性能的因素很多,既有软件方面的因素,也包括数据运行的硬件环境、网络环境、数据库管理和维护方面的因素等。数据库系统设计开发阶段是Oracle应用优化的最佳阶段,也是主动优化阶段,能达到以最小成本获得最大性能增益的目的。通过对其逻辑存储结构和物理存储结构设计进行优化,使之在满足需求条件下,时空开销性能最佳,可以解决数据库系统运行过程中性能的渐进性下降或性能突降等问题,以保证系统运行的优良性能。
Oracle数据库的逻辑结构和物理结构
Oracle 数据库的逻辑结构是由一些数据库对象组成,如数据库表空间、表、索引、段、视图、存储过程、触发器等。数据库的逻辑存储结构(表空间等)决定了数据库的物理空间是如何被使用的,数据库对象如表、索引等分布在各个表空间中。
Oracle 数据库的物理结构从操作系统一级查看,是由一个个的文件组成,从物理上可划分为:数据文件、日志文件、控制文件和参数文件。数据文件中存放了所有的数据信息;日志文件存放数据库运行期间产生的日志信息,它被重复覆盖使用,若不采用归档方式的话,已被覆盖的日志信息将无法恢复;控制文件记录了整个数据库的关键结构信息,它若被破坏,整个数据库将无法工作和恢复;参数文件中设置了很多Oracle 数据库的配置参数,当数据库启动时,会读取这些信息。
逻辑结构的优化
逻辑结构优化用通俗的话来说就是通过增加、减少或调整逻辑结构来提高应用的效率,下面通过对基本表的设计及索引、聚簇的讨论来分析ORACLE逻辑结构的优化。
1、基本表扩展
数据库性能包括存储空间需求量的大小和查询响应时间的长短两个方面。为了优化数据库性能,需要对数据库中的表进行规范化。一般来说,逻辑数据库设计满足第三范式的表结构容易维护且基本满足实际应用的要求。所以,实际应用中一般都按照第三范式的标准进行规范化,从而保证了数据库的一致性和完整性,设计人员往往会设计过多的表间关联,以尽可能地降低数据冗余。但在实际应用中这种做法有时不利于系统运行性能的优化:如过程从多表获取数据时引发大量的连接操作,在需要部分数据时要扫描整个表等,这都消耗了磁盘的I/O 和CPU 时间。
为解决这一问题,在设计表时应同时考虑对某些表进行反规范化,方法有以下几种:一是分割表。分割表可分为水平分割表和垂直分割表两种:水平分割是按照行将一个表分割为多个表,这可以提高每个表的查询速度,但查询、更新时要选择不同的表,统计时要汇总多个表,因此应用程序会更复杂。垂直分割是对于一个列很多的表,若某些列的访问频率远远高于其它列,就可以将主键和这些列作为一个表,将主键和其它列作为另外一个表。通过减少列的宽度,增加了每个数据页的行数,一次I/O就可以扫描更多的行,从而提高了访问每一个表的速度。但是由于造成了多表连接,所以应该在同时查询或更新不同分割表中的列的情况比较少的情况下使用。二是保留冗余列。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。三是增加派生列。派生列是由表中的其它多个列的计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。
因此,在数据库的设计中,数据应当按两种类别进行组织:频繁访问的数据和频繁修改的数据。对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化。对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。有时还需将规范化的表作为逻辑数据库设计的基础,然后再根据整个应用系统的需要,物理地非规范化数据。规范与反规范都是建立在实际的操作基础之上的约束,脱离了实际两者都没有意义。只有把两者合理地结合在一起,才能相互补充,发挥各自的优点。
2、索引和聚簇
创建索引是提高检索效率最有效的方法之一,索引把表中的逻辑值映射到安全的RowID,能快速定位数据的物理地址,可以大大加快数据库的查询速度,一个建有合理索引的数据库应用系统可能比一个没有建立索引的数据库应用系统效率高几十倍,但并不是索引越多越好,在那些经常需要修改的数据列上建立索引,将导致索引B*树的不断重组,造成系统性能的下降和存储空间的浪费。对于一个大型表建立的索引,有时并不能改善数据查询速度,反而会影响整个数据库的性能。这主要是和SGA的数据管理方式有关,Oracle在进行数据块高速缓存管理时,索引数据比普通数据具有更高的驻留权限,在进行空间竞争时,Oracle会先移出普通数据,对建有索引的大型表进行数据查询时,索引数据可能会用完所有的数据块缓存空间,Oracle不得不频繁地进行磁盘读写来获取数据,所以,在对一个大型表进行分区之后,可以根据相应的分区建立分区索引。
Oracle提供了另一种方法来提高查询速度,就是聚簇(Cluster)。所谓聚簇,简单地说就是把几个表放在一起,按一定公共属性混合存放。聚簇根据共同码值将多个表的数据存储在同一个Oracle块中,这时检索一组Oracle块就同时得到两个表的数据,这样就可以减少需要存储的Oracle块,从而提高应用程序的性能。
对于逻辑结构的优化,还应将表数据和索引数据分开表空间存储,分别使用独立的表空间。因为如果将表数据和索引数据放在一起,表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数据和索引数据存放在不同的表空间中,并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。
物理结构的优化
数据库的数据最终是存储在物理磁盘上的,对数据进行访问就是对这些物理磁盘进行读写,因此对于这些物理存储的优化是系统优化的一个重要部分。对于物理存储结构优化,主要是合理地分配逻辑结构的物理存储地址,这样虽不能减少对物理存储的读写次数,但却可以使这些读写尽量并行,减少磁盘读写竞争,从而提高效率,也可以通过对物理存储进行精密的计算减少不必要的物理存储结构扩充,从而提高系统利用率。
1、磁盘读写并行优化
对于数据库的物理读写,Oracle系统本身会进行尽可能的并行优化,例如在一个最简单的表检索操作中,如果表结构和检索域上的索引不在一个物理结构上,那么在检索的过程中,对索引的检索和对表的检索就是并行进行的。
2、操作并行优化
操作并行的优化是基于操作语句的统计结果,首先是统计各个表的访问频率,表之间的连接频率,根据这些数据按如下原则分配表空间和物理磁盘,减少系统进程和用户进程的磁盘I/O竞争;把需要连接的表格在表空间/物理磁盘上分开;把高频访问的表格在表空间/物理磁盘上分开;把经常需要进行检索的表格的表结构和索引在表空间/物理磁盘上分开。
3、减少存储结构扩展
如果应用系统的数据库比较脆弱,并在不断地增长或缩小,这样的系统在非动态变化周期内效率合理,但是当在动态变化周期内的时候,性能却很差,这是由于Oracle的动态扩展造成的。在动态扩张的过程中,Oracle必须根据存储的要求,在创建行、行变化获取缺省值时,扩展和分配新的存储空间,而且表格的扩展往往并不是事情的终结,还可能导致数据文件、表空间的增长,这些扩展会导致在线系统反应缓慢。对于这样的系统,最好的办法就是在建立的时候预先分配足够的大小和合适的增长幅度。在一个对象建立的时候要根据应用充分地计算他们的大小,然后再根据这些数据来定义对象Initial、Next和Minextents的值,使数据库在物理存储上和动态增长次数上达到一个比较好的平衡点,使这些对象既不经常发生增长,也不过多地占用数据库。
结论
优化Oracle 数据库对提高计算机系统的可用性和效率,具有非常重要的意义, 特别是在Oracle数据库设计开发阶段,对逻辑结构和物理结构进行有效的优化设计,创建一个规划布局合理的数据库,可以获得最小的系统开销,能从根本上大大提高应用系统的整体性能,对于以后的数据库性能调整和利用都有很大的益处。
Oracle数据库系统性能优化策略开发者在线 Builder.com.cn 更新时间:2007-10-05作者:中国IT实验室 来源:中国IT实验室
本文关键词: 系统性能 数据库
一个数据库系统的生命周期可以分成设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低,收益最大。在成品阶段进行数据库性能优化的成本最高,收益最小。数据库的优化可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对硬件的升级。据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优化。许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。
一、数据库性能的优化
数据库设计是应用程序设计的基础,其性能直接影响应用程序的性能。数据库性能包括存储空间需求量的大小和查询响应时间的长短两个方面。为了优化数据库性能,需要对数据库中的表进行规范化。规范化的范式可分为第一范式、第二范式、第三范式、BCNF范式、第四范式和第五范式。一般来说,逻辑数据库设计会满足规范化的前3级标准,但由于满足第三范式的表结构容易维护且基本满足实际应用的要求。因此,实际应用中一般都按照第三范式的标准进行规范化。但是,规范化也有缺点:由于将一个表拆分成为多个表,在查询时需要多表连接,降低了查询速度。
由于规范化有可能导致查询速度慢的缺点,考虑到一些应用需要较快的响应速度,在设计表时应同时考虑对某些表进行反规范化。反规范化可以采用以下几种方法:
1. 分割表
分割表包括水平分割和垂直分割。
水平分割是按照行将一个表分割为多个表,这可以提高每个表的查询速度,但查询、更新时要选择不同的表,统计时要汇总多个表,因此应用程序会更复杂。
垂直分割是对于一个列很多的表,若某些列的访问频率远远高于其它列,就可以将主键和这些列作为一个表,将主键和其它列作为另外一个表。通过减少列的宽度,增加了每个数据页的行数,一次I/O就可以扫描更多的行,从而提高了访问每一个表的速度。但是由于造成了多表连接,所以应该在同时查询或更新不同分割表中的列的情况比较少的情况下使用。
2. 保留冗余列
当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的列,以避免表之间的连接过于频繁。由于对冗余列的更新操作必须对多个表同步进行,所以一般在冗余列的数据不经常变动的情况下使用。
3. 增加派生列
派生列是由表中的其它多个列计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。
二、应用程序性能的优化
应用程序的优化通常可分为两个方面:源代码和SQL语句。由于涉及到对程序逻辑的改变,源代码的优化在时间成本和风险上代价很高,而对数据库系统性能的提升收效有限,因此应用程序的优化应着重在SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就行,而是要写出高质量的SQL语句,提高系统的可用性。
下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。
1. IS NULL 与 IS NOT NULL
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
2. 联接列
对于有联接的列,即使最后的联接值为一个静态值,优化器不会使用索引的。例如,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫乔治?布什(George Bush)的职工。 下面是一个采用联接查询的SQL语句:
select * from employee where first_name||''||last_name ='George Bush';
上面这条语句完全可以查询出是否有George Bush这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。
当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引:
Select * From employee where first_name ='George' and last_name ='Bush';
遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着George Bush这个员工的姓名,对于这种情况我们又如何避免全程遍历使用索引呢?可以使用一个函数,将变量name中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是SQL查询脚本:
select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)
and last_name = SUBSTR('&&name',INSTR('&&name‘,' ')+1) ;
3. 带通配符(%)的like语句
同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含Bush的人。可以采用如下的查询SQL语句:
select * from employee where last_name like '%Bush%';
这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。例如,在下面的查询中索引得到了使用:
select * from employee where last_name like 'c%';
4. Order by语句
Order by语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。
仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。
5. NOT
我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:
…… where not (status ='VALID')
如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:
…… where status <>'INVALID';
再看下面这个例子:
select * from employee where salary<>3000;
对这个查询,可以改写为不使用NOT的语句:
select * from employee where salary<3000 or salary>3000;
虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。
6. IN和EXISTS
有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。
第一种格式是使用IN操作符: …… where column in(select * from …… where ……);
第二种格式是使用EXIST操作符: …… where exists (select 'X' from ……where ……);
绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以将几乎所有的IN操作符子查询改写为使用EXISTS的子查询。
第二种格式中,子查询以‘select 'X'’开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where语句中使用的列存在索引)。相对于IN子句来说,EXISTS使用相连子查询,构造起来要比IN子查询困难一些。
通过使用EXISTS,Oracle系统会首先检查主查询,然后运行子查询直到找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。
同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),但NOT EXISTS要比NOT IN查询效率更高。
ORACLE数据库性能优化技术开发者在线 Builder.com.cn 更新时间:2007-10-05作者:中国IT实验室 来源:中国IT实验室
本文关键词: 优化 数据库
作为全球第一大数据库厂商,ORACLE数据库在国内外获得了诸多成功应用,据统计,全球93%的上市.COM公司、65家“财富全球100强”企业不约而同地采用Oracle数据库来开展电子商务。Oracle在国内成功的案例包括新华社多媒体数据库及信息服务系统、中国银行、建设银行、清华大学信息系统等。
随着网络应用和电子商务的不断发展,各个站点的访问量越来越大,如何使用有限的计算机系统资源为更多的用户服务?如何保证用户的响应速度和服务质量?这些问题都属于服务器性能优化的范畴。
ORACLE数据库性能优化概述
实际上,为了保证ORACLE数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略。优化策略一般包括服务器操作系统参数调整、ORACLE数据库参数调整、网络性能调整、应用程序SQL语句分析及设计等几个方面,其中应用程序的分析与设计是在信息系统开发之前完成的。
分析评价ORACLE数据库性能主要有数据库吞吐量、数据库用户响应时间两项指标。数据库吞吐量是指单位时间内数据库完成的SQL语句数目;数据库用户响应时间是指用户从提交SQL语句开始到获得结果的那一段时间。数据库用户响应时间又可以分为系统服务时间和用户等待时间两项,即:
数据库用户响应时间=系统服务时间 + 用户等待时间
上述公式告诉我们,获得满意的用户响应时间有两个途径:一是减少系统服务时间,即提高数据库的吞吐量;二是减少用户等待时间,即减少用户访问同一数据库资源的冲突率。
数据库性能优化包括如下几个部分:
1、调整数据结构的设计。这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等。
2、调整应用程序结构设计。这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构。不同的应用程序体系结构要求的数据库资源是不同的。
3、调整数据库SQL语句。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了ORACLE数据库的性能。ORACLE公司推荐使用ORACLE语句优化器(Oracle Optimizer)和行锁管理器(row-level manager)来调整优化SQL语句。
4、调整服务器内存分配。内存分配是在信息系统运行过程中优化配置的,数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小。需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。
5、调整硬盘I/O,这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。
6、调整操作系统参数,例如:运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。
实际上,上述数据库优化措施之间是相互联系的。ORACLE数据库性能恶化表现基本上都是用户响应时间比较长,需要用户长时间的等待。但性能恶化的原因却是多种多样的,有时是多个因素共同造成了性能恶化的结果,这就需要数据库管理员有比较全面的计算机知识,能够敏感地察觉到影响数据库性能的主要原因所在。另外,良好的数据库管理工具对于优化数据库性能也是很重要的。
ORACLE数据库性能优化工具
常用的数据库性能优化工具有:
1、ORACLE数据库在线数据字典,ORACLE在线数据字典能够反映出ORACLE动态运行情况,对于调整数据库性能是很有帮助的。
2、操作系统工具,例如UNIX操作系统的vmstat,iostat等命令可以查看到系统系统级内存和硬盘I/O的使用情况,这些工具对于管理员弄清出系统瓶颈出现在什么地方有时候很有用。
3、SQL语言跟踪工具(SQL TRACE FACILITY),SQL语言跟踪工具可以记录SQL语句的执行情况,管理员可以使用虚拟表来调整实例,使用SQL语句跟踪文件调整应用程序性能。SQL语言跟踪工具将结果输出成一个操作系统的文件,管理员可以使用TKPROF工具查看这些文件。
4、ORACLE Enterprise Manager(OEM),这是一个图形的用户管理界面,用户可以使用它方便地进行数据库管理而不必记住复杂的ORACLE数据库管理的命令。
5、EXPLAIN PLAN??SQL语言优化命令,使用这个命令可以帮助程序员写出高效的SQL语言。
ORACLE数据库的系统性能评估
信息系统的类型不同,需要关注的数据库参数也是不同的。数据库管理员需要根据自己的信息系统的类型着重考虑不同的数据库参数。
1、在线事务处理信息系统(OLTP),这种类型的信息系统一般需要有大量的Insert、Update操作,典型的系统包括民航机票发售系统、银行储蓄系统等。OLTP系统需要保证数据库的并发性、可靠性和最终用户的速度,这类系统使用的ORACLE数据库需要主要考虑下述参数:
l 数据库回滚段是否足够?
l 是否需要建立ORACLE数据库索引、聚集、散列?
l 系统全局区(SGA)大小是否足够?
l SQL语句是否高效?
2、数据仓库系统(Data Warehousing),这种信息系统的主要任务是从ORACLE的海量数据中进行查询,得到数据之间的某些规律。数据库管理员需要为这种类型的ORACLE数据库着重考虑下述参数:
l 是否采用B*-索引或者bitmap索引?
l 是否采用并行SQL查询以提高查询效率?
l 是否采用PL/SQL函数编写存储过程?
l 有必要的话,需要建立并行数据库提高数据库的查询效率
SQL语句的调整原则
SQL语言是一种灵活的语言,相同的功能可以使用不同的语句来实现,但是语句的执行效率是很不相同的。程序员可以使用EXPLAIN PLAN语句来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写SQL语句需要满足考虑如下规则:
1、尽量使用索引。试比较下面两条SQL语句:
语句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN
(SELECT deptno FROM emp);
语句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS
(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高一些。
2、选择联合查询的联合次序。考虑下面的例子:
SELECT stuff FROM taba a, tabb b, tabc c
WHERE a.acol between :alow and :ahigh
AND b.bcol between :blow and :bhigh
AND c.ccol between :clow and :chigh
AND a.key1 = b.key1
AMD a.key2 = c.key2;
这个SQL例子中,程序员首先需要选择要查询的主表,因为主表要进行整个表数据的扫描,所以主表应该数据量最小,所以例子中表A的acol列的范围应该比表B和表C相应列的范围小。
3、在子查询中慎重使用IN或者NOT IN语句,使用where (NOT) exists的效果要好的多。
4、慎重使用视图的联合查询,尤其是比较复杂的视图之间的联合查询。一般对视图的查询最好都分解为对数据表的直接查询效果要好一些。
5、可以在参数文件中设置SHARED_POOL_RESERVED_SIZE参数,这个参数在SGA共享池中保留一个连续的内存空间,连续的内存空间有益于存放大的SQL程序包。
6、ORACLE公司提供的DBMS_SHARED_POOL程序可以帮助程序员将某些经常使用的存储过程“钉”在SQL区中而不被换出内存,程序员对于经常使用并且占用内存很多的存储过程“钉”到内存中有利于提高最终用户的响应时间。
CPU参数的调整
CPU是服务器的一项重要资源,服务器良好的工作状态是在工作高峰时CPU的使用率在90%以上。如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源,如果工作高峰时CPU使用率仍然很低,说明服务器CPU资源还比较富余。
使用操作相同命令可以看到CPU的使用情况,一般UNIX操作系统的服务器,可以使用sar ?u命令查看CPU的使用率,NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率。
数据库管理员可以通过查看v$sysstat数据字典中“CPU used by this session”统计项得知ORACLE数据库使用的CPU时间,查看“OS User level CPU time”统计项得知操作系统用户态下的CPU时间,查看“OS System call CPU time”统计项得知操作系统系统态下的CPU时间,操作系统总的CPU时间就是用户态和系统态时间之和,如果ORACLE数据库使用的CPU时间占操作系统总的CPU时间90%以上,说明服务器CPU基本上被ORACLE数据库使用着,这是合理,反之,说明服务器CPU被其它程序占用过多,ORACLE数据库无法得到更多的CPU时间。
数据库管理员还可以通过查看v$sesstat数据字典来获得当前连接ORACLE数据库各个会话占用的CPU时间,从而得知什么会话耗用服务器CPU比较多。
出现CPU资源不足的情况是很多的:SQL语句的重解析、低效率的SQL语句、锁冲
基础linux系统优化
发表时间: 2007-2-26 21:29 作者: linux286 来源: linux286社区
字体: 小 中 大 | 打印
对于一个刚安装完毕的linux系统,有如下通用的优化措施。
优化编译器
编辑/etc/profile,增加:
For CPU i686 or PentiumPro, Pentium II, Pentium III
CFLAGS='-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions'
export CFLAGS
For CPU i586 or Pentium
CFLAGS='-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions'
export CFLAGS
For CPU i486
CFLAGS='-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fnoexceptions'
export CFLAGS
优化SWAP分区
将SWAP分区置于硬盘的开始部分,可以获得部分的系统性能提升。
优化虚拟内存系统
编辑/etc/sysctl.conf,增加或者更改如下:
# Improve file system performance
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2
# Improve virtual memory performance
vm.buffermem = 80 10 60
优化文件系统
编辑/etc/sysctl.conf,增加或者更改如下:
# Improve the number of open files
fs.file-max = 8192
# Improve the number of inodes opened
fs.inode-max = 32768
此外,对于有频繁读写的文件系统,可以使用noatime的mount选项,这样,对于文件系统的读,系统不会产生对于文件节点atime信息的更新操作。
优化TCP/IP
编辑/etc/sysctl.conf,增加或者更改如下:
# Allowed local port range
net.ipv4.ip_local_port_range = 32768 61000
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 1800
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
# Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
优化IDE磁盘
应用hdparm命令配置IDE磁盘的32位DMA通道,可以极大的提升磁盘IO,某些情况下几乎可以提升到2倍的IO性能。具体使用参见hdparm的manual
oracle数据库的性能调整开发者在线 Builder.com.cn 更新时间:2007-10-05作者:中国IT实验室 来源:中国IT实验室
本文关键词: 性能 数据库 Oracle
oracle是一个高性能数据库软件。用户可以通过参数的调整,达到性能的优化。性能优化主要分为两部分:一是数据库管理员通过对系统参数的调整达到优化的目的,二是开发人员通过对应用程序的优化达到调整的目的。
在此,仅就系统参数的调整进行探讨,而不涉及应用程序的优化。对系统参数的调整,可以分为以下几个部分:
(1)调整内存分配
系统全局区(SGA)是一个分配给ORACLE 包含ORACLE 数据库实例控制信息的内存段。SGA的大小对系统性能的影响极大,其缺省参数设置只适用于配置很低的计算机,不适应收入系统现有设备的需要。这些参数若不作调整,会对系统资源造成巨大浪费。就收入系统的Alpha 1200而言,SGA的大小以160兆左右为宜。
初始化参数文件中的一些参数对SGA的大小有决定性的影响。参数DB-BLOCK-BUFFERS(SGA中存储区高速缓存的缓冲区数目),参数SHARED-POOL-SIZE(分配给共享SQL区的字节数),是SGA大小的主要影响者。
DB-BLOCK-BUFFERS参数是SGA大小和数据库性能的最重要的决定因素。该值较高,可以提高系统的命中率,减少I/O。每个缓冲区的大小等于参数DB-BLOCK-SIZE的大小。ORACLE数据库块以字节表示大小。
Oracle SGA区共享池部分由库高速缓存、字典高速缓存及其他一些用户和服务器会话信息组成,共享池是最大的消耗成分。调整SGA区各个结构的大小,可以极大地提高系统的性能。
.调整Library Cache
库高速缓存(Library Cache)中包含私用和共享SQL区和PL/SQL区。调整SGA的重要问题是确保库高速缓存足够大,以使ORACLE能在共享池中保持分析和执行语句,提高语句分析和执行效率,降低资源消耗。通过比较Library Cache的命中率来决定它的大小。查询V$LIBRARYCACHE 数据字典视图(其中,pins表示高速缓存命中率,reloads表示高速缓存失败)
SQL〉SELECT SUM(pins),SUM(reloads)
FROM v$librarycache;
如果sum(reload)/sum(pins)≈0,说明Library Cache的命中率比较合适,若大于1,则需要增加共享池(SHARED-POOL-SIZE)的大小(在初始化参数文件中)。
.调整数据字典高速缓存(Dictionary Cache)
数据字典高速缓存包括了有关数据库的结构、用户、实体信息等。数据字典的命中率对系统有很大的影响。命中率的计算中,getmisses 表示失败次数,gets表示成功次数。
查询V$ROWCACHE表:
SQL>SELECT (1-(SUM(getmisses)/(SUM(gets)+SUM(getmisses))))*100
FROM v$rowcache;
如果该值>90%,说明命中率合适。否则,应增大共享池的大小。
.调整数据库缓冲区高速缓存
Oracle 在运行期间向数据库高速缓存读写数据,高速缓存命中表示信息已在内存中,高速缓存失败意味着ORACLE必需进行磁盘I/O。保持高速缓存失败率最小的关键是确保高速缓存的大小。初始化参数DB-BLOCK-BUFFERS控制数据库缓冲区高速缓存的大小。可通过查询V$SYSSTAT命中率,以确定是否应当增加DB-BLOCK-BUFFERS的值。
SQL>SELECT name,value
FROM V$SYSSTAT
WHERE name IN (’dbblock gets’,’consistent gets’,’physical reads’);
通过查询结果
命中率=1-physical reads/(dbblock gets+consistent gets)
如果命中率<0.6~0.7,则应增大DB-BLOCK-BUFFERS。
(2)调整磁盘I/O
磁盘I/O是系统性能的瓶颈,解决好磁盘I/O,可明显提高性能。通过查询V$FILESTAT可以知道每个物理文件的使用频率(phyrds表示每个数据文件读的次数,phywrts表示每个数据文件写的次数)
SQL>SELECT name,phyrds,phywrts
FROM v$datafile df,v$filestat fs
WHERE df.file# =fs.file#;
对于使用频率较高的物理文件,可以采用以下策略:
.将I/O尽可能平均分配在尽可能多的磁盘上。
.为表和索引建立不同的表空间。
.将数据文件与重做日志文件分离在不同的磁盘上。
.减少不经oracle SERVER的磁盘I/O。
(3)调整竞争
当多个进程对相同的资源发出申请时,产生竞争。
.修改process参数
该参数定义可以同时连接到oracle数据库的最大进程数,缺省值为50。注意,oracle的后台进程也包括在此数目中,建议将该值改为200。
.减少调度进程的竞争
减少调度进程的竞争,通过查询v$dispatcher表来判定调度进程的竞争
SQL>SELECT network ,sum(busy)/sum(busy)+sum(idle)
FROM v$dispatcher
GROUP BY network;
如果某种协议忙的比率超过50%,应增加MTS-DISPATCHERS的值。
.减少多线程服务进程竞争
首先查询V$SYSSTAT表判定是否发生多线程服务进程竞争:
SQL>SELECT DECODE(totalq,0,’No request’,wait/totalq||’hunderths of seconds’) FROM v$sysstat
WHERE type=’common’;
如果共享服务进程数量已达到初始化参数文件中MTS-MAX-SERVERS指定的最大值,但应用运行时,平均请求等待时间仍持续增长,那么,应加大MTS-MAX-SERVERS的值。
.减少重做日志缓冲区竞争
通过查询V$SYSSTAT表判定redo log 文件缓冲区是否足够。
SQL>SELECT name,value
FROM v$sysstat
WHERE name=’redo log space request’;
此处value的值应接近于0,否则,应增大初始化参数文件的LOG-BUFFEQS的值。
.减少回退段竞争
回退段对性能也有影响,根据事物大小情况来分配合适的回退段。
首先判定回退段的数量能否满足系统运行的需要:
查询V$WAITSTAT表与V$SYSSTAT表
SQL>SELECT class,count
FROM v$waitstat
WHERE class IN (’system undo header’,system undo block’,
’undo header’,’undo block’);
SQL>SELECT sum(value)
FROM v$sysstat WHERE name IN (’db block gets’,’consistent gets’);
如果任何一个class/sum(value)>10%,那么考虑增加回退段。回退段的数量一般按如下规律设定:
用户数 回退段个数
n<16 4
16<n<32 8
32<=n n/4 但不超过50
.减少Free List竞争
当多个进程同时向一个表中插入数据时,产生Free List竞争。
SQL>SELECT class,count
FROM v$waitstat
WHERE class=’free list’;
SQL>SELECT sum(value)
FROM v$sysstat
WHERE name IN (’db block gets’,’consistent gets’);
如果class/sum(value)>1%,则应增加该表的Free List 的值。
Oracle数据库的后台进程管理技术介绍开发者在线 Builder.com.cn 更新时间:2007-10-05作者:中国IT实验室 来源:中国IT实验室
本文关键词: 后台 数据库
1、PMON (The Process Monitor) 进程监控器
主要负责连接非正常中断后的清除工作,PMON负责释放相应的资源。
PMON将回滚没有提交的工作,释放锁,释放分配给这个失败进程的Free SGA资源。除了清理失败的连接之外,PMON还负责监控所有其它的Oracle后台进程,假如有需要的话,将重起这些后台进程,比如一个 shared server或者一个dispatcher fail的话, PMON将跟进,重起另一个相应的进程。
2、SMON (The System Moniter) 系统监控器
主要负责其它进程不想处理的工作的进程,是数据库的一种“垃圾回收站”,主要包括:
2.1、临时空间的清除;
比如创建索引失败时,SMON将负责清除在创建索引过程当中分配出来的Temporary extent.
2.2、崩溃恢复;
2.3、Coalescing free space;
这个是在字典管理的表空间才会有的,SMON将表空间中连续的空闲的extent,合并成一个大的free extent.这只能发生在字典管理的表空间,并且pctincrease 被设置成非零的时候。
2.4、Recovering transactions active against unavailable files;
2.5、OPS中失败节点的实例恢复;
在OPS中,当一个节点Fail,其它节点将打开失败节点的重做日志,对失败节点执行恢复(注意:实例恢复和崩溃恢复的区别)。
2.6、清除OBJ$;
2.7、Shrinks 回滚段;
如果设置了Optimal,那么SMON将执行自动 Shrink 回滚段到Optimal 大小。
2.8、脱机 回滚段;
举个例子,比如在切换回滚表空间的时候,由于可能之前的回滚表空间中有活动的事务,所以回滚表空间中的一些回滚段可能并不是真正的脱机,而只是标志为" Pending offline",要等到活动事务提交或回滚之后,相应的回滚段才算真正的脱机,而SMON则周期性的在后台去真正的脱机回滚段,直到回滚段真正的脱机为止。
3、CKPT (Checkpoint Process)
CKPT进程并不像它的名字暗示的那样会进行一个checkpoint事件,它只是更新数据文件头。Oracle 8.0之前,CKPT是一个可选进程,之后就总是开启的了,更新数据文件头在CKPT出现之前这是LGWR的任务,但是后来随着文件数量增大,这个LGWR的附加任务变得太大而成为负担。于是就出现了CKPT,由CKPT分担着这部分任务。
4、DBWn (Database Block Writer)
DBWn是一个负责将dirty blocks写到磁盘的后台进程,通常将dirty blocks写到磁盘是为了腾空更多的空闲空间(为了其它数据的读 而释放缓冲区), 或者advance 一个检查点事件(也就是在发生故障实例恢复时, 将联机重做日志中Oracle开始读取的位置 前移以节省实例恢复的时间)Log Switch 会触发一个Checkpoint,Oracle 需要advance这个Checkpoint以至于在实例恢复时不需要这个刚被填满的online redo log,假如在重用这个日志之前,不能完成这个advance Checkpoint的操作,则我们在alert将发现"Checkpoint not Compelete"信息,并且必须等待这个事件的完成。
5、LGWR (Log Writer)
LGWR负责将Redo log buffer (位于SGA中)中的内容写入到联机日志文件。
下面几种情况将会触发LGWR写log buffer:
5.1、每三秒;
5.2、当用户commit时;
5.3、当重做日志缓冲区 1/3满 或者包含1M 的缓冲数据时。
由于上面的原因,使用一个大于3M的重做日志缓冲区是不实际的――Oralce永远无法完全使用它。与DBWn必须执行分散的I/O 不同,重做日志是以顺序写入的方式写入的,这样执行大量的批写入更加有效率。
6、ARCn (Archive Process)
ARCn是负责copy 已经写满的online redo log到另外一个地方。注意这里的redo log的copy不是文件级别的Copy,而是copy redo log里面的entries.这些归档日志可以用来处理Media Recovery.比如你的system01.dbf文件丢失,那么你可以利用你一周前的备份,Restore 该数据文件。
然后请求数据库应用从备份开始后的所有的归档日志和在线日志文件,这样的话,该数据文件就可以“追”上数据库中的其它的数据文件,然后我们可以继续processing,而不会丢失数据。中文翻译 "catch up" that file with the reset of the datafiles in our database.中的"cacth up"翻译为"弥补",我觉得翻译成"追"更合适,因为这样才能更好的理解日志其实是一种数据流。
实际上,备份是baseline,而日志是一种数据流,指向到系统crash的点,两者共同使用才能回到当前点,其实中文就这个很模糊,所谓恢复是两件事情,restore和recover .
7、RECO (Distributed Database Recovery)
Oracle数据库磁盘输入输出性能和优化开发者在线 Builder.com.cn 更新时间:2007-10-05作者:中国IT实验室 来源:中国IT实验室
本文关键词: 磁盘 数据库
本文是讲述有关Oracle数据库磁盘输入输出性能和优化的各个不同方面的一系列文章中的一篇。每篇技巧性的文章都摘自即将由Rampant科技出版社出版的图书《Oracle磁盘输入输出性能调优》,作者是Mike Ault。从该系列文章的主页上能看到其他即将发布的部分。
Linux系统下的小型计算机系统接口(SCSI)性能调优
在linux系统下,要么通过在启动命令Grub或Lilo的启动文件中指定参数、要么通过在文件/etc/modules.conf中指定选项,来对小型计算机系统接口(SCSI)进行性能调优。接下来让我们依次查看这两种情况的例子。在Linux系统下,可以通过使用带-Tt选项的命令hdparm来测量这个接口的相对性能。注意,在Linux系统中,IEEE 1394接口被看作是一个SCSI接口。下面的例子是用来对普通的SBP2接口进行性能调优,但是这些技术也能够被特定的SCSI驱动器使用。
首先,让我们看一下这个接口的当前设置。通过在/proc/scsi/sbp2目录下查看LUN号来获取这些当前设置信息。本例使用LUN 0。
[root@aultlinux1 root]# cat /proc/scsi/sbp2/0
IEEE-1394 SBP-2 protocol driver (host: ohci1394)
SBP-2 module load options:
- Max speed supported: S400
- Max sectors per I/O supported: 255
- Max outstanding commands supported: 8
- Max outstanding commands per lun supported: 1
- Serialized I/O (debug): no
- Exclusive login: no
现在,我们为接口as-is运行一个时间测试,来测试其平均速度(多执行几次,取其平均值):
/dev/sda: Timing buffer-cache reads: 128 MB in 3.99 seconds = 32.08 MB/sec Timing buffered disk reads: 64 MB in 6.86 seconds = 9.33 MB/sec[root@aultlinux1 root]# hdparm -Tt /dev/sda
现在,我们设置文件/etc/modules.conf中的SBP2选项的值。我们使显著命令的数量加倍,设为16,并增加每个LUN的命令数量,设为2:
alias parport_lowlevel parport_pcalias eth0 3c59xalias usb-controller usb-ohcialias eth1 tulipalias ieee1394-controller ohci1394alias scsi_hostadapter sbp2options sbp2 sbp2_max_outstanding_cmds=16 sbp2_max_cmds_per_lun=2
接下来,重启计算机以使设置生效,并重新查看文件/proc/scsi/sbp2/0中我们的设置
[root@aultlinux1 root]# cat /proc/scsi/sbp2/0IEEE-1394 SBP-2 protocol driver (host: ohci1394)$Rev: 601 $ James Goodwin <
[email protected]>SBP-2 module load options:- Max speed supported: S400- Max sectors per I/O supported: 255- Max outstanding commands supported: 16- Max outstanding commands per lun supported: 2- Serialized I/O (debug): no- Exclusive login: no
更改了我们的设置后,我们从新运行时间测试:
[root@aultlinux1 etc]# hdparm -Tt /dev/sda /dev/sda: Timing buffer-cache reads: 128 MB in 4.03 seconds = 35.36 MB/sec Timing buffered disk reads: 64 MB in 6.04 seconds = 11.25 MB/sec
仅做了一个简单的修改,我们提高了这个设备的SCSI速度,比例达120.6%(11.25/9.33*100= 120.6)。总体而言,会获得20%的速度提高。随后,我们把显著命令的数量再加倍、加四倍,最终达到255倍,我们发现当设置其值为16时性能达到最顶点(11.25 MB/sec)。如果被调节的服务器位于一个集群中,所有服务器都应该拥有相同的设置。
Unix系统下的小型计算机系统接口(SCSI)性能调优
Unix系统下的小型计算机系统接口(SCSI)性能调优依赖于所设计的Unix版本和被调节的SCSI卡或者主板接口。让我们看一下Sun的例子。
在任何系统上,包括Sun,系统总线的带宽是固定的。如果总线上有太多设备的话,将导致比总线能处理的更多的数据量,总而导致竞争和包丢失。
在Sun的Solaris操作系统上,命令prtdiag ?v用来报告系统总线的配置信息。通过增加总线上设备的报告能力(使用prtdiag ?v命令),并查看它们是否超过了总线的能力,就有可能了解总线是否超负荷。只要有可能,相同的主板上应该放置相似的接口卡,以使中断被定向到同一个CPU(及其缓冲区)。表3-1显示了一些典型Sun系统总线的能力信息:
Bus
Speed
Width
Burst Bandwidth
Sustained Bandwidth
MBus
33MHz
64 bit
264 MB/s
86 MB/s
MBus
36MHz
64 bit
288 MB/s
94 MB/s
MBus
40MHz
64 bit
320 MB/s
105 MB/s
MBus
50MHz
64 bit
400 MB/s
130 MB/s
XDBus
40MHz
64 bit
320 MB/s
250 MB/s
XDBus
50MHz
64 bit
400 MB/s
312 MB/s
UPA
72MHz
128 bit
1.15 GB/s
1 GB/s
UPA
83.5MHz
128 bit
1.3 GB/s
1.2 GB/s
UPA
100MHz
128 bit
1.5 GB/s
1.44 GB/s
Gigaplane
83.5MHz
256 bit
2.6 GB/s
2.5 GB/s
GigaplaneXB
100MHz
1024 bit
12.8 GB/s
12.8 GB/s