SCO UNIX核心参数的调整
【摘要】本文介绍了SCO UNIX操作系统中几个核心参数调整的一般原则及如何根据系统的实际运行状况进行核心参数的调整。
【关键词】SCO UNIX 核心参数
SCO UNIX的核心参数的设置对系统的性能有很大的影响。本文详细介绍了SCO UNIX操作系统中对系统性能有较大影响的核心参数设置的一般原则。除此之外,精确调整核心参数还需要有关应用程序的知识。
一、I/O子系统的调整
因为磁盘I/O相对于内存访问速度较慢,所以I/O子系统核心参数的调整对整个SCO UNIX的性能有很大的影响。
1、文件,I节点和锁
NINOD和NFILE
NINODE和NFILE分别决定I节点表和文件表的大小。为了确定适当的NINODE和NFILE的值,可以用sar -v命令来查看等间隔时间内正在使用的I节点和打开文件的平均数。例如:
# sar -v
scsibox scsibox 3.2 2 i386 10/05/92
00:00:01 proc-sz ov inod-sz ov file-sz ov lock-sz
01:00:01 57/100 0 191/300 0 190/300 0 2/100 <-- 第一个时间间隔
02:00:01 57/100 0 191/300 0 190/300 0 2/100 <-- 第二个时间间隔
03:00:01 60/100 0 194/300 0 194/300 0 2/100 <-- 第三个时间间隔
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
| NPROC | NINODE | NFILE | FLCKREC
| | | |
进程 inodes 已打开 已加锁的
平均 的平均 文件的 文件记录
数目 数目 平均数 的平均数
另一方面也可使用如下命令查看某一时刻的I节点和打开的文件数:
# pstat | egrep '^[0-9]'
165 active inodes
51 processes
171 open files
通过以上两种方法确定系统在峰值时刻的最大inode和打开文件数目,然后根据系统峰值时的I节点和打开文件数加上20%到25%的冗余量来设置系统的NINODE和NFILE的值。
NOFILES和FLCKREC
NOFILES决定了用户文件描述表的大小,它确定了单个进程在任何时刻可同时打开文件的数量。由于NOFILES的缺省值很大,因此一般无需修改NOFILES的值。只有在使用数据库的时候可能需要修改NOFILES的值。
一般来说操作系统有能力锁住某个文件,这样其他用户或进程就不可能再打开这个文件。除了对文件加锁以外,操作系统还可以对文件的记录进行加锁,文件的记录可以是一个字符,也可以是文件中的所有字符。
FLCKREC参数确定在系统范围内多少记录可以被加锁。要为FLCKREC赋一个合适的值,可以用“sar -v”命令提供的输出信息来确定。同NINODE、NFILE一样,根据“sar -v”命令提供的信息,加上20%到25%的冗余量来确定FLCKREC的值。若FLCKREC设置的太低,系统会出现错误信息提示文件锁表溢出。
2、NAMEI缓冲区
在动手调整NAMEI参数之前,很有必要了解设置NAMEI缓冲区的目的。在解释设置缓冲区的目的之前,先介绍一下在SCO UNIX操作系统下文件是如何打开的。举例来说,当我们要打开 “/usr/tmp/my_directory/my_file”文件时,操作系统所要做的第一件事就是将输入的字符串分裂成各个组成部分,也就是分裂成“usr”、“tmp”、“my_directory”和“my_file”。“my_file”是一个文件,“usr”、“tmp”、“my_directory”和“my_file”是目录,但在UNIX 操作系统中,一个目录实际上也是一个文件,因此,“usr”、“tmp”、“my_directory”也都是文件,在这些目录文件中包含有目录中所有文件的文件名和I节点数。
当操作系统将文件名分裂成一个一个的组成部分以后,就开始逐个处理文件名的组成部分。操作系统首先在根目录下寻找“usr”文件,找到后提取出“usr”的I节点数,根据I节点数读取磁盘,即将“usr”目录中的内容读入内存中,在此内容中定位下一个组成部分:“tmp”。一旦找到“tmp”,提取出相应的I节点数、根据I节点数从磁盘读取“tmp”的内容之后,操作系统对“my_directory”进行同样的操作。最后,操作系统定位到“my_file”,找到此文件的I节点数,然后打开文件。
打开文件的处理过程,因为涉及到多次的读盘操作,所以是很费时的,因此要想办法减少任何多余的I/O操作。
UNIX的设计者早已注意到某些目录和文件的使用频率较高,NAMEI缓冲区通过对这些目录和目录的组成部分进行缓冲来提高系统的性能。这样打开这些文件时就无需再访问硬盘,读取文件的速度大幅度提高。
S5CACHEENTS(System V Cache Entries)
为了介绍的方便,NAMEI缓冲区中的每一项称之为“NAMEI缓冲项”,在整个系统中存在一定数目的NAMEI缓冲项。正在使用的NAMEI缓冲项通过链接的方式组成链表,如下所示:
NAMEI缓冲项的总数由
S5CACHEENTS决定。
此例中S5CACHEENTS=28
图一
还未被使用的NAMEI缓冲项保存在缓冲池中。当需要对一个新的组成项进行缓冲时,NAMEI缓冲算法就从缓冲池中分配一个缓冲项,最终缓冲池中的所有缓冲项都有可能被用尽,如图一所示。
S5HASHQS
图一说明了NAMEI缓冲项被组织成链表的形式。为了快速地访问链表中的任意一个NAMEI缓冲项,核心使用了散列表。散列表的大小由S5HASHQS决定。NAMEI缓冲项与散列表之间的关系可用下图说明:
NAMEI缓冲区的总数由S5CACHEENTS
决定。此例中S5CACHEENTS=28
散列表的大小由5HASHQS
决定。此例中S5HASHQS=7
图二
调整系统参数与走平衡木类似,需要我们在复杂的条件下寻求某种平衡。在调整上述核心参数时以下几条原则可供参考:
* 当增加S5CACHEENTS的数值时,也就增大了给定文件的组成部分在NAMEI缓冲区的概率。因为缓冲区越大,也就能缓冲更多的文件组成部分。
* 当增加S5HASHQS时,链表的平均长度减少。如果文件的组成项在链表中,则访问速度更快。
虽然散列函数可以完全确定某一文件组成项应在散列表的那一队列中,但这并不意味着这一文件组成项就一定在NAMEI缓冲区中,而只是告诉我们如果这一文件组成项在NAMEI缓冲区中,那末就一定在这一链表中。当文件组成部分不在缓冲区时,就需要对此进行缓冲。
下面我们进一步讨论一下S5CACHEENTS参数的设置。
如果参数S5CACHEENTS与S5HASHQS的值之比较高,那么散列表中的链表则较长,需要系统花更多的时间去遍历链表。相对来说,比值低较好,但设置的比例越低,所得的益处也越来越不明显。最好是使得S5HASHQS的值接近S5CACHEENTS的值。
S5CACHEENTS推荐的值是3*NINODE。因为S5CACHEENTS的值是基于NINODE的,所以慎重选择NINODE很重要。
S5CACHEENTS与S5HASHQS之比的值最好为4:1。因为S5HASHQS决定了散列表的大小,所以比值最好在推荐值上下且接近某个质数。
3、缓冲区
MAXBUF,NBUF,NHBUF,NAUTOUP,BDFLUSHR
因为相对于内存访问来说,磁盘I/O较慢,所以任何可以减少操作系统磁盘I/O次数的方法对系统来说都是有益的。SCO UNIX操作系统使用缓冲技术来减少磁盘I/O。
缓冲区是操作系统在内存中开辟一片区域。缓冲技术使用这块区域缓冲磁盘I/O的数据。这样,当操作系统接到请求去磁盘读某块数据时,可以先检查缓冲区中的数据。若要读的数据恰好在缓冲区中,那么操作系统可以简单地从缓冲区中读出数据交给请求者即可,因而减少了对磁盘访问的次数。类似地,当操作系统接到请求要写数据到磁盘上时,操作系统无须立即将数据写入磁盘,可以先把数据写入缓冲区,以后在合适的时候再把缓冲区的数据写入磁盘。
NBUF参数决定分配多大的缓冲区。缓冲区大小的基本单位是1K。NBUF在SCO UNIX中的缺省值为0。设置NBUF为0,使得SCO UNIX根据内存容量的大小自动配置缓冲区。
MAXBUF参数允许系统管理员为系统自动配置NBUF参数时指定一个最大值,即MAXBUF为NBUF的上界。
建议按以下要求调整缓冲区有关参数:
(1) 设置MAXBUF的值为内存总量大小的25%。例如,若机器的内存大小为32MB,那么MAXBUF为8MB。因为MAXBUF也是以1K为单位的,所以设定MAXBUF=8000。
(2) 设置NBUF为0。当系统启动时,会根据NBUF、MAXBUF即内存的大小自动配置缓冲区的大小。在启动屏上系统会显示:“kernel :i/o bufs = ****k”来报告系统自动配置的NBUF值。
NBUF设置的一般原则是使得NBUF的值为系统内存容量的10%到25%。若设置的NBUF 值较高,则留给应用程序的内存就少,反之则应用程序可用内存就多。NBUF参数的设置需要在这之间寻求平衡。
这里介绍的缓冲区如同上面介绍的NAMEI缓冲区一样也是被组织成散列表的形式。缓冲区散列表的大小由NHBUF决定。为了在运行高峰时,系统依然能有效地运行,NHBUF应设为2的方次、接近于NBUF/4的某个值。
NAUTOUP为文件系统的自动更新指定以秒为单位的时间间隔。当一个系统缓冲区中的内容已经在内存中驻留了由NAUTOUP参数所指定的这么长时间时,它就会被写入硬盘。如果指定一个较小的值,那么系统的可靠性就会因为较频繁地把缓冲区中内容写入磁盘而提高,但系统性能会降低。指定一个较大的值则会提高系统性能,但要以降低系统安全性为代价。
为把缓冲区中的内容写到磁盘上去,后台进程需要以一定的频率检查缓冲区的内容,BDFLUSHR参数指定后台进程检查的频率。范围是1至300秒,缺省值为30秒。
确定系统运行时缓冲区的有效性可使用sar命令:
# sar -b | more
scsibox scsibox 3.2 2 i386 07/26/94
00:00:01 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
01:00:01 0 1 97 0 0 85 0 0
02:00:00 0 2 97 0 1 87 0 0
03:00:01 0 1 98 0 0 86 0 0
04:00:01 0 2 93 0 1 88 0 0
05:00:00 0 1 98 0 0 85 0 0
06:00:01 0 1 99 0 0 86 0 0
07:00:01 0 1 99 0 0 86 0 0
08:00:01 0 1 100 0 0 86 0 0
%rcache域显示了缓冲区缓冲读操作的效率。一般来说,%rcache的值应在100%以上。
%wcache域显示了缓冲区缓冲写操作的效率。一般来说,%wcache的值应在80%以上。
二、内存子系统的参数调整
1、进程表
NPROC 和 MAXUP
系统中的每个进程在系统的进程表中都有一个登记项。NPROC核心参数确定进程表的大小。进程表必须足够大以致于能容纳下系统在运行高峰时的所有进程。通过检查sar -v命令的输出结果可以为NPROC设置一个合理的值:
# sar -v
scsibox scsibox 3.2 2 i386 10/05/92
00:00:01 proc-sz ov inod-sz ov file-sz ov lock-sz
01:00:01 57/100 0 191/300 0 190/300 0 2/100 <-- 第一个时间间隔
02:00:01 57/100 0 191/300 0 190/300 0 2/100 <-- 第二个时间间隔
03:00:01 60/100 0 194/300 0 194/300 0 2/100 <-- 第三个时间间隔
^ ^
| |
| NPROC
|
进程平均数
使用如下命令可以查看系统在此时刻的进程数:
# pstat | egrep '^[0-9]'
165 active inodes
51 processes
171 open files
建议使用这两种方法来确定系统在运行高峰时的进程数,然后设置NPROC的值为高峰时进程数加上20%至25%的冗余量。
MAXUP是某一个用户可运行的最大进程数。设置MAXUP参数的目的在于防止某个用户滥用fork系统调用以致于僵死进程塞满系统进程表而导致系统崩溃。
NPROC的值应比MAXUP的值大10%以上。
MAXUP的具体值应根据运行在系统的应用程序确定。如果你发现应用程序报告“fork(S) failed”之类的错误,那末此时就需要增大MAXUP的值。从解决“fork(S) failed”之类错误的角度来说,应将MAXUP的值设置的大些,但如此以来就增加了进程表被僵死进程塞满而导致系统崩溃的可能性。
2、共享内存和共享库
NREGION
每个进程至少有三各区:正文区、数据区和堆栈区。正文区存放进程代码(即指令);进程所使用的变量存放在数据区;堆栈区用来存放进程的临时数据。
系统在核心维护着一张区域表(Region Table),这张表记录着系统中每个进程所使用的正文区、数据区和堆栈区的信息,NREGION决定了这张区域表的大小。为了确定确定区域表的使用情况,可以用crash(ADM)命令的region选项:
# crash
dumpfile = /dev/mem, namelist = /unix, outfile = stdout
> region
REGION TABLE SIZE = 300
Region-list:
SLOT PSZ #VL #NON RCNT SWP WAT FSIZE TYPE FOR BCK INO LISTADDR FLAGS
0 1 1 0 1 0 0 644c priv 1 2 295 f019598c done
1 5 5 0 26 3 0 5398 stxt 159 0 295 f01959d0 done
2 6 5 0 1 0 0 5604 stxt 0 3 297 f0195a14 done
......
201 2 0 0 1 0 0 0 priv 194 138 f0198ef0 stack
202 84 4 0 1 0 0 fefb8 priv 134 166 40 f0198f34 done
203 2 2 0 1 0 0 0 priv 166 168 f0198f78 stack
region选项的输出表示在系统的区域表中有203项。为了给NREGION确定一个合适的值,需要计算系统在使用高峰时区域表中有多少项。知道此值以后,再加上20%至25%的冗余量就是NREGION参数的值。若NREGION的值设置太低,则有可能导致系统区域表溢出错。
三、串行I/O子系统参数调整
为了提高串行I/O处理速度和处理单个字符,SCO UNIX操作系统采用了一种称为clist的机制。
当用户登录进入系统,系统就给此用户分配一个控制终端。例如,如果他通过串行终端登录进入,那末他的控制终端可能是“tty1a”,类似地,如果通过控制台登录,那末控制终端可能为“tty01”。无论控制终端的名字如何,控制终端记录了用户在登录期间的会话信息。特别地,控制终端维护着数条预定义的clist链表,每条链表用来对来往于键盘和屏幕的I/O信息进行缓冲。
要注意的是每个控制终端使用三个clist链表,分别是:“原始输入队列”,“正则队列”和“输出队列”。这三条队列是固定的,无法重新配置。注意不要与核心参数中的NCLIST参数搞混。NCLIST参数并不控制clist链表的数目,而是确定“cblocks”的数目。
如下图所示,“clist”是指向一条链表的指针,而链表由“cblock”组成,每个“cblock”可以缓冲多达64个字符(注意:cblock的大小由硬件决定,不可改变)。
clist
cblock
cblock
cblock
在内核中有一个名为“ttyhog”的变量,限制了“原始输入队列”可以接纳的字符总数。缺省地,ttyhog的值为256。因为每个cblock能够容纳64个字符,这意味着clist的队列由四个cblock组成(256/64=4)。
clist
cblock
cblock
cblock
cblock
对大多数系统来说,只需按如下公式设置NCLIST参数的值即可:
NCLIST = 12 *同时登录进入系统的用户数
四、进程通信参数的调整
UNIX内核提供了三种方式用于进程之间的通信:信号量、消息队列和共享数据。每种方式容许数个进程相互之间进行通信。对与IPC(进程通信)相关的核心参数进行调整也许不能提高系统的性能,但它能减少系统核心大小的尺寸。这一点通过适当配置IPC参数,恰好满足系统需要来实现。
IPC参数数值设定与运行于系统之上的应用程序有很大的关系。这一节不准备对各种具体的应用程序的IPC参数设置进行介绍,而主要介绍IPC参数的原理以供用户在具体设置IPC参数时参考。
信号量
信号量是用来同步进程的一种机制。信号量提供一种方法来保证两个进程不会同时试图使用同一种资源(也就是说,信号量保证了进程间的互斥)。
一般来说,一个信号量可以取两个值:0和1。0通常用来表示某个进程可以占用这个信号量,而1表示某个进程已经占用了这个信号量,因此其他进程只能等待信号量的释放。
SCO UNIX 系统V中的信号量概念与通常的信号量概念略有不同。下图说明了不同点:
单个信号量
信号量集
在SCO UNIX系统V中,一个信号量是通常意义的信号量的集合。在本文中为了对此进行区分,我们称SCO UNIX系统V中的信号量为信号集,而单个信号量我们称之为单个信号量。
核心参数SEMMNI确定了在系统范围内分配多少个信号量集。
使用ipcs(ADM)命令可以确定系统目前使用的信号量集。
# ipcs -s
IPC status from /dev/kmem as of Fri Oct 16 11:09:29 1992
T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME
Semaphores:
s 0 0x6c737372 --ra-ra-ra- root other root other 3 11:39:44 11:39:43
ipc命令的输出表明目前只有一个信号量集在使用。通过对ipcs命令列出的信号量集的记数,可以确定应用系统所使用信号量集的最大数目,然后设置SEMMNI为此值加上一定的冗余量。
每个信号量集包含有一个或多个单个的信号量,而每个信号量集能够拥有的单个信号量的个数由SEMMSL参数决定。确定SEMMSL某个合适的值需要了解应用程序使用信号量资源的程度。
SEMMNS确定在系统范围内分配多少个单个的信号量。为了确定目前正在使用的单个信号量,同样使用ipcs(ADM)命令:
# ipcs -s
IPC status from /dev/kmem as of Fri Oct 16 11:09:29 1992
T ID KEY MODE OWNER GROUP CREATOR CGROUP NSEMS OTIME CTIME
Semaphores:
s 0 0x6c737372 --ra-ra-ra- root other root other 3 11:39:44 11:39:43
注意到NSEMS列的值为3,表明此信号量集使用3个单个信号量。通过计算ipcs所列出的单个信号量,可以得出某个应用程序所使用的单个信号量的最大个数,然后设置SEMMNS为此值加上一定的冗余量。
五、确定参数调整的效果
SCO UNIX操作系统提供了多种手段来帮助系统管理员对系统核心参数进行调整。
1、 sar命令
sar命令在文章中多次提到,建议读者要熟悉sar命令的-u、-b、-d、-v、-m、-p和-r选项。
2、 vmstat命令
vmstat可以提供系统中有关进程、调页、CPU和陷阱活动的统计数据。Vmstat提供的最有效的信息是通过该命令的-s选项产生的。
总之,系统操作员要根据应用系统的不同及时调整系统操作参数,特别是在运行数据库时。
【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭】
eton 回复于:2004-01-09 13:00:17 |
good |
ban76 回复于:2004-01-09 14:34:45 |
:lol:
好!!!! |
zhkun 回复于:2004-01-09 17:25:09 |
我的sco505服务器,就是带150个终端,兄弟你看通过哪些命令可以观察系统的性能,调整哪些参数,使我的服务器运行在最佳状态。
咱不来那一套理论行不行?咱整点实在的。等您坐谈论道........................... |
zhkun 回复于:2004-01-09 17:33:39 |
今天说调这个参数,明天说调那个参数,咱就来点实际的,你说我该通过哪些命令进行观察和判断,然后怎么修改吧,waitting.................................. |
zhkun 回复于:2004-01-10 10:17:26 |
I waitting ...... |
zhkun 回复于:2004-01-11 15:44:27 |
waitting ......
怎么没有了,unix_sco 老师我waitting......... |
unix_sco 回复于:2004-01-11 21:45:01 |
系统操作员要根据应用系统的不同及时调整系统操作参数。比如MAXUP改为100以上,以应对sco505服务器带150个终端,因进程太多而系统死锁。当然这些参数的调整时机,与你的机器配置、档次(如CPU数量、内存大小、CPU档次等等)有一定的关系。 |
jxp2002 回复于:2004-01-12 08:14:52 |
顶,这篇是好文章,建议加精! |
zhkun 回复于:2004-01-12 08:43:18 |
咱不整哪些虚无飘渺的、无边无际的、不着边际的东西,俺就需要实际的。使用哪些命令可以观察、判断,从而得出可以调整什么什么的参数。就是增加某些参数,可以说说为什么吗? |
zhkun 回复于:2004-01-12 09:00:20 |
一直waitting......................... |
zhkun 回复于:2004-01-13 16:46:50 |
一直waitting......................... |
sindney 回复于:2004-01-14 10:01:06 |
不错!!有帮助。初学什么都是新鲜的! |
yutian 回复于:2004-01-14 10:24:06 |
好东西 |
zhkun 回复于:2004-01-14 11:41:20 |
咱不整哪些虚无飘渺的、无边无际的、不着边际的东西,俺就需要实际的。使用哪些命令可以观察、判断,从而得出可以调整什么什么的参数。就是增加某些参数,可以说说为什么吗? |
sidr 回复于:2004-01-14 15:26:56 |
照单全收!thanks! |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/