<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Tuifei.com</title>
	<atom:link href="http://www.tuifei.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tuifei.com</link>
	<description>颓废?</description>
	<pubDate>Sat, 27 Sep 2008 08:37:02 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>linux sysctl.conf中相关重要设定的详细说明</title>
		<link>http://www.tuifei.com/2008/09/27/linux-sysctl.htm</link>
		<comments>http://www.tuifei.com/2008/09/27/linux-sysctl.htm#comments</comments>
		<pubDate>Sat, 27 Sep 2008 08:37:02 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[Unix|Linux]]></category>

		<guid isPermaLink="false">http://www.tuifei.com/?p=463</guid>
		<description><![CDATA[　　net.ipv4.tcp_syncookies = 1
表示开启SYN Cookies。当出现SYN等待队列溢出时，启用cookies来处理，可防范少量SYN攻击，默认为0，表示关闭；
　　net.ipv4.tcp_tw_reuse = 1
表示开启重用。允许将TIME-WAIT socke... ]]></description>
			<content:encoded><![CDATA[<p>　　net.ipv4.tcp_syncookies = 1<br />
表示开启SYN Cookies。当出现SYN等待队列溢出时，启用cookies来处理，可防范少量SYN攻击，默认为0，表示关闭；<br />
　　net.ipv4.tcp_tw_reuse = 1<br />
表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接，默认为0，表示关闭；<br />
　　net.ipv4.tcp_tw_recycle = 1<br />
表示开启TCP连接中TIME-WAIT sockets的快速回收，默认为0，表示关闭。<br />
　　net.ipv4.tcp_fin_timeout = 30<br />
表示如果套接字由本端要求关闭，这个参数决定了它保持在FIN-WAIT-2状态的时间。<br />
　　net.ipv4.tcp_keepalive_time = 1200<br />
表示当keepalive起用的时候，TCP发送keepalive消息的频度。缺省是2小时，改为20分钟。<br />
　　net.ipv4.ip_local_port_range = 1024 ? ?65000<br />
表示用于向外连接的端口范围。缺省情况下很小：32768到61000，改为1024到65000。<br />
　　net.ipv4.tcp_max_syn_backlog = 8192<br />
表示SYN队列的长度，默认为1024，加大队列长度为8192，可以容纳更多等待连接的网络连接数。<br />
　　net.ipv4.tcp_max_tw_buckets = 5000<br />
表示系统同时保持TIME_WAIT套接字的最大数量，如果超过这个数字，TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000，改为5000。对于Apache、Nginx等服务器，上几行的参数可以很好地减少TIME_WAIT套接字数量，但是对于Squid，效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量，避免Squid服务器被大量的TIME_WAIT套接字拖死。</p>
<p>$ /proc/sys/net/core/wmem_max<br />
最大socket写buffer,可参考的优化值:873200</p>
<p>$ /proc/sys/net/core/rmem_max<br />
最大socket读buffer,可参考的优化值:873200</p>
<p>$ /proc/sys/net/ipv4/tcp_wmem<br />
TCP写buffer,可参考的优化值: 8192 436600 873200</p>
<p>$ /proc/sys/net/ipv4/tcp_rmem<br />
TCP读buffer,可参考的优化值: 32768 436600 873200</p>
<p>$ /proc/sys/net/ipv4/tcp_mem<br />
同样有3个值,意思是:<br />
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.<br />
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.<br />
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.<br />
上述内存单位是页,而不是字节.<br />
可参考的优化值是:786432 1048576 1572864</p>
<p>$ /proc/sys/net/core/netdev_max_backlog<br />
进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.</p>
<p>$ /proc/sys/net/core/somaxconn<br />
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.<br />
可调整到256.</p>
<p>$ /proc/sys/net/core/optmem_max<br />
socket buffer的最大初始化值,默认10K.</p>
<p>$ /proc/sys/net/ipv4/tcp_max_syn_backlog<br />
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.<br />
可调整到2048.</p>
<p>$ /proc/sys/net/ipv4/tcp_retries2<br />
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.</p>
<p>$ /proc/sys/net/ipv4/tcp_keepalive_time<br />
$ /proc/sys/net/ipv4/tcp_keepalive_intvl<br />
$ /proc/sys/net/ipv4/tcp_keepalive_probes<br />
这3个参数与TCP KeepAlive有关.默认值是:</p>
<p>tcp_keepalive_time = 7200 seconds (2 hours)<br />
tcp_keepalive_probes = 9<br />
tcp_keepalive_intvl = 75 seconds</p>
<p>意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:</p>
<p>/proc/sys/net/ipv4/tcp_keepalive_time 1800<br />
/proc/sys/net/ipv4/tcp_keepalive_intvl 30<br />
/proc/sys/net/ipv4/tcp_keepalive_probes 3</p>
<p>$ proc/sys/net/ipv4/ip_local_port_range<br />
指定端口范围的一个配置,默认是32768 61000,已够大.</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=463&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_463" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/09/27/linux-sysctl.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>zt 构建支持Master/Slave读写分离的数据库操作类</title>
		<link>http://www.tuifei.com/2008/09/27/master_slave_mysql.htm</link>
		<comments>http://www.tuifei.com/2008/09/27/master_slave_mysql.htm#comments</comments>
		<pubDate>Sat, 27 Sep 2008 04:31:06 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[生活|Life]]></category>

		<guid isPermaLink="false">http://www.tuifei.com/?p=462</guid>
		<description><![CDATA[一般对于访问量比较大的网站来说，采用基本的MySQL Master/Slave 结构是很正常，而且一般都是一台Master，多台Slave的情况，但是一般在进行这个访问的时候问题比较多，因为读写操作必须分离，... ]]></description>
			<content:encoded><![CDATA[<p>一般对于访问量比较大的网站来说，采用基本的MySQL Master/Slave 结构是很正常，而且一般都是一台Master，多台Slave的情况，但是一般在进行这个访问的时候问题比较多，因为读写操作必须分离，所以今天没事就构造了这个数据库操作类。</p>
<p>数据库操作类基本特点：<br />
1. 支持一台Master，多台Slave的情况，所有SQL能够强制调用Master来处理<br />
2. 能够自动识别是写入还是读取操作，然后自动连接到需要的Master/Slave服务器。 操作过程中能够自动识别，如果没有Slave，则所有操作都是指向Master的，如果当前连接的Slave无法工作则自动连接其他Slave。对于Slave读取数据采用随机挑选Slave服务器的方式来读取数据<br />
3. 在同一个PHP程序中能够重用连接，不会重复去连接数据库，减少因为反复连接带来的资源消耗</p>
<p>缺点：<br />
1. 对于Slave是采取随机选择Slave来进行读取数据，所以不是真正意义上的负载均衡<br />
2. 每次初始化都是连接好所有的数据库，比较浪费连接资源和时间。 在多个PHP程序中无法保持数据库连接，每次启动都需要连接到远程数据库，浪费了很多连接处理的时间，但是这个跟PHP是脚本程序有关。<br />
3. 无法支持多个Master的情况，同时可定制性比较差，很多东西都是固定的，必须按照固有模式来执行查询</p>
<p>相关：<br />
代码中注释不是很全，部分注释而且不一定正确，所以如果自己使用，最好进行二次修改。<br />
本数据库类参考了我之前写的《简单快速有趣的MySQL数据库操作类：SimpleDB》，可以对照着看。<br />
（类库中的接口我大部分都经过了测试，都正常使用，如果发现不正常或者有更好的想法，请留言）</p>
<p>文件：db_common.class.php<br />
<code><br />
<?php<br />
//----------------------------------------------------<br />
//      Master/Slave数据库读写分开操作类<br />
//<br />
// 作者: heiyeluren <http://blog.csdn.net/heiyeshuwu><br />
// 时间: 2007-7-30<br />
// 描述：支持所有写操作在一台Master执行，所有读操作在<br />
//         Slave执行，并且能够支持多台Slave主机<br />
//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>/**<br />
 * 常量定义<br />
 */<br />
define(&#8221;_DB_INSERT&#8221;, 1);<br />
define(&#8221;_DB_UPDATE&#8221;, 2);</p>
<p>/**<br />
 * DB Common class<br />
 *<br />
 * 描述：能够分别处理一台Master写操作，多台Slave读操作<br />
 */<br />
class DBCommon<br />
{<br />
    /**<br />
     * 数据库配置信息<br />
     */<br />
    var $wdbConf = array();<br />
    var $rdbConf = array();<br />
    /**<br />
     * Master数据库连接<br />
     */<br />
    var $wdbConn = null;<br />
    /**<br />
     * Slave数据库连接<br />
     */<br />
    var $rdbConn = array();<br />
    /**<br />
     * 数据库结果<br />
     */<br />
    var $dbResult;<br />
    /**<br />
     * 数据库查询结果集<br />
     */<br />
    var $dbRecord;</p>
<p>    /**<br />
     * SQL语句<br />
     */<br />
    var $dbSql;<br />
    /**<br />
     * 数据库编码<br />
     */<br />
    var $dbCharset = &#8220;UTF8&#8243;;<br />
    /**<br />
     * 数据库版本<br />
     */<br />
    var $dbVersion = &#8220;4.1&#8243;;</p>
<p>    /**<br />
     * 初始化的时候是否要连接到数据库<br />
     */<br />
    var $isInitConn = false;<br />
    /**<br />
     * 是否要设置字符集<br />
     */<br />
    var $isCharset = true;<br />
    /**<br />
     * 数据库结果集提取方式<br />
     */<br />
    var $fetchMode = MYSQL_ASSOC;<br />
    /**<br />
     * 执行中发生错误是否记录日志<br />
     */<br />
    var $isLog = true;<br />
    /**<br />
     * 是否查询出错的时候终止脚本执行<br />
     */<br />
    var $isExit = false;</p>
<p>    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
    //<br />
    //  基础的DB操作<br />
    //<br />
    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>    /**<br />
     * 构造函数<br />
     *<br />
     * 传递配置信息，配置信息数组结构：<br />
     * $masterConf = array(<br />
     *        &#8220;host&#8221;    => Master数据库主机地址<br />
     *        &#8220;user&#8221;    => 登录用户名<br />
     *        &#8220;pwd&#8221;    => 登录密码<br />
     *        &#8220;db&#8221;    => 默认连接的数据库<br />
     *    );<br />
     * $slaveConf = array(<br />
     *        &#8220;host&#8221;    => Slave1数据库主机地址|Slave2数据库主机地址|&#8230;<br />
     *        &#8220;user&#8221;    => 登录用户名<br />
     *        &#8220;pwd&#8221;    => 登录密码<br />
     *        &#8220;db&#8221;    => 默认连接的数据库<br />
     *    );<br />
     */<br />
    function DBCommon($masterConf, $slaveConf=array()){<br />
        //构造数据库配置信息<br />
        if (is_array($masterConf) &#038;&#038; !empty($masterConf)){<br />
            $this->wdbConf = $masterConf;<br />
        }<br />
        if (!is_array($slaveConf) || empty($slaveConf)){<br />
            $this->rdbConf = $masterConf;<br />
        } else {<br />
            $this->rdbConf = $slaveConf;<br />
        }<br />
        //初始化连接（一般不推荐）<br />
        if ($this->isInitConn){<br />
            $this->getDbWriteConn();<br />
            $this->getDbReadConn();<br />
        }<br />
    }</p>
<p>    /**<br />
     * 获取Master的写数据连接<br />
     */<br />
    function getDbWriteConn(){<br />
        //判断是否已经连接<br />
        if ($this->wdbConn &#038;&#038; is_resource($this->wdbConn)) {<br />
            return $this->wdbConn;<br />
        }<br />
        //没有连接则自行处理<br />
        $db = $this->connect($this->wdbConf['host'], $this->wdbConf['user'], $this->wdbConf['pwd'], $this->wdbConf['db']);<br />
        if (!$db || !is_resource($db)) {<br />
            return false;<br />
        }<br />
        $this->wdbConn = $db;<br />
        return $this->wdbConn;<br />
    }</p>
<p>    /**<br />
     * 获取Slave的读数据连接<br />
     */<br />
    function getDbReadConn(){<br />
        //如果有可用的Slave连接，随机挑选一台Slave<br />
        if (is_array($this->rdbConn) &#038;&#038; !empty($this->rdbConn)) {<br />
            $key = array_rand($this->rdbConn);<br />
            if (isset($this->rdbConn[$key]) &#038;&#038; is_resource($this->rdbConn[$key])) {<br />
                return $this->rdbConn[$key];<br />
            }<br />
        }<br />
        //连接到所有Slave数据库，如果没有可用的Slave机则调用Master<br />
        $arrHost = explode(&#8221;|&#8221;, $this->rdbConf['host']);<br />
        if (!is_array($arrHost) || empty($arrHost)){<br />
            return $this->getDbWriteConn();<br />
        }<br />
        $this->rdbConn = array();<br />
        foreach($arrHost as $tmpHost){<br />
            $db = $this->connect($tmpHost, $this->rdbConf['user'], $this->rdbConf['pwd'], $this->rdbConf['db']);<br />
            if ($db &#038;&#038; is_resource($db)){<br />
                $this->rdbConn[] = $db;<br />
            }<br />
        }<br />
        //如果没有一台可用的Slave则调用Master<br />
        if (!is_array($this->rdbConn) || empty($this->rdbConn)){<br />
            $this->errorLog(&#8221;Not availability slave db connection, call master db connection&#8221;);<br />
            return $this->getDbWriteConn();<br />
        }<br />
        //随机在已连接的Slave机中选择一台<br />
        $key = array_rand($this->rdbConn);<br />
        if (isset($this->rdbConn[$key])  &#038;&#038; is_resource($this->rdbConn[$key])){<br />
            return $this->rdbConn[$key];<br />
        }<br />
        //如果选择的slave机器是无效的，并且可用的slave机器大于一台则循环遍历所有能用的slave机器<br />
        if (count($this->rdbConn) > 1){<br />
            foreach($this->rdbConn as $conn){<br />
                if (is_resource($conn)){<br />
                    return $conn;<br />
                }<br />
            }<br />
        }<br />
        //如果没有可用的Slave连接，则继续使用Master连接<br />
        return $this->getDbWriteConn();<br />
    }</p>
<p>    /**<br />
     * 连接到MySQL数据库公共方法<br />
     */<br />
    function connect($dbHost, $dbUser, $dbPasswd, $dbDatabase){<br />
        //连接数据库主机<br />
        $db = mysql_connect($dbHost, $dbUser, $dbPasswd);<br />
        if (!$db) {<br />
            $this->errorLog(&#8221;Mysql connect &#8220;. $dbHost .&#8221; failed&#8221;);<br />
            return false;<br />
        }<br />
        //选定数据库<br />
        if (!mysql_select_db($dbDatabase, $db)) {<br />
            $this->errorLog(&#8221;select db $dbDatabase failed&#8221;, $db);<br />
            return false;<br />
        }<br />
        //设置字符集<br />
        if ($this->isCharset){<br />
            if ( $this->dbVersion == &#8221; ){<br />
                $res = mysql_query(&#8221;SELECT VERSION()&#8221;);<br />
                $this->dbVersion = mysql_result($res, 0);<br />
            }</p>
<p>            if ($this->dbCharset!=&#8221; &#038;&#038; preg_match(&#8221;/^(5.|4.1)/&#8221;, $this->dbVersion)){<br />
                if (mysql_query(&#8221;SET NAMES &#8216;&#8221;.$this->dbCharset.&#8221;&#8216;&#8221;, $db) === false){<br />
                    $this->errorLog(&#8221;Set db_host &#8216;$dbHost&#8217; charset=&#8221;. $this->dbCharset .&#8221; failed.&#8221;, $db);<br />
                    return false;<br />
                }<br />
            }<br />
        }<br />
        return $db;<br />
    }</p>
<p>    /**<br />
     * 关闭数据库连接<br />
     */<br />
    function disconnect($dbConn=null, $closeAll=false){<br />
        //关闭指定数据库连接<br />
        if ($dbConn &#038;&#038; is_resource($dbConn)){<br />
            mysql_close($dbConn);<br />
            $dbConn = null;<br />
        }<br />
        //关闭所有数据库连接<br />
        if ($closeAll){<br />
            if ($this->rdbConn &#038;&#038; is_resource($this->rdbConn)){<br />
                mysql_close($this->rdbConn);<br />
                $this->rdbConn = null;<br />
            }<br />
            if (is_array($this->rdbConn) &#038;&#038; !empty($this->rdbConn)){<br />
                foreach($this->rdbConn as $conn){<br />
                    if ($conn &#038;&#038; is_resource($conn)){<br />
                        mysql_close($conn);<br />
                    }<br />
                }<br />
                $this->rdbConn = array();<br />
            }<br />
        }<br />
        return true;<br />
    }</p>
<p>    /**<br />
     * 选择数据库<br />
     */<br />
    function selectDb($dbName, $dbConn=null){<br />
        //重新选择一个连接的数据库<br />
        if ($dbConn &#038;&#038; is_resource($dbConn)){<br />
            if (!mysql_select_db($dbName, $dbConn)){<br />
                $this->errorLog(&#8221;Select database:$dbName failed.&#8221;, $dbConn);<br />
                return false;<br />
            }<br />
            return true;<br />
        }<br />
        //重新选择所有连接的数据库<br />
        if ($this->wdbConn &#038;&#038; is_resource($this->wdbConn)){<br />
            if (!mysql_select_db($dbName, $this->wdbConn)){<br />
                $this->errorLog(&#8221;Select database:$dbName failed.&#8221;, $this->wdbConn);<br />
                return false;<br />
            }<br />
        }<br />
        if (is_array($this->rdbConn &#038;&#038; !empty($this->rdbConn))){<br />
            foreach($this->rdbConn as $conn){<br />
                if ($conn &#038;&#038; is_resource($conn)){<br />
                    if (!mysql_select_db($dbName, $conn)){<br />
                        $this->errorLog(&#8221;Select database:$dbName failed.&#8221;, $conn);<br />
                        return false;<br />
                    }<br />
                }<br />
            }<br />
        }<br />
        return true;<br />
    }</p>
<p>    /**<br />
     * 执行SQL语句（底层操作）<br />
     */<br />
    function query($sql, $isMaster=false){<br />
        if (trim($sql) == &#8220;&#8221;){<br />
            $this->errorLog(&#8221;Sql query is empty.&#8221;);<br />
            return false;<br />
        }<br />
        //获取执行SQL的数据库连接<br />
        if (!$isMaster){<br />
            $optType = trim(strtolower(array_shift(explode(&#8221; &#8220;, ltrim($sql)))));<br />
        }<br />
        if ($isMaster || $optType!=&#8221;select&#8221;){<br />
            $dbConn = $this->getDbWriteConn();<br />
        } else {<br />
            $dbConn = $this->getDbReadConn();<br />
        }<br />
        if (!$dbConn || !is_resource($dbConn)){<br />
            $this->errorLog(&#8221;Not availability db connection. Query SQL:&#8221;. $sql);<br />
            if ($this->isExit) {<br />
                exit;<br />
            }<br />
            return false;<br />
        }<br />
        //执行查询<br />
        $this->dbSql = $sql;<br />
        $this->dbResult = null;<br />
        $this->dbResult = @mysql_query($sql, $dbConn);<br />
        if ($this->dbResult === false){<br />
            $this->errorLog(&#8221;Query sql failed. SQL:&#8221;.$sql, $dbConn);<br />
            if ($this->isExit) {<br />
                exit;<br />
            }<br />
            return false;<br />
        }<br />
        return true;<br />
    }</p>
<p>    /**<br />
     * 错误日志<br />
     */<br />
    function errorLog($msg=&#8221;, $conn=null){<br />
        if (!$this->isLog){<br />
            return;<br />
        }<br />
        if ($msg==&#8221; &#038;&#038; !$conn) {<br />
            return false;<br />
        }<br />
        $log = &#8220;MySQL Error: $msg&#8221;;<br />
        if ($conn &#038;&#038; is_resource($conn)) {<br />
            $log .= &#8221; mysql_msg:&#8221;. mysql_error($conn);<br />
        }<br />
        $log .= &#8221; [". date("Y-m-d H:i:s") ."]&#8220;;<br />
        error_log($log);<br />
        return true;<br />
    }</p>
<p>    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
    //<br />
    //       数据获取接口<br />
    //<br />
    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
    /**<br />
     * 获取SQL执行的全部结果集(二维数组)<br />
     *<br />
     * @param string $sql 需要执行查询的SQL语句<br />
     * @return 成功返回查询结果的二维数组,失败返回false<br />
     */<br />
    function getAll($sql, $isMaster=false){<br />
        if (!$this->query($sql, $isMaster)){<br />
            return false;<br />
        }<br />
        $this->dbRecord = array();<br />
        while ($row = @mysql_fetch_array($this->dbResult, $this->fetchMode)) {<br />
            $this->dbRecord[] = $row;<br />
        }<br />
        @mysql_free_result($this->dbResult);<br />
        if (!is_array($this->dbRecord) || empty($this->dbRecord)){<br />
            return false;<br />
        }<br />
        return $this->dbRecord;<br />
    }</p>
<p>    /**<br />
     * 获取单行记录(一维数组)<br />
     *<br />
     * @param string $sql 需要执行查询的SQL语句<br />
     * @return 成功返回结果记录的一维数组,失败返回false<br />
     */<br />
    function getRow($sql, $isMaster=false){<br />
        if (!$this->query($sql, $isMaster)){<br />
            return false;<br />
        }<br />
        $this->dbRecord = array();<br />
        $this->dbRecord = @mysql_fetch_array($this->dbResult, $this->fetchMode);<br />
        @mysql_free_result($this->dbResult);<br />
        if (!is_array($this->dbRecord) || empty($this->dbRecord)){<br />
            return false;<br />
        }<br />
        return $this->dbRecord;<br />
    }</p>
<p>    /**<br />
     * 获取一列数据(一维数组)<br />
     *<br />
     * @param string $sql 需要获取的字符串<br />
     * @param string $field 需要获取的列,如果不指定,默认是第一列<br />
     * @return 成功返回提取的结果记录的一维数组,失败返回false<br />
     */<br />
    function getCol($sql, $field=&#8221;, $isMaster=false){<br />
        if (!$this->query($sql, $isMaster)){<br />
            return false;<br />
        }<br />
        $this->dbRecord = array();<br />
        while($row = @mysql_fetch_array($this->dbResult, $this->fetchMode)){<br />
            if (trim($field) == &#8221;){<br />
                $this->dbRecord[] = current($row);<br />
            } else {<br />
                $this->dbRecord[] = $row[$field];<br />
            }<br />
        }<br />
        @mysql_free_result($this->dbResult);<br />
        if (!is_array($this->dbRecord) || empty($this->dbRecord)){<br />
            return false;<br />
        }<br />
        return $this->dbRecord;<br />
    }</p>
<p>    /**<br />
     * 获取一个数据(当条数组)<br />
     *<br />
     * @param string $sql 需要执行查询的SQL<br />
     * @return 成功返回获取的一个数据,失败返回false<br />
     */<br />
    function getOne($sql, $field=&#8221;, $isMaster=false){<br />
        if (!$this->query($sql, $isMaster)){<br />
            return false;<br />
        }<br />
        $this->dbRecord = array();<br />
        $row = @mysql_fetch_array($this->dbResult, $this->fetchMode);<br />
        @mysql_free_result($this->dbResult);<br />
        if (!is_array($row) || empty($row)){<br />
            return false;<br />
        }<br />
        if (trim($field) != &#8221;){<br />
            $this->dbRecord = $row[$field];<br />
        }else{<br />
            $this->dbRecord = current($row);<br />
        }<br />
        return $this->dbRecord;<br />
    }</p>
<p>    /**<br />
     * 获取指定各种条件的记录<br />
     *<br />
     * @param string $table 表名(访问的数据表)<br />
     * @param string $field 字段(要获取的字段)<br />
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)<br />
     * @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)<br />
     * @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)<br />
     * @param bool $single 是否只是取单条记录(是调用getRow还是getAll,默认是false,即调用getAll)<br />
     * @return 成功返回记录结果集的数组,失败返回false<br />
     */<br />
    function getRecord($table, $field=&#8217;*', $where=&#8221;, $order=&#8221;, $limit=&#8221;, $single=false, $isMaster=false){<br />
        $sql = &#8220;SELECT $field FROM $table&#8221;;<br />
        $sql .= trim($where)!=&#8221; ? &#8221; WHERE $where &#8221; : $where;<br />
        $sql .= trim($order)!=&#8221; ? &#8221; ORDER BY $order &#8221; : $order;<br />
        $sql .= trim($limit)!=&#8221; ? &#8221; LIMIT $limit &#8221; : $limit;<br />
        if ($single){<br />
            return $this->getRow($sql, $isMaster);<br />
        }<br />
        return $this->getAll($sql, $isMaster);<br />
    }</p>
<p>    /**<br />
     * 获取指点各种条件的记录(跟getRecored类似)<br />
     *<br />
     * @param string $table 表名(访问的数据表)<br />
     * @param string $field 字段(要获取的字段)<br />
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)<br />
     * @param array $order_arr 排序数组(格式类似于: array(&#8217;id&#8217;=>true), 那么就是按照ID为顺序排序, array(&#8217;id&#8217;=>false), 就是按照ID逆序排序)<br />
     * @param array $limit_arr 提取数据的限制数组()<br />
     * @return unknown<br />
     */<br />
    function getRecordByWhere($table, $field=&#8217;*', $where=&#8221;, $arrOrder=array(), $arrLimit=array(), $isMaster=false){<br />
        $sql = &#8221; SELECT $field FROM $table &#8220;;<br />
        $sql .= trim($where)!=&#8221; ? &#8221; WHERE $where &#8221; : $where;<br />
        if (is_array($arrOrder) &#038;&#038; !empty($arrOrder)){<br />
            $arrKey = key($arrOrder);<br />
            $sql .= &#8221; ORDER BY $arrKey &#8221; . ($arrOrder[$arrKey] ? &#8220;ASC&#8221; : &#8220;DESC&#8221;);<br />
        }<br />
        if (is_array($arrLimit) &#038;&#038; !empty($arrLimit)){<br />
            $startPos = intval(array_shift($arrLimit));<br />
            $offset = intval(array_shift($arrLimit));<br />
            $sql .= &#8221; LIMIT $startPos,$offset &#8220;;<br />
        }<br />
        return $this->getAll($sql, $isMaster);<br />
    }</p>
<p>    /**<br />
     * 获取指定条数的记录<br />
     *<br />
     * @param string $table 表名<br />
     * @param int $startPos 开始记录<br />
     * @param int $offset 偏移量<br />
     * @param string $field 字段名<br />
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)<br />
     * @param string $order 排序(按照什么字段排序,不包括ORDER BY,默认为空)<br />
     * @return 成功返回包含记录的二维数组,失败返回false<br />
     */<br />
    function getRecordByLimit($table, $startPos, $offset, $field=&#8217;*', $where=&#8221;, $oder=&#8221;, $isMaster=false){<br />
        $sql = &#8221; SELECT $field FROM $table &#8220;;<br />
        $sql .= trim($where)!=&#8221; ? &#8221; WHERE $where &#8221; : $where;<br />
        $sql .= trim($order)!=&#8221; ? &#8221; ORDER BY $order &#8221; : $order;<br />
        $sql .= &#8221; LIMIT $startPos,$offset &#8220;;<br />
        return $this->getAll($sql, $isMaster);<br />
    }</p>
<p>    /**<br />
     * 获取排序记录<br />
     *<br />
     * @param string $table 表名<br />
     * @param string $orderField 需要排序的字段(比如id)<br />
     * @param string $orderMethod 排序的方式(1为顺序, 2为逆序, 默认是1)<br />
     * @param string $field 需要提取的字段(默认是*,就是所有字段)<br />
     * @param string $where 条件(获取记录的条件语句,不包括WHERE,默认为空)<br />
     * @param string $limit 限制记录(需要提取多少记录,不包括LIMIT,默认为空)<br />
     * @return 成功返回记录的二维数组,失败返回false<br />
     */<br />
    function getRecordByOrder($table, $orderField, $orderMethod=1, $field=&#8217;*', $where=&#8221;, $limit=&#8221;, $isMaster=false){<br />
        //$order_method的值为1则为顺序, $order_method值为2则2则是逆序排列<br />
        $sql = &#8221; SELECT $field FROM $table &#8220;;<br />
        $sql .= trim($where)!=&#8221; ? &#8221; WHERE $where &#8221; : $where;<br />
        $sql .= &#8221; ORDER BY $orderField &#8221; . ( $orderMethod==1 ? &#8220;ASC&#8221; : &#8220;DESC&#8221;);<br />
        $sql .= trim($limit)!=&#8221; ? &#8221; LIMIT $limit &#8221; : $limit;<br />
        return $this->getAll($sql, $isMaster);<br />
    }</p>
<p>    /**<br />
     * 分页查询(限制查询的记录条数)<br />
     *<br />
     * @param string $sql 需要查询的SQL语句<br />
     * @param int $startPos 开始记录的条数<br />
     * @param int $offset 每次的偏移量,需要获取多少条<br />
     * @return 成功返回获取结果记录的二维数组,失败返回false<br />
     */<br />
    function limitQuery($sql, $startPos, $offset, $isMaster=false){<br />
        $start_pos = intval($startPos);<br />
        $offset = intval($offset);<br />
        $sql = $sql . &#8221; LIMIT $startPos,$offset &#8220;;<br />
        return $this->getAll($sql, $isMaster);<br />
    }</p>
<p>    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
    //<br />
    //     无数据返回操作<br />
    //<br />
    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
    /**<br />
     * 执行执行非Select查询操作<br />
     *<br />
     * @param string $sql 查询SQL语句<br />
     * @return bool  成功执行返回true, 失败返回false<br />
     */<br />
    function execute($sql, $isMaster=false){<br />
        if (!$this->query($sql, $isMaster)){<br />
            return false;<br />
        }<br />
        return true;<br />
//        $count = @mysql_affected_rows($this->dbLink);<br />
//        if ($count <= 0){<br />
//            return false;<br />
//        }<br />
//        return true;<br />
    }</p>
<p>    /**<br />
     * 自动执行操作(针对Insert/Update操作)<br />
     *<br />
     * @param string $table 表名<br />
     * @param array $field_array 字段数组(数组中的键相当于字段名,数组值相当于值, 类似 array( 'id' => 100, &#8216;user&#8217; => &#8216;heiyeluren&#8217;)<br />
     * @param int $mode 执行操作的模式 (是插入还是更新操作, 1是插入操作Insert, 2是更新操作Update)<br />
     * @param string $where 如果是更新操作,可以添加WHERE的条件<br />
     * @return bool 执行成功返回true, 失败返回false<br />
     */<br />
    function autoExecute($table, $arrField, $mode, $where=&#8221;, $isMaster=false){<br />
        if ($table==&#8221; || !is_array($arrField) || empty($arrField)){<br />
            return false;<br />
        }<br />
        //$mode为1是插入操作(Insert), $mode为2是更新操作<br />
        if ($mode == 1){<br />
            $sql = &#8221; INSERT INTO `$table` SET &#8220;;<br />
        } elseif ($mode == 2) {<br />
            $sql = &#8221; UPDATE `$table` SET &#8220;;<br />
        } else {<br />
            $this->errorLog(&#8221;Operate type &#8216;$mode&#8217; is error, in call DB::autoExecute process table $table.&#8221;);<br />
            return false;<br />
        }<br />
        foreach ($arrField as $key => $value){<br />
            $sql .= &#8220;`$key`=&#8217;$value&#8217;,&#8221;;<br />
        }<br />
        $sql = rtrim($sql, &#8216;,&#8217;);<br />
        if ($mode==2 &#038;&#038; $where!=&#8221;){<br />
            $sql .= &#8220;WHERE $where&#8221;;<br />
        }<br />
        return $this->execute($sql, $isMaster);<br />
    }</p>
<p>    /**<br />
     * 锁表表<br />
     *<br />
     * @param string $tblName 需要锁定表的名称<br />
     * @return mixed 成功返回执行结果，失败返回错误对象<br />
     */<br />
    function lockTable($tblName){<br />
        return $this->query(&#8221;LOCK TABLES $tblName&#8221;, true);<br />
    }</p>
<p>    /**<br />
     * 对锁定表进行解锁<br />
     *<br />
     * @param string $tblName 需要锁定表的名称<br />
     * @return mixed 成功返回执行结果，失败返回错误对象<br />
     */<br />
    function unlockTable($tblName){<br />
        return $this->query(&#8221;UNLOCK TABLES $tblName&#8221;, true);<br />
    }</p>
<p>    /**<br />
     * 设置自动提交模块的方式（针对InnoDB存储引擎）<br />
     * 一般如果是不需要使用事务模式，建议自动提交为1，这样能够提高InnoDB存储引擎的执行效率，如果是事务模式，那么就使用自动提交为0<br />
     *<br />
     * @param bool $autoCommit 如果是true则是自动提交，每次输入SQL之后都自动执行，缺省为false<br />
     * @return mixed 成功返回true，失败返回错误对象<br />
     */<br />
    function setAutoCommit($autoCommit = false){<br />
        $autoCommit = ( $autoCommit ? 1 : 0 );<br />
        return $this->query(&#8221;SET AUTOCOMMIT = $autoCommit&#8221;, true);<br />
    }</p>
<p>    /**<br />
     * 开始一个事务过程（针对InnoDB引擎，兼容使用 BEGIN 和 START TRANSACTION）<br />
     *<br />
     * @return mixed 成功返回true，失败返回错误对象<br />
     */<br />
    function startTransaction(){<br />
        if (!$this->query(&#8221;BEGIN&#8221;)){<br />
            return $this->query(&#8221;START TRANSACTION&#8221;, true);<br />
        }<br />
    }</p>
<p>    /**<br />
     * 提交一个事务（针对InnoDB存储引擎）<br />
     *<br />
     * @return mixed 成功返回true，失败返回错误对象<br />
     */<br />
    function commit(){<br />
        if (!$this->query(&#8221;COMMIT&#8221;, true)){<br />
            return false;<br />
        }<br />
        return $this->setAutoCommit( true );<br />
    }</p>
<p>    /**<br />
     * 发生错误，会滚一个事务（针对InnoDB存储引擎）<br />
     *<br />
     * @return mixed 成功返回true，失败返回错误对象<br />
     */</p>
<p>    function rollback(){<br />
        if (!$this->query(&#8221;ROLLBACK&#8221;, true)){<br />
            return false;<br />
        }<br />
        return $this->setAutoCommit( true );<br />
    }</p>
<p>    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
    //<br />
    //    其他数据相关操作<br />
    //<br />
    //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
    /**<br />
     * 获取最后一次查询的SQL语句<br />
     *<br />
     * @return string 返回最后一次查询的SQL语句<br />
     */<br />
    function getLastSql(){<br />
        return $this->dbSql;<br />
    }</p>
<p>    /**<br />
     * 获取上次插入操作的的ID<br />
     *<br />
     * @return int 如果没有连接或者查询失败,返回0, 成功返回ID<br />
     */<br />
    function getLastId(){<br />
        $dbConn = $this->getDbWriteConn();<br />
        if (($lastId = mysql_insert_id($dbConn)) > 0){<br />
            return $lastId;<br />
        }<br />
        return $this->getOne(&#8221;SELECT LAST_INSERT_ID()&#8221;, &#8221;, true);<br />
    }</p>
<p>    /**<br />
     * 获取记录集里面的记录条数 (用于Select操作)<br />
     *<br />
     * @return int 如果上一次无结果集或者记录结果集为空,返回0, 否则返回结果集数量<br />
     */<br />
    function getNumRows($res=null){<br />
        if (!$res || !is_resource($res)){<br />
            $res = $this->dbResult;<br />
        }<br />
        return mysql_num_rows($res);<br />
    }</p>
<p>    /**<br />
     * 获取受到影响的记录数量 (用于Update/Delete/Insert操作)<br />
     *<br />
     * @return int 如果没有连接或者影响记录为空, 否则返回影响的行数量<br />
     */<br />
    function getAffectedRows(){<br />
        $dbConn = $this->getDbWriteConn();<br />
        if ( ($affetedRows = mysql_affected_rows($dbConn)) <= 0){<br />
            return $affetedRows;<br />
        }<br />
        return $this->getOne(&#8221;SELECT ROW_COUNT()&#8221;, &#8220;&#8221;, true);<br />
    }</p>
<p>}</p>
<p>?></p>
<p></code><br />
 测试代码文件：<br />
<code></p>
<p><?php<br />
/**<br />
 * 测试代码<br />
 */</p>
<p> //构造数据库配置信息<br />
$masterConf = array("host"=>&#8220;localhost&#8221;, &#8220;user&#8221;=>&#8221;root&#8221;, &#8220;pwd&#8221;=>&#8221;", &#8220;db&#8221;=>&#8221;db&#8221;);<br />
$slaveConf = array(&#8221;host&#8221;=>&#8221;localhost|localhost&#8221;, &#8220;user&#8221;=>&#8221;root&#8221;, &#8220;pwd&#8221;=>&#8221;", &#8220;db&#8221;=>&#8221;db&#8221;);</p>
<p>//初始化类<br />
$db = new DBCommon($masterConf, $slaveConf);<br />
print_r($db);</p>
<p>//创建表<br />
$db->execute(&#8221;CREATE TABLE `tbl1` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT,  `name` CHAR(32) DEFAULT NULL,  `email` CHAR(64) DEFAULT NULL,  PRIMARY KEY (`id`))ENGINE=MyISAM;&#8221;);</p>
<p>//插入数据<br />
$arrInsert = array(&#8221;name&#8221; => &#8220;heiyeluren&#8221;, &#8220;email&#8221;=>&#8221;heiyeluren@125.com&#8221;);<br />
$db->autoExecute(&#8221;tbl1&#8243;, $arrInsert, _DB_INSERT);<br />
$arrInsert = array(&#8221;name&#8221; => &#8220;heiyeluren2&#8243;, &#8220;email&#8221;=>heiyeluren@128.com);<br />
$db->autoExecute(&#8221;tbl1&#8243;, $arrInsert, _DB_INSERT);<br />
$s = $db->getAffectedRows();<br />
echo $s;</p>
<p>//获取数据<br />
$s = $db->getAll(&#8221;select * from tbl1&#8243;);<br />
print_r($s);</p>
<p>//选择其他数据库<br />
$db->selectDb(&#8221;test&#8221;);</p>
<p>//关闭所有连接<br />
$db->disconnect(null, true);</p>
<p>?><br />
 </code></p>
<p>测试输出结果：<br />
<code><br />
DBCommon Object<br />
(<br />
    [wdbConf] => Array<br />
        (<br />
            [host] => localhost<br />
            [user] => root<br />
            [pwd] =><br />
            [db] => db<br />
        )</p>
<p>    [rdbConf] => Array<br />
        (<br />
            [host] => localhost|localhost<br />
            [user] => root<br />
            [pwd] =><br />
            [db] => db<br />
        )</p>
<p>    [wdbConn] =><br />
    [rdbConn] => Array<br />
        (<br />
        )</p>
<p>    [dbResult] =><br />
    [dbRecord] =><br />
    [dbSql] =><br />
    [dbCharset] => UTF8<br />
    [dbVersion] => 4.1<br />
    [isInitConn] =><br />
    [isCharset] => 1<br />
    [fetchMode] => 1<br />
    [isLog] => 1<br />
    [isExit] =><br />
)<br />
1<br />
Array<br />
(<br />
    [0] => Array<br />
        (<br />
            [id] => 1<br />
            [name] => heiyeluren<br />
            [email] => heiyeluren@125.com<br />
        )</p>
<p>    [1] => Array<br />
        (<br />
            [id] => 2<br />
            [name] => heiyeluren2<br />
            [email] => heiyeluren@<br />
        )</p>
<p>)128.com<br />
 </code></p>
<p>【其他数据操作方法使用代码】 </p>
<p><code><br />
/**<br />
 *  示例代码<br />
 */</p>
<p>    //构造数据库配置信息<br />
    $masterConf = array(<br />
        "host"  => "192.168.0.1",<br />
        "user"  => "root",<br />
        "pwd"   => "",<br />
        "db"    => "db"<br />
    );<br />
    $slaveConf = array(<br />
        "host"  => "192.168.0.3|192.168.0.2",<br />
        "user"  => "root",<br />
        "pwd"   => "",<br />
        "db"    => "db"<br />
    );</p>
<p>    //初始化类<br />
    $db = new DBCommon($masterConf, $slaveConf);</p>
<p>    //创建表<br />
    $db->execute("CREATE TABLE `tbl1` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT,  `name` CHAR(32) DEFAULT NULL,  `email` CHAR(64) DEFAULT NULL,  PRIMARY KEY (`id`))ENGINE=MyISAM;");</p>
<p>    //插入数据<br />
    $arrInsert = array(<br />
        "name"  => "heiyeluren",<br />
        "email" => "heiyeluren@125.com"<br />
    );<br />
    $db->autoExecute("tbl1", $arrInsert, _DB_INSERT);</p>
<p>    //更新数据<br />
    $arrUpdate = array(<br />
        "name"  => "heiyeluren2",<br />
        "email" => "heiyeluren@1111.com"<br />
    );<br />
    $db->autoExecute("tbl1", $arrUpdate, _DB_UPDATE, "id = 1");</p>
<p>    //获取操作影响的行<br />
    $s = $db->getAffectedRows();</p>
<p>    //获取数据</p>
<p>    //获取所有数据（二维数组）<br />
    $s = $db->getAll("select * from tbl1");<br />
    //获取一行数据（一维数组）<br />
    $s = $db->getRow("select * from tbl1 where id = 1");<br />
    //获取一列数据（一维数组）<br />
    $s = $db->getCol("select id from tbl1 where name LIKE '%heiyeluren%'");<br />
    //获取一个数据（直接返回数据）<br />
    $s = $db->getOne("select count(1) from tbl1");</p>
<p>    //删除数据<br />
    $db->execute("delete from tbl1 where id = 1");</p>
<p>    //选择其他数据库<br />
    $db->selectDb("test");</p>
<p>    //关闭所有连接<br />
    $db->disconnect(null, true);<br />
</code></p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=462&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_462" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/09/27/master_slave_mysql.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>bind 下的委派</title>
		<link>http://www.tuifei.com/2008/08/18/bind-accreditation.htm</link>
		<comments>http://www.tuifei.com/2008/08/18/bind-accreditation.htm#comments</comments>
		<pubDate>Mon, 18 Aug 2008 09:48:36 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[网络|Network]]></category>
<category>bind</category>
		<guid isPermaLink="false">http://www.tuifei.com/?p=461</guid>
		<description><![CDATA[在BIND DNS服务器中创建一个DNS子域是相当简单的，步骤分为三个部分：
1.命名子域
2.将子域委派给一个或者多个域名服务器
3.提供“域名服务器黏结记录”（nameserver glue records）和子域的命名空... ]]></description>
			<content:encoded><![CDATA[<p>在BIND DNS服务器中创建一个DNS子域是相当简单的，步骤分为三个部分：</p>
<p>1.命名子域</p>
<p>2.将子域委派给一个或者多个域名服务器</p>
<p>3.提供“域名服务器黏结记录”（nameserver glue records）和子域的命名空间（namespace）内部的主机名给任意一个委派的域名服务器，以便子域外部的机器可以解析这个域名服务器。</p>
<p>事实上，第一和第二步已经实现了每个子域名服务器的单一记录，当你将子域名委派给在DNS子域里面有主机名的服务器时，需要第三步，但并不是必需的。</p>
<p>创建子域</p>
<p>为了创建子域，你需要以root进入到父域名的主DNS服务器，编辑父域名的zone文件，完成编辑之后重新加载zone（reload zone）。</p>
<p>在BIND的配置文件/etc/named.conf中zone声明了你的父域，定义了zone文件名和你想要修改的域。</p>
<p>记住，zone文件将会存放在/etc/named.conf中全局选项所声明的directory下（默认是/var/named）。</p>
<p>这里是named.conf文件zone生命的一个例子，zone文件名是testdomain.bogus.zone:</p>
<p>zone &#8220;testdomain.bogus&#8221; {<br />
        type master;<br />
        file &#8220;testdomain.bogus.zone&#8221;;<br />
        allow-update { none; };<br />
};</p>
<p>在修改zone文件之前先做个备份，然后用你喜欢的文本编辑器打开zone文件：</p>
<p>      # cd /var/named</p>
<p>      # cp testdomain.bogus.zone testdomain.bogus.zone.backup</p>
<p>      # vim testdomain.bogus.zone</p>
<p>下面是域名testdomain.bogus的zone文件的一个例子，在那里，我们将创建子域subdomain1.testdomain.bogus。</p>
<p>假设已存在的testdomain.bogus的zone文件已经包含所有下面显示的记录，到&#8221;EXISTING RECORDS STOP HERE&#8221;这行。</p>
<p>下面黑体的记录（&#8221;EXISTING RECORDS STOP HERE&#8221;行之后）是我们要创建DNS子域的新记录，委派给三个域名服务器，并且添加了一条NS glue记录给子域里的一个域名服务器。</p>
<p>$TTL 3D<br />
@        IN        SOA        ns1.testdomain.bogus. root.testdomain.bogus. (<br />
                                2004080203        ; zone file serial #<br />
                                8H                ; refresh<br />
                                2H                ; retry<br />
                                1W                ; expire<br />
                                1D )                ; SOA minimum<br />
; NS&#8217;S AUTHORITATIVE FOR PARENT DOMAIN:<br />
testdomain.bogus.                NS        ns1.testdomain.bogus.<br />
testdomain.bogus.                NS        ns2.testdomain.bogus.<br />
;<br />
; A RECORDS FOR THE PARENT DOMAIN&#8217;S AUTHORITATIVE NS&#8217;S:<br />
ns1.testdomain.bogus.                A        10.1.2.3<br />
ns2.testdomain.bogus.                A        10.1.2.4<br />
;<br />
; ORDINARY HOSTS IN TESTDOMAIN.BOGUS:<br />
host01                                A        10.1.2.11<br />
host02                                A        10.2.2.12<br />
;<br />
; EXISTING RECORDS STOP HERE<br />
;<br />
; HERE WE CREATE OUR DNS SUBDOMAIN BY ADDING THESE RECORDS:<br />
; Name the subdomain:                Now delegate it to these nameservers (MUST be an FQDN hostname, NOT AN IP):<br />
subdomain1.testdomain.bogus.        NS        ns1.subdomain1.testdomain.bogus. ; inside the subdomain - needs NS glue record<br />
subdomain1.testdomain.bogus.        NS        ns1.testdomain.bogus.                 ; not in subdomain - no glue required<br />
subdomain1.testdomain.bogus.        NS        ns.myisp.bogus.                         ; not in subdomain - no glue required<br />
;<br />
; GLUE RECORD FOR ns1.subdomain1.testdomain.bogus -<br />
; NEEDED SINCE IT IS INSIDE THE SUBDOMAIN<br />
ns1.subdomain1.testdomain.bogus.        A        10.4.5.6</p>
<p>注意：在保存文件，重新加载（reloading）之前，别忘了增加zone文件的序号（serial number）！</p>
<p>上面例子中，子域委派权威给其中一个父域名服务器ns1.testdoamin.bogus。并不需要父域名的NS也是子域名的NS，是DNS管理员有权限管理的任意一个就行。</p>
<p>你需要创建子域的zone文件，将子域添加到将成为子域的权威的服务器的/etc/named.conf配置文件。以下是主服务器上基本的子域的zone声明部分：</p>
<p>zone &#8220;subdomain1.testdomain.bogus&#8221; {<br />
        type master;<br />
        file &#8220;subdomain1.testdomain.bogus.zone&#8221;;<br />
        allow-update { none; };<br />
};</p>
<p>子域zone文件的基本部分：</p>
<p>$TTL 3D<br />
@        IN        SOA        ns1.subdomain1.testdomain.bogus. root.subdomain1.testdomain.bogus. (<br />
                                2004080203      ; zone file serial#<br />
                                8H              ; refresh<br />
                                2H              ; retry<br />
                                1W              ; expire<br />
                                1D )            ; SOA minimum<br />
;<br />
subdomain1.testdomain.bogus.                NS        ns1.subdomain1.testdomain.bogus.<br />
;<br />
; A RECORDS FOR THIS SUBDOMAIN<br />
ns1.subdomain1.testdomain.bogus.        A        10.4.5.6<br />
host01                                        A        10.4.5.6</p>
<p>在父域名服务器reload父域的zone文件之前，建议你正确配置了子域的域名服务器，并且能正确提供子域的记录。</p>
<p>当你觉得子域名服务器已经正常工作，以root身份执行下面命令，reload父域的zone文件：</p>
<p># rndc reload</p>
<p>现在，你就拥有了子域DNS。</p>
<p>关于BIND DNS服务器配置的文档，DNS原理，请参考下面资源：</p>
<p>＊BIND Administrator&#8217;s Reference Manual, HTML格式（在安装了bind RPM包的红帽企业版Linux 系统上可以得到）</p>
<p>/usr/share/doc/bind-[version]/arm/Bv9ARM.html</p>
<p>＊Linux Documentation Project Website中的DNS HOW-TO</p>
<p>http://www.tldp.org/HOWTO/DNS-HOWTO.html</p>
<p>simple sample:<br />
abc.com 如何委任 tmp.abc.com<br />
linux 下很簡單：<br />
在 abc.com 的 db file 中加兩行(或多行，若有多個 ns 的話)：<br />
tmp IN NS ns1.tmp.abc.com.<br />
ns1.tmp IN A 1.2.3.4</p>
<p>問題二：<br />
在 ns1.tmp.abc.com 的 named.conf 中設一個 forward zone ：</p>
<p>zone &#8220;abc.com&#8221; IN {<br />
    type forward;<br />
    forwarders { 4.3.2.1; };<br />
};<br />
4.3.2.1 是 abc.com 的 ns 所用 IP  。</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=461&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_461" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/08/18/bind-accreditation.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>用Excle的Vlookup函数对比二张表格中的不同数据</title>
		<link>http://www.tuifei.com/2008/08/15/vlookup.htm</link>
		<comments>http://www.tuifei.com/2008/08/15/vlookup.htm#comments</comments>
		<pubDate>Fri, 15 Aug 2008 03:19:33 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[应用|Application]]></category>

		<guid isPermaLink="false">http://www.tuifei.com/?p=459</guid>
		<description><![CDATA[需求：二张sheet表，一张包含有完整的身份证信息及姓名，另一张仅有前一张的部分身份证。现在要从部分身份证信息的表中查找完整信息表中的姓名。
函数： VLOOKUP
说明： 在表格或数值数组... ]]></description>
			<content:encoded><![CDATA[<p>需求：二张sheet表，一张包含有完整的身份证信息及姓名，另一张仅有前一张的部分身份证。现在要从部分身份证信息的表中查找完整信息表中的姓名。<br />
函数： VLOOKUP<br />
说明： 在表格或数值数组的首列查找指定的数值，并由此返回表格或数组当前行中指定列处的数值。<br />
当比较值位于数据表首列时，可以使用函数 VLOOKUP 代替函数 HLOOKUP。<br />
在 VLOOKUP 中的 V 代表垂直，H代表水平。<br />
语法： VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)<br />
参数说明： Lookup_value   为需要在数据表第一列中查找的数值。Lookup_value 可以为数值、引用或文本字符串。<br />
Table_array   为需要在其中查找数据的数据表。可以使用对区域或区域名称的引用，例如数据库或数据清单。<br />
如果 range_lookup 为 TRUE，则 table_array 的第一列中的数值必须按升序排列：…、-2、-1、0、1、2、…、-Z、FALSE、TRUE；<br />
否则，函数 VLOOKUP 不能返回正确的数值。如果 range_lookup 为 FALSE，table_array 不必进行排序。<br />
Table_array 的第一列中的数值可以为文本、数字或逻辑值，文本不区分大小写。<br />
Col_index_num   为 table_array 中待返回的匹配值的列序号。Col_index_num 为 1 时，返回 table_array 第一列中的数值；<br />
col_index_num 为 2，返回 table_array 第二列中的数值，以此类推。如果 col_index_num 小于 1，函数 VLOOKUP 返回错误值值 #VALUE!；<br />
如果 col_index_num 大于 table_array 的列数，函数 VLOOKUP 返回错误值 #REF!。<br />
Range_lookup   为一逻辑值，指明函数 VLOOKUP 返回时是精确匹配还是近似匹配。如果为 TRUE 或省略，则返回近似匹配值，<br />
也就是说，如果找不到精确匹配值，则返回小于 lookup_value 的最大数值；如果 range_value 为 FALSE，函数 VLOOKUP 将返回精确<br />
匹配值。如果找不到，则返回错误值 #N/A。<br />
range_lookup参数经常采用false，这样不必排序，返回精确匹配。</p>
<p>=VLOOKUP(A1,&#8217;完整表&#8217;!$A$2:$C$3931,2,FALSE)<br />
完整表中的2为姓名列，A1为部分表中的身份证列，$A$2:$C$3931为完整表中的查找范围</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=459&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_459" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/08/15/vlookup.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>sysctl.conf优化方案</title>
		<link>http://www.tuifei.com/2008/07/23/sysctlconf.htm</link>
		<comments>http://www.tuifei.com/2008/07/23/sysctlconf.htm#comments</comments>
		<pubDate>Wed, 23 Jul 2008 09:49:24 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[Unix|Linux]]></category>
<category>sysctl</category><category>优化</category>
		<guid isPermaLink="false">http://www.tuifei.com/?p=458</guid>
		<description><![CDATA[转至CU
###################
所有rfc相关的选项都是默认启用的，因此网上的那些还自己写rfc支持的都可以扔掉了:)
###############################
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
####################... ]]></description>
			<content:encoded><![CDATA[<p>转至CU<br />
###################<br />
所有rfc相关的选项都是默认启用的，因此网上的那些还自己写rfc支持的都可以扔掉了:)<br />
###############################</p>
<p>net.inet.ip.sourceroute=0<br />
net.inet.ip.accept_sourceroute=0<br />
#############################<br />
通过源路由，攻击者可以尝试到达内部IP地址 &#8211;包括RFC1918中的地址，所以<br />
不接受源路由信息包可以防止你的内部网络被探测。<br />
#################################</p>
<p>net.inet.tcp.drop_synfin=1<br />
###################################<br />
安全参数，编译内核的时候加了options TCP_DROP_SYNFIN才可以用，可以阻止某些OS探测。<br />
##################################</p>
<p>kern.maxvnodes=8446<br />
#################http://www.bsdlover.cn#########<br />
vnode 是对文件或目录的一种内部表达。 因此， 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。<br />
一般而言， 这是由操作系统自行完成的，也不需要加以修改。但在某些时候磁盘 I/O 会成为瓶颈，<br />
而系统的 vnode 不足， 则这一配置应被增加。此时需要考虑是非活跃和空闲内存的数量。<br />
要查看当前在用的 vnode 数量：<br />
# sysctl vfs.numvnodes<br />
vfs.numvnodes: 91349<br />
要查看最大可用的 vnode 数量：<br />
# sysctl kern.maxvnodes<br />
kern.maxvnodes: 100000<br />
如果当前的 vnode 用量接近最大值，则将 kern.maxvnodes 值增大 1,000 可能是个好主意。<br />
您应继续查看 vfs.numvnodes 的数值， 如果它再次攀升到接近最大值的程度，<br />
仍需继续提高 kern.maxvnodes。 在 top(1) 中显示的内存用量应有显著变化，<br />
更多内存会处于活跃 (active) 状态。<br />
####################################</p>
<p>kern.maxproc: 964<br />
#################http://www.bsdlover.cn#########<br />
Maximum number of processes<br />
####################################<br />
kern.maxprocperuid: 867<br />
#################http://www.bsdlover.cn#########<br />
Maximum processes allowed per userid<br />
####################################<br />
因为我的maxusers设置的是256，20+16*maxusers＝4116。<br />
maxprocperuid至少要比maxproc少1，因为init(8) 这个系统程序绝对要保持在运作状态。<br />
我给它设置的2068。</p>
<p>kern.maxfiles: 1928<br />
#################http://www.bsdlover.cn#########<br />
系统中支持最多同时开启的文件数量，如果你在运行数据库或大的很吃描述符的进程，那么应该设置在20000以上，<br />
比如kde这样的桌面环境，它同时要用的文件非常多。<br />
一般推荐设置为32768或者65536。<br />
####################################</p>
<p>kern.argmax: 262144<br />
#################http://www.bsdlover.cn#########<br />
maximum number of bytes (or characters) in an argument list.<br />
命令行下最多支持的参数，比如你在用find命令来批量删除一些文件的时候<br />
find . -name &#8220;*.old&#8221; -delete，如果文件数超过了这个数字，那么会提示你数字太多的。<br />
可以利用find . -name &#8220;*.old&#8221; -ok rm {} \;来删除。<br />
默认的参数已经足够多了，因此不建议再做修改。<br />
####################################</p>
<p>kern.securelevel: -1<br />
#################http://www.bsdlover.cn#########<br />
-1：这是系统默认级别，没有提供任何内核的保护错误；<br />
0：基本上作用不多，当你的系统刚启动就是0级别的，当进入多用户模式的时候就自动变成1级了。<br />
1：在这个级别上，有如下几个限制：<br />
　　a. 不能通过kldload或者kldunload加载或者卸载可加载内核模块；<br />
　　b. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存；<br />
　　c. 不能直接往已经装在(mounted)的磁盘写东西，也就是不能格式化磁盘，但是可以通过标准的内核接口执行写操作；<br />
　　d. 不能启动X-windows，同时不能使用chflags来修改文件属性；<br />
2：在 1 级别的基础上还不能写没装载的磁盘，而且不能在1秒之内制造多次警告，这个是防止DoS控制台的；<br />
3：在 2 级别的级别上不允许修改IPFW防火墙的规则。<br />
　　如果你已经装了防火墙，并且把规则设好了，不轻易改动，那么建议使用3级别，如果你没有装防火墙，而且还准备装防火墙的话，不建议使用。<br />
我们这里推荐使用 2 级别，能够避免比较多对内核攻击。<br />
####################################</p>
<p>kern.maxfilesperproc: 1735<br />
#################http://www.bsdlover.cn#########<br />
每个进程能够同时打开的最大文件数量，网上很多资料写的是32768<br />
除非用异步I/O或大量线程，打开这么多的文件恐怕是不太正常的。<br />
我个人建议不做修改，保留默认。<br />
####################################</p>
<p>kern.ipc.maxsockbuf: 262144<br />
#################http://www.bsdlover.cn#########<br />
最大的套接字缓冲区，网上有建议设置为2097152（2M）、8388608（8M）的。<br />
我个人倒是建议不做修改，保持默认的256K即可，缓冲区大了可能造成碎片、阻塞或者丢包。<br />
####################################</p>
<p>kern.ipc.somaxconn: 128<br />
#################http://www.bsdlover.cn#########<br />
最大的等待连接完成的套接字队列大小，即并发连接数。<br />
高负载服务器和受到Dos攻击的系统也许会因为这个队列被塞满而不能提供正常服务。<br />
默认为128，推荐在1024-4096之间，根据机器和实际情况需要改动，数字越大占用内存也越大。<br />
####################################</p>
<p>kern.ipc.nmbclusters: 4800<br />
#################http://www.bsdlover.cn#########<br />
这个值用来调整系统在开机后所要分配给网络 mbufs 的 cluster 数量，<br />
由于每个 cluster 大小为 2K，所以当这个值为 1024 时，也是会用到 2MB 的核心内存空间。<br />
假设我们的网页同时约有 1000 个联机，而 TCP 传送及接收的暂存区大小都是 16K，<br />
则最糟的情况下，我们会需要 (16K+16K) * 1024，也就是 32MB 的空间，<br />
然而所需的 mbufs 大概是这个空间的二倍，也就是 64MB，所以所需的 cluster 数量为 64MB/2K，也就是 32768。<br />
对于内存有限的机器，建议值是 1024 到 4096 之间，而当拥有海量存储器空间时，我们可以将它设定为 4096 到 32768 之间。<br />
我们可以使用 netstat 这个指令并加上参数 -m 来查看目前所使用的 mbufs 数量。<br />
要修改这个值必须在一开机就修改，所以只能在 /boot/loader.conf 中加入修改的设定<br />
kern.ipc.nmbclusters=32768<br />
####################################</p>
<p>kern.ipc.shmmax: 33554432<br />
#################http://www.bsdlover.cn#########<br />
共享内存和信号灯(&#8221;System VIPC&#8221;)如果这些过小的话，有些大型的软件将无法启动<br />
安装xine和mplayer提示的设置为67108864，即64M，<br />
如果内存多的话，可以设置为134217728，即128M<br />
####################################</p>
<p>kern.ipc.shmall: 8192<br />
#################http://www.bsdlover.cn#########<br />
共享内存和信号灯(&#8221;System VIPC&#8221;)如果这些过小的话，有些大型的软件将无法启动<br />
安装xine和mplayer提示的设置为32768<br />
####################################</p>
<p>kern.ipc.shm_use_phys: 0<br />
#################http://www.bsdlover.cn#########<br />
如果我们将它设成 1，则所有 System V 共享内存 (share memory，一种程序间沟通的方式)部份都会被留在实体的内存 (physical memory) 中，<br />
而不会被放到硬盘上的 swap 空间。我们知道物理内存的存取速度比硬盘快许多，而当物理内存空间不足时，<br />
部份数据会被放到虚拟的内存上，从物理内存和虚拟内存之间移转的动作就叫作 swap。如果时常做 swap 的动作，<br />
则需要一直对硬盘作 I/O，速度会很慢。因此，如果我们有大量的程序 (数百个) 需要共同分享一个小的共享内存空间，<br />
或者是共享内存空间很大时，我们可以将这个值打开。<br />
这一项，我个人建议不做修改，除非你的内存非常大。<br />
####################################</p>
<p>kern.ipc.shm_allow_removed: 0<br />
#################http://www.bsdlover.cn#########<br />
共享内存是否允许移除？这项似乎是在fb下装vmware需要设置为1的，否则会有加载SVGA出错的提示<br />
作为服务器，这项不动也罢。<br />
####################################</p>
<p>kern.ipc.numopensockets: 12<br />
#################http://www.bsdlover.cn#########<br />
已经开启的socket数目，可以在最繁忙的时候看看它是多少，然后就可以知道maxsockets应该设置成多少了。<br />
####################################</p>
<p>kern.ipc.maxsockets: 1928<br />
#################http://www.bsdlover.cn#########<br />
这是用来设定系统最大可以开启的 socket 数目。如果您的服务器会提供大量的 FTP 服务，<br />
而且常快速的传输一些小档案，您也许会发现常传输到一半就中断。因为 FTP 在传输档案时，<br />
每一个档案都必须开启一个 socket 来传输，但关闭 socket 需要一段时间，如果传输速度很快，<br />
而档案又多，则同一时间所开启的 socket 会超过原本系统所许可的值，这时我们就必须把这个值调大一点。<br />
除了 FTP 外，也许有其它网络程序也会有这种问题。<br />
然而，这个值必须在系统一开机就设定好，所以如果要修改这项设定，我们必须修改 /boot/loader.conf 才行<br />
kern.ipc.maxsockets=&#8221;16424&#8243;<br />
####################################</p>
<p>kern.ipc.nsfbufs: 1456<br />
#################http://www.bsdlover.cn#########<br />
经常使用 sendfile(2) 系统调用的繁忙的服务器，<br />
有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 loader(8) 以获得更多细节) 中设置它的值来调节 sendfile(2) 缓存数量。<br />
这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。<br />
这个参数是由 kern.maxusers 决定的，然而它可能有必要因此而调整。<br />
在/boot/loader.conf里加入<br />
kern.ipc.nsfbufs=&#8221;2496&#8243;<br />
####################################</p>
<p>kern.maxusers: 59<br />
#################http://www.bsdlover.cn#########<br />
maxusers 的值决定了处理程序所容许的最大值，20+16*maxusers 就是你将得到的所容许处理程序。<br />
系统一开机就必须要有 18 个处理程序 (process)，即便是简单的执行指令 man 又会产生 9 个 process，<br />
所以将这个值设为 64 应该是一个合理的数目。<br />
如果你的系统会出现 proc table full 的讯息的话，可以就把它设大一点，例如 128。<br />
除非您的系统会需要同时开启很多档案，否则请不要设定超过 256。</p>
<p>可以在 /boot/loader.conf 中加入该选项的设定，<br />
kern.maxusers=256<br />
####################################</p>
<p>kern.coredump: 1<br />
#################http://www.bsdlover.cn#########<br />
如果设置为0，则程序异常退出时不会生成core文件，作为服务器，不建议这样。<br />
####################################</p>
<p>kern.corefile: %N.core<br />
#################http://www.bsdlover.cn#########<br />
可设置为kern.corefile=&#8221;/data/coredump/%U-%P-%N.core&#8221;<br />
其中 %U是UID，%P是进程ID，%N是进程名，当然/data/coredump必须是一个实际存在的目录<br />
####################################</p>
<p>vm.swap_idle_enabled: 0<br />
vm.swap_idle_threshold1: 2<br />
vm.swap_idle_threshold2: 10<br />
#########################<br />
在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。<br />
可以让进程更快地进入内存，但它会吃掉更多的交换和磁盘带宽。<br />
系统默认的页面调度算法已经很好了，最好不要更改。<br />
########################</p>
<p>vfs.ufs.dirhash_maxmem: 2097152<br />
#########################<br />
默认的dirhash最大内存,默认2M<br />
增加它有助于改善单目录超过100K个文件时的反复读目录时的性能<br />
建议修改为33554432（32M）<br />
#############################</p>
<p>vfs.vmiodirenable: 1<br />
#################<br />
这个变量控制目录是否被系统缓存。大多数目录是小的，在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。<br />
当这个变量设置为关闭 (0) 时，缓存器仅仅缓存固定数量的目录，即使您有很大的内存。<br />
而将其开启 (设置为1) 时，则允许缓存器用 VM 页面缓存来缓存这些目录，让所有可用内存来缓存目录。<br />
不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。<br />
我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。<br />
这些服务包括 web 缓存，大容量邮件系统和新闻系统。<br />
尽管可能会浪费一些内存，但打开这个选项通常不会降低性能。但还是应该检验一下。<br />
####################</p>
<p>vfs.hirunningspace: 1048576<br />
############################<br />
这个值决定了系统可以将多少数据放在写入储存设备的等候区。通常使用默认值即可，<br />
但当我们有多颗硬盘时，我们可以将它调大为 4MB 或 5MB。<br />
注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。<br />
不要盲目的把它设置太高！高的数值会导致同时发生的读操作的迟延。<br />
#############################</p>
<p>vfs.write_behind: 1<br />
#########################<br />
这个选项预设为 1，也就是打开的状态。在打开时，在系统需要写入数据在硬盘或其它储存设备上时，<br />
它会等到收集了一个 cluster 单位的数据后再一次写入，否则会在一个暂存区空间有写入需求时就立即写到硬盘上。<br />
这个选项打开时，对于一个大的连续的文件写入速度非常有帮助。但如果您遇到有很多行程延滞在等待写入动作时，您可能必须关闭这个功能。<br />
############################</p>
<p>net.local.stream.sendspace: 8192<br />
##################################<br />
本地套接字连接的数据发送空间<br />
建议设置为65536<br />
###################################<br />
net.local.stream.recvspace: 8192<br />
##################################<br />
本地套接字连接的数据接收空间<br />
建议设置为65536<br />
###################################</p>
<p>net.inet.ip.portrange.lowfirst: 1023<br />
net.inet.ip.portrange.lowlast: 600<br />
net.inet.ip.portrange.first: 49152<br />
net.inet.ip.portrange.last: 65535<br />
net.inet.ip.portrange.hifirst: 49152<br />
net.inet.ip.portrange.hilast: 65535<br />
###################<br />
以上六项是用来控制TCP及UDP所使用的port范围，这个范围被分成三个部份，低范围、预设范围、及高范围。<br />
这些是你的服务器主动发起连接时的临时端口的范围，预设的已经1万多了，一般的应用就足够了。<br />
如果是比较忙碌的FTP server，一般也不会同时提供给1万多人访问的，<br />
当然如果很不幸，你的服务器就要提供很多，那么可以修改first的值，比如直接用1024开始<br />
#########################</p>
<p>net.inet.ip.redirect: 1<br />
#########################<br />
设置为0，屏蔽ip重定向功能<br />
###########################</p>
<p>net.inet.ip.rtexpire: 3600<br />
net.inet.ip.rtminexpire: 10<br />
########################<br />
很多apache产生的CLOSE_WAIT状态，这种状态是等待客户端关闭，但是客户端那边并没有正常的关闭，于是留下很多这样的东东。<br />
建议都修改为2<br />
#########################</p>
<p>net.inet.ip.intr_queue_maxlen: 50<br />
########################<br />
Maximum size of the IP input queue，如果下面的net.inet.ip.intr_queue_drops一直在增加，<br />
那就说明你的队列空间不足了，那么可以考虑增加该值。<br />
##########################<br />
net.inet.ip.intr_queue_drops: 0<br />
####################<br />
Number of packets dropped from the IP input queue,如果你sysctl它一直在增加，<br />
那么增加net.inet.ip.intr_queue_maxlen的值。<br />
#######################</p>
<p>net.inet.ip.fastforwarding: 0<br />
#############################<br />
如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表，节约路由的计算时间<br />
但会需要大量的内核内存空间来保存路由表。<br />
如果内存够大，打开吧，呵呵<br />
#############################</p>
<p>net.inet.ip.random_id: 0<br />
#####################<br />
默认情况下，ip包的id号是连续的，而这些可能会被攻击者利用，比如可以知道你nat后面带了多少主机。<br />
如果设置成1，则这个id号是随机的，嘿嘿。<br />
#####################</p>
<p>net.inet.icmp.maskrepl: 0<br />
############################<br />
防止广播风暴，关闭其他广播探测的响应。默认即是，无须修改。<br />
###############################</p>
<p>net.inet.icmp.icmplim: 200<br />
##############################<br />
限制系统发送ICMP速率，改为100吧，或者保留也可，并不会给系统带来太大的压力。<br />
###########################<br />
net.inet.icmp.icmplim_output: 1<br />
###################################<br />
如果设置成0，就不会看到提示说Limiting icmp unreach response from 214 to 200 packets per second 等等了<br />
不过禁止输出容易让我们忽视攻击的存在。这个自己看着办吧。<br />
######################################</p>
<p>net.inet.icmp.drop_redirect: 0<br />
net.inet.icmp.log_redirect: 0<br />
###################################<br />
设置为1，屏蔽ICMP重定向功能<br />
###################################<br />
net.inet.icmp.bmcastecho: 0<br />
############################<br />
防止广播风暴，关闭广播ECHO响应，默认即是，无须修改。<br />
###############################</p>
<p>net.inet.tcp.mssdflt: 512<br />
net.inet.tcp.minmss: 216<br />
###############################<br />
数据包数据段最小值，以上两个选项最好不动！或者只修改mssdflt为1460，minmss不动。<br />
原因详见http://www.bsdlover.cn/security/2007/1211/article_4.html<br />
#############################</p>
<p>net.inet.tcp.keepidle: 7200000<br />
######################<br />
TCP的套接字的空闲时间，默认时间太长，可以改为600000（10分钟）。<br />
##########################</p>
<p>net.inet.tcp.sendspace: 32768<br />
#################http://www.bsdlover.cn#########<br />
最大的待发送TCP数据缓冲区空间，应用程序将数据放到这里就认为发送成功了，系统TCP堆栈保证数据的正常发送。<br />
####################################<br />
net.inet.tcp.recvspace: 65536<br />
###################################<br />
最大的接受TCP缓冲区空间，系统从这里将数据分发给不同的套接字，增大该空间可提高系统瞬间接受数据的能力以提高性能。<br />
###################################<br />
这二个选项分别控制了网络 TCP 联机所使用的传送及接收暂存区的大小。预设的传送暂存区为 32K，而接收暂存区为 64K。<br />
如果需要加速 TCP 的传输，可以将这二个值调大一点，但缺点是太大的值会造成系统核心占用太多的内存。<br />
如果我们的机器会同时服务数百或数千个网络联机，那么这二个选项最好维持默认值，否则会造成系统核心内存不足。<br />
但如果我们使用的是 gigabite 的网络，将这二个值调大会有明显效能的提升。<br />
传送及接收的暂存区大小可以分开调整，<br />
例如，假设我们的系统主要做为网页服务器，我们可以将接收的暂存区调小一点，并将传送的暂存区调大，如此一来，我们就可以避免占去太多的核心内存空间。</p>
<p>net.inet.udp.maxdgram: 9216<br />
#########################<br />
最大的发送UDP数据缓冲区大小，网上的资料大多都是65536，我个人认为没多大必要，<br />
如果要调整，可以试试24576。<br />
##############################<br />
net.inet.udp.recvspace: 42080<br />
##################<br />
最大的接受UDP缓冲区大小，网上的资料大多都是65536，我个人认为没多大必要，<br />
如果要调整，可以试试49152。<br />
#######################<br />
以上四项配置通常不会导致问题，一般说来网络流量是不对称的，因此应该根据实际情况调整，并观察其效果。<br />
如果我们将传送或接收的暂存区设为大于 65535，除非服务器本身及客户端所使用的操作系统都支持 TCP 协议的 windows scaling extension (请参考 RFC 1323 文件)。<br />
FreeBSD默认已支持 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 选项)。<br />
###################################################</p>
<p>net.inet.tcp.log_in_vain: 0<br />
##################<br />
记录下任何TCP连接，这个一般情况下不应该更改。<br />
####################</p>
<p>net.inet.tcp.blackhole: 0<br />
##################################<br />
建议设置为2，接收到一个已经关闭的端口发来的所有包，直接drop，如果设置为1则是只针对TCP包<br />
#####################################</p>
<p>net.inet.tcp.delayed_ack: 1<br />
###########################<br />
当一台计算机发起TCP连接请求时，系统会回应ACK应答数据包。<br />
该选项设置是否延迟ACK应答数据包，把它和包含数据的数据包一起发送。<br />
在高速网络和低负载的情况下会略微提高性能，但在网络连接较差的时候，<br />
对方计算机得不到应答会持续发起连接请求，反而会让网络更加拥堵，降低性能。<br />
因此这个值我建议您看情况而定，如果您的网速不是问题，可以将封包数量减少一半<br />
如果网络不是特别好，那么就设置为0，有请求就先回应，这样其实浪费的网通、电信的带宽速率而不是你的处理时间:)<br />
############################</p>
<p>net.inet.tcp.inflight.enable: 1<br />
net.inet.tcp.inflight.debug: 0<br />
net.inet.tcp.inflight.rttthresh: 10<br />
net.inet.tcp.inflight.min: 6144<br />
net.inet.tcp.inflight.max: 1073725440<br />
net.inet.tcp.inflight.stab: 20<br />
###########################<br />
限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。<br />
它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。<br />
系统将尝试计算每一个连接的带宽延迟积，并将排队的数据量限制在恰好能保持最优吞吐量的水平上。<br />
这一特性在您的服务器同时向使用普通调制解调器，千兆以太网，乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要，<br />
特别是当您同时使用滑动窗缩放，或使用了大的发送窗口的时候。<br />
如果启用了这个选项，您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试)，<br />
对于生产环境而言， 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。<br />
然而， 需要注意的是，这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。<br />
这个限制特性减少了在路由和交换包队列的堵塞数据数量，也减少了在本地主机接口队列阻塞的数据的数量。<br />
在少数的等候队列中、交互式连接，尤其是通过慢速的调制解调器，也能用低的 往返时间操作。<br />
但是，注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。<br />
调整 net.inet.tcp.inflight.stab 是 不 推荐的。<br />
这个参数的默认值是 20，表示把 2 个最大包加入到带宽延迟积窗口的计算中。<br />
额外的窗口似的算法更为稳定，并改善对于多变网络环境的相应能力，<br />
但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。<br />
对于这些情形， 您可能会希望把这个参数减少到 15， 10， 或 5；<br />
并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说， 3500) 来得到希望的效果。<br />
减少这些参数的值， 只应作为最后不得已时的手段来使用。<br />
############################</p>
<p>net.inet.tcp.syncookies: 1<br />
#########################<br />
SYN cookies是一种用于通过选择加密的初始化TCP序列号，可以对回应的包做验证来降低SYN&#8217;洪水&#8217;攻击的影响的技术。<br />
默认即是，不需修改<br />
########################</p>
<p>net.inet.tcp.msl: 30000<br />
#######################<br />
这个值网上很多文章都推荐的7500，<br />
还可以改的更小一些(如2000或2500)，这样可以加快不正常连接的释放过程(三次握手2秒、FIN_WAIT4秒)。<br />
#########################<br />
net.inet.tcp.always_keepalive: 1<br />
###########################<br />
帮助系统清除没有正常断开的TCP连接，这增加了一些网络带宽的使用，但是一些死掉的连接最终能被识别并清除。<br />
死的TCP连接是被拨号用户存取的系统的一个特别的问题，因为用户经常断开modem而不正确的关闭活动的连接。<br />
#############################</p>
<p>net.inet.udp.checksum: 1<br />
#########################<br />
防止不正确的udp包的攻击，默认即是，不需修改<br />
##############################</p>
<p>net.inet.udp.log_in_vain: 0<br />
#######################<br />
记录下任何UDP连接,这个一般情况下不应该修改。<br />
#######################</p>
<p>net.inet.udp.blackhole: 0<br />
####################<br />
建议设置为1，接收到一个已经关闭的端口发来的所有UDP包直接drop<br />
#######################</p>
<p>net.inet.raw.maxdgram: 8192<br />
#########################<br />
Maximum outgoing raw IP datagram size<br />
很多文章建议设置为65536，好像没多大必要。<br />
######################################<br />
net.inet.raw.recvspace: 8192<br />
######################<br />
Maximum incoming raw IP datagram size<br />
很多文章建议设置为65536，好像没多大必要。<br />
#######################</p>
<p>net.link.ether.inet.max_age: 1200<br />
####################<br />
调整ARP清理的时间，通过向IP路由缓冲填充伪造的ARP条目可以让恶意用户产生资源耗竭和性能减低攻击。<br />
这项似乎大家都未做改动，我建议不动或者稍微减少，比如300（HP-UX默认的5分钟）<br />
#######################</p>
<p>net.inet6.ip6.redirect: 1<br />
###############################<br />
设置为0，屏蔽ipv6重定向功能<br />
###########################</p>
<p>net.isr.direct: 0<br />
#################http://www.bsdlover.cn#########<br />
所有MPSAFE的网络ISR对包做立即响应,提高网卡性能，设置为1。<br />
####################################</p>
<p>hw.ata.wc: 1<br />
#####################<br />
这个选项用来打开 IDE 硬盘快取。当打开时，如果有数据要写入硬盘时，硬盘会假装已完成写入，并将数据快取起来。<br />
这种作法会加速硬盘的存取速度，但当系统异常关机时，比较容易造成数据遗失。<br />
不过由于关闭这个功能所带来的速度差异实在太大，建议还是保留原本打开的状态吧，不做修改。<br />
###################</p>
<p>security.bsd.see_other_uids: 1<br />
security.bsd.see_other_gids: 1<br />
#####################<br />
不允许用户看到其他用户的进程,因此应该改成0，<br />
#######################</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=458&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_458" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/07/23/sysctlconf.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>杭州住房公积金贷款标准</title>
		<link>http://www.tuifei.com/2008/06/13/loan_of_accumulation_fund.htm</link>
		<comments>http://www.tuifei.com/2008/06/13/loan_of_accumulation_fund.htm#comments</comments>
		<pubDate>Fri, 13 Jun 2008 02:04:23 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[生活|Life]]></category>

		<guid isPermaLink="false">http://www.daydayup.org.cn/?p=457</guid>
		<description><![CDATA[    中新浙江网6月13日电 昨天，杭州一些房产及金融机构接到了来自杭州住房公积金管理中心《关于明确住房公积金贷款额度审批口径的通知》(以下简称“通知”)。该通知明确，住房公积金贷... ]]></description>
			<content:encoded><![CDATA[<p>    中新浙江网6月13日电 昨天，杭州一些房产及金融机构接到了来自杭州住房公积金管理中心《关于明确住房公积金贷款额度审批口径的通知》(以下简称“通知”)。该通知明确，住房公积金贷款额度的审批将有重大调整，职工公积金月缴存额高于杭州市月缴存标准(438元)的，最高可贷额度调整为30万元；低于的(但不低于最低月缴存额标准182元)最高贷款额度则调整为20万元。</p>
<p>　　通知同时规定，职工及其配偶均缴存市住房公积金的，具体可贷额度按人分别计算，合计最高贷款额度为50万元。相关部门透露，具体实施细则近期将出台。</p>
<p>　　缴存额标准提至438元</p>
<p>　　该通知表明：“自2008年6月1日起，月缴存额标准为438元。同时，根据有关规定，职工最低月缴存额不低于182元。”</p>
<p>　　而在此前的旧标准中，月缴存额标准为393元，最低月缴存额为182元。也就是说，以后公积金的月缴存额标准将由393元提至438元，最低月缴存额则保持182元不变。</p>
<p>　　个人最高可贷降至30万</p>
<p>　　该通知明确：“职工实际月缴存额(连续12个月正常缴存)高于月缴存额标准的，最高可贷额度为30万元；低于的(但不低于最低月缴存额)，最高可贷额度为20万元。”</p>
<p>　　而在此前的旧标准中，申请人每月缴交的住房公积金≥182元(个人合计缴交)同时≤393元(个人合计缴交)的，贷款的最高额度为30万元；申请人每月缴纳的住房公积金≥393元(个人合计缴交)的，贷款最高额度为50万元。</p>
<p>　　这项新规定预示着，个人最高可贷额度由旧标准的50万元降为30万元，同时如果申请人每月缴纳公积金≥182元并且≤393元，那么也会受到影响，其可贷最高额度由旧标准的30万元降为20万元。</p>
<p>　　夫妻合贷标准有所变化</p>
<p>　　通知还明确：“职工及其配偶均缴存住房公积金的，具体可贷额度按人分别计算，且合计最高可贷额度为50万元。”</p>
<p>　　而在此前的旧标准中，若夫妻双方每月的公积金缴交额均在182元和393元之间(不含393元)，但是双方公积金缴交额合计数在393元以上，贷款的额度也可以达到50万元。</p>
<p>　　因此根据新规定可知，如果夫妻双方公积金缴交额均在182元和393元之间，那么可贷额度按人分别计算最高均为20万元，也就是说在这种情况下，两人的合贷最高额度由50万元降为40万元。</p>
<p>　　90平方米为界区别首付</p>
<p>　　通知表示：“经济适用房和套型建筑面积在90平方米以下的商品房贷款，可贷额度按贷款成数不高于总房价的80%确定；套型建筑面积在90平方米以上的商品房贷款，可贷额度按贷款成数不高于70%确定。”</p>
<p>　　也就是说，以建筑面积90平方米为界，首付有区别。经济适用房和套型建筑面积90平方米以下的商品房贷款，最低首付可达到两成；而建筑面积90平方米以上的，最低首付要三成。</p>
<p>　　二次申请可贷成数减少</p>
<p>　　该通知明确，“二次住房公积金贷款的可贷额度按贷款成数不高于总价的60%确定。”</p>
<p>　　旧标准中，“职工首次住房公积金贷款建筑面积在140平方米或者其他规定标准以下，在贷款还清后因改善住房条件重新购、建房、且符合贷款基本条件的，可申请二次住房公积金贷款”。也就是说，此前二次购房可按普通住房标准按揭七成，新规定明确，按揭为六成，可按揭房款少了一成。</p>
<p>　　二手房龄要求更苛刻</p>
<p>　　该通知还明确，“房屋建成年份2000年(含)之后的二手房贷款，可贷额度按贷款成数不高于总房价的70%确定；2000年之前的，按贷款成数不高于60%确定。”即2000年(含)之后的二手房贷款，最低首付三成；2000年以前的最低首付四成。</p>
<p>　　旧标准以“1995年”为界，1995年(含)以前最低首付四成，1995年以后最低首付三成。新旧标准相比，公积金放贷对房龄要求更苛刻。</p>
<p>　　借款人信用有了量化标准</p>
<p>　　通知中明确：“信用状况应重点审查借款人及其配偶的信用卡和个人贷款近24个月的每月还款记录。贷款还款状态出现逾期91天及以上或当前逾期，或者信用卡还款状态为当前透支180天以上，且未提供银行出具的贷款结清证明或信用卡还款证明的，一般不予贷款。”</p>
<p>　　旧标准中，对借款人信用审核比较模糊，没有如此明确的标准。通知同时还规定，职工月还款额不得高于家庭月收入乘以还款能力系数(55%)扣除家庭其他贷款月还款额的余额。其中，家庭月收入是指职工或与其房产共有权人的收入总和。</p>
<p>　　作者：余丽</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=457&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_457" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/06/13/loan_of_accumulation_fund.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>The table is full mysql 错误号: 1114处理方法</title>
		<link>http://www.tuifei.com/2008/05/27/the-table-is-full-mysql.htm</link>
		<comments>http://www.tuifei.com/2008/05/27/the-table-is-full-mysql.htm#comments</comments>
		<pubDate>Tue, 27 May 2008 05:56:22 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[数据库管理|DBA]]></category>

		<guid isPermaLink="false">http://www.daydayup.org.cn/?p=456</guid>
		<description><![CDATA[运行vbb登陆后台admincp时，mysql返回 #1114 - The table ‘xxxx’ is full
由于内存表的大小超过了规定的范围
网上提到的有两种解决方法，
一种是修改tmp_table_size参数，另外一种是修改max_heap_table_size参... ]]></description>
			<content:encoded><![CDATA[<p>运行vbb登陆后台admincp时，mysql返回 #1114 - The table ‘xxxx’ is full<br />
由于内存表的大小超过了规定的范围<br />
网上提到的有两种解决方法，<br />
一种是修改tmp_table_size参数，另外一种是修改max_heap_table_size参数。。。<br />
[root@localhost etc]# vi /etc/rc.d/init.d/mysql<br />
找到<br />
$bindir/mysqld_safe &#8211;datadir=$datadir &#8211;pid-file=$pid_file >/dev/null 2>&#038;1 &#038;<br />
修改为<br />
$bindir/mysqld_safe &#8211;datadir=$datadir &#8211;pid-file=$pid_file -O tmp_table_size=64M -O max_heap_table_size=32M >/dev/null 2>&#038;1 &#038;<br />
-<br />
重启mysql<br />
[root@localhost etc]# /usr/bin/mysqladmin -u root -p shutdown<br />
Enter password:<br />
[root@localhost etc]# /etc/init.d/mysql start<br />
[root@localhost etc]# mysql<br />
-<br />
查看是否己修改<br />
mysql> show variables like &#8216;%max_heap_table_size%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
| Variable_name       | Value    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
| max_heap_table_size | 33553408 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)<br />
mysql> show variables like &#8216;%tmp_table_size%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| Variable_name  | Value    |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
| tmp_table_size | 67108864 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)<br />
己经修改成功！</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=456&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_456" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/05/27/the-table-is-full-mysql.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>[转帖]Clock in a Linux Guest Runs More Slowly or Quickly Than Real Time Products</title>
		<link>http://www.tuifei.com/2008/05/16/esx-unix-time-sync.htm</link>
		<comments>http://www.tuifei.com/2008/05/16/esx-unix-time-sync.htm#comments</comments>
		<pubDate>Fri, 16 May 2008 03:31:11 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[Unix|Linux]]></category>

		<guid isPermaLink="false">http://www.daydayup.org.cn/?p=455</guid>
		<description><![CDATA[VMware ACE 
VMware ESX Server 
VMware GSX Server 
VMware Server 
VMware Workstation 
Details
Why does the clock in my Linux guest consistently run more slowly or more quickly than real world time?
Solution
Linux guest operating systems keep time by count... ]]></description>
			<content:encoded><![CDATA[<p>VMware ACE </p>
<p>VMware ESX Server </p>
<p>VMware GSX Server </p>
<p>VMware Server </p>
<p>VMware Workstation </p>
<p>Details</p>
<p>Why does the clock in my Linux guest consistently run more slowly or more quickly than real world time?</p>
<p>Solution</p>
<p>Linux guest operating systems keep time by counting timer interrupts. Unpatched 2.4 and earlier kernels program the virtual system timer to request clock interrupts at 100Hz (100 interrupts per second). 2.6 kernels, on the other hand, request interrupts at 1000Hz — ten times as often. Some 2.4 kernels modified by distribution vendors to contain 2.6 features also request 1000Hz interrupts, or in some cases, interrupts at other rates, such as 512Hz.<br />
Furthermore, an SMP-capable Linux kernel requests additional timer interrupts from the virtual local APIC timer. An SMP-capable kernel running on a one-CPU system generates twice as many total timer interrupts as the corresponding UP kernel, while such a kernel running on a two-CPU system requests three times as many. In general, an SMP-capable kernel running on <n> CPUs requests <n+1> times as many interrupts per second as a UP kernel. For example, an unmodified 2.6 Linux kernel running on a two-CPU virtual machine requests a total of 3000 clock interrupts per second.<br />
When a guest asks for more than 1000 clock interrupts per second, it can be difficult for the virtual machine to keep up, especially if other applications are running on the host at the same time. This can cause the clock in the guest operating system to fall so far behind real time that it is unable to catch up. The overhead of delivering so many virtual clock interrupts can also hurt guest performance and increase host CPU consumption.<br />
It can also be difficult for the guest operating system to field 1000 clock interrupts per second. Even on real hardware, clock interrupts are sometimes lost because the operating system is busy for more than 1 millisecond and another clock interrupt comes in before the previous one was handled. Linux 2.6 contains code to detect such &#8220;lost ticks&#8221; and correct for them. Unfortunately, this code can trigger the correction spuriously in some cases, resulting in the Linux clock running more quickly than real time. This problem happens more often in a virtual machine than on real hardware, and can cause noticeable time gains. In some cases, the guest clock has been observed to run more than 10% more quickly than real time.</p>
<p>Workarounds<br />
If your Linux 2.6 guest&#8217;s clock is running too quickly, it indicates a problem with lost tick correction. Apply one of the workarounds in the section &#8220;Preventing the Clock from Running Too Quickly.&#8221;</p>
<p>Note: The overcorrection for lost ticks has been fixed in Linux kernel 2.6.18. Upgrading to 2.6.18 or later also solves this problem.<br />
If your guest&#8217;s clock is running too slowly, it indicates that the host&#8217;s real timer interrupt rate can&#8217;t keep up with the guest&#8217;s virtual timer interrupt rate. There are two approaches to dealing with the problem: either decrease the guest&#8217;s rate or increase the host&#8217;s rate. Apply one of the workarounds in the section &#8220;Preventing the Clock from Running Too Slowly.&#8221; Also apply one of the workarounds for running too quickly, because correcting the first problem often reveals the second one.<br />
In both cases, also make sure that VMware Tools is installed in your guest, that time synchronization is enabled and that you are not running any other clock synchronization software in the guest at the same time (such as ntpd).<br />
If your host uses power management features (such as Intel SpeedStep, or AMD PowerNow or Cool&#8217;n'Quiet) that vary the processor speed, see http://kb.vmware.com/kb/1591.<br />
Preventing the Clock from Running Too Quickly<br />
32-bit Systems<br />
For 32-bit systems, there are two kernel options that help with the guest kernel&#8217;s over-correction for lost ticks:<br />
Add the clock=pit boot option to your guest&#8217;s kernel command line in the /etc/lilo.conf or /boot/grub/grub.conf file.<br />
The following example shows the syntax for LILO:<br />
image=/boot/vmlinuz<br />
label=&#8221;linux&#8221;<br />
root=/dev/hda1<br />
initrd=/boot/initrd.img<br />
append=&#8221;resume=/dev/hda6 splash=silent clock=pit&#8221;<br />
read-only</p>
<p>(Remember to run /sbin/lilo after editing lilo.conf, so that your edits take effect.)<br />
Here is an example of the syntax for GRUB:<br />
title Fedora Core (2.6.9-1.667)<br />
root (hd0,0)<br />
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/hda2 clock=pit<br />
Adding this boot option disables the kernel&#8217;s correction for lost ticks, so be sure to also install VMware Tools and turn on time synchronization. The latter prevents the guest clock from losing time over the long term due to lost ticks.<br />
For additional information about working with boot loaders, see your Linux distribution&#8217;s documentation.<br />
As an alternative, especially if you are unable to use VMware Tools, you can instead give the kernel command line option<br />
 clock=pmtmr</p>
<p>With this option, the kernel corrects more properly for lost ticks, but occasionally overcorrects and ends up gaining time slowly. This option is the default for most 2.6 kernels, but some distributions may patch their kernels to change the default. In SuSE SLES 9 kernels, the default is clock=tsc. The code enabled by the tsc setting severely overcorrects for lost ticks when used in a virtual machine and tends to gain time rapidly.<br />
64-bit Systems<br />
In the x86_64 Linux kernel, use the boot option notsc instead of clock=pit.<br />
LILO example:<br />
image=/boot/vmlinuz<br />
label=&#8221;linux&#8221;<br />
root=/dev/hda1<br />
initrd=/boot/initrd.img<br />
append=&#8221;resume=/dev/hda6 splash=silent notsc&#8221;<br />
read-only<br />
GRUB example:<br />
title Fedora Core (2.6.9-1.667)<br />
root (hd0,0)<br />
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/hda2 notsc<br />
Preventing the Clock from Running Too Slowly<br />
One approach to a slow guest clock is to reduce the guest timer interrupt rate.<br />
In a one-CPU virtual machine, add the following kernel command line parameters to the guest:<br />
 nosmp noapic nolapic</p>
<p>Kernel command line parameters are specified in the /etc/lilo.conf or /boot/grub/grub.conf file, depending on your choice of boot loader.<br />
Here is an example for LILO:<br />
image=/boot/vmlinuz<br />
label=&#8221;linux&#8221;<br />
root=/dev/hda1<br />
initrd=/boot/initrd.img<br />
append=&#8221;resume=/dev/hda6 splash=silent nosmp noapic nolapic&#8221;<br />
read-only</p>
<p>(Remember to run /sbin/lilo after editing lilo.conf, so that your edits take effect.)</p>
<p>And for GRUB:</p>
<p>title Red Hat Linux (2.4.20-28.9)<br />
root (hd0,0)<br />
kernel /vmlinuz-2.4.20-28.9 ro root=/dev/hda2 nosmp noapic nolapic</p>
<p>You can even specify the entries to keep the clock from running too slowly and too quickly together. The entries together for LILO look like this:</p>
<p>image=/boot/vmlinuz label=&#8221;linux&#8221;<br />
root=/dev/hda1 initrd=/boot/initrd.img<br />
append=&#8221;resume=/dev/hda6 splash=silent clock=pit nosmp noapic nolapic&#8221;<br />
read-only</p>
<p>And for GRUB:</p>
<p>title Red Hat Linux (2.4.20-28.9)<br />
root (hd0,0)<br />
kernel /vmlinuz-2.4.20-28.9 ro root=/dev/hda2 clock=pit nosmp noapic nolapic</p>
<p>For additional information about working with boot loaders, see your Linux distribution&#8217;s documentation.<br />
SUSE LINUX 9.0 Professional Edition, although its kernel is 2.4-based, includes a patch that raises the clock rate to 1000Hz. This patch is enabled by the kernel parameter desktop. SUSE installations pass this parameter to the kernel by default. To remove the parameter from your guest operating system, follow these steps:</p>
<p>Edit your /etc/lilo.conf or /boot/grub/grub.conf file.<br />
Delete all instances of the word desktop.<br />
Exit the editor, saving your changes.<br />
If you are using LILO, run /sbin/lilo.<br />
Reboot the guest.</p>
<p>In standard 2.6 kernels, the timer interrupt rate is fixed at kernel compile time and cannot be changed by command line parameters. You can, however, recompile your kernel with a lower timer interrupt rate. 100Hz is adequate for most applications in a Linux guest. See the documentation for your Linux distribution for detailed instructions on how to build and run a custom kernel. Before recompiling the guest kernel, locate the following line in /usr/src/linux-2.6/include/asm-i386/param.h:<br />
 #define HZ 1000</p>
<p>Change the value of HZ to 100:<br />
 #define HZ 100</p>
<p>A different way to deal with a slow guest clock is to increase the host timer interrupt rate. Current versions of VMware products automatically increase the host&#8217;s timer interrupt rate if needed, up to the maximum permitted by the host operating system. In some cases, though, you can increase this maximum.<br />
On Windows hosts, 1000Hz is an absolute maximum.</p>
<p>On most Linux hosts, VMware is able to increase the timer interrupt rate to 8192Hz by requesting additional interrupts from the /dev/rtc device. However, on a few systems this device may not be configured. On 64-bit systems running Linux 2.4 kernels, the device cannot provide interrupts; on some outdated versions of VMware products, only one virtual machine can use /dev/rtc at a time. To deal with such issues, see http://kb.vmware.com/kb/892.</p>
<p>For ESX Server, 1000Hz is the default maximum, but you can increase the rate using the technique described at http://kb.vmware.com/kb/1518. </p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=455&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_455" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/05/16/esx-unix-time-sync.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>ESX NTP 虚拟机时间同步</title>
		<link>http://www.tuifei.com/2008/05/16/esx-ntp-sync-confi.htm</link>
		<comments>http://www.tuifei.com/2008/05/16/esx-ntp-sync-confi.htm#comments</comments>
		<pubDate>Fri, 16 May 2008 02:36:25 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[Unix|Linux]]></category>

		<guid isPermaLink="false">http://www.daydayup.org.cn/?p=454</guid>
		<description><![CDATA[我在esx3.02的操作过程，大家需要做的是打开防火墙的端口161。
[root@esx02 root]#esxcfg-firewall &#8211;enableService ntpClient
[root@esx02 root]# vi /etc/ntp.conf
# Prohibit general access to this service.
restrict default ignore
# P... ]]></description>
			<content:encoded><![CDATA[<p>我在esx3.02的操作过程，大家需要做的是打开防火墙的端口161。<br />
[root@esx02 root]#esxcfg-firewall &#8211;enableService ntpClient</p>
<p>[root@esx02 root]# vi /etc/ntp.conf<br />
# Prohibit general access to this service.<br />
restrict default ignore</p>
<p># Permit all access over the loopback interface. This could<br />
# be tightened as well, but to do so would effect some of<br />
# the administrative functions.<br />
restrict 127.0.0.1<br />
restrict 127.0.0.1<br />
restrict default kod nomodify notrap<br />
server 0.vmware.pool.ntp.org<br />
server 1.vmware.pool.ntp.org<br />
server 2.vmware.pool.ntp.org<br />
driftfile /var/lib/ntp/drift</p>
<p># &#8212; CLIENT NETWORK &#8212;&#8212;-<br />
# Permit systems on this network to synchronize with this<br />
# time service. Do not permit those systems to modify the<br />
# configuration of this service. Also, do not use those<br />
# systems as peers for synchronization.<br />
# restrict 192.168.1.0 mask 255.255.255.0 notrust nomodify notrap</p>
<p>&#8220;/etc/ntp.conf&#8221; 83L, 2970C written<br />
[root@esx02 root]# vi /etc/ntp/step-tickers<br />
re.pool.ntp.org<br />
1.vmware.pool.ntp.org<br />
2.vmware.pool.ntp.org<br />
~</p>
<p>~</p>
<p>&#8220;/etc/ntp/step-tickers&#8221; 4L, 61C written<br />
[root@esx02 root]# vi /etc/hosts<br />
# Do not remove the following line, or various programs<br />
# that require network functionality will fail.<br />
127.0.0.1 localhost.localdomain localhost<br />
172.16.1.130 esx02.vmware.cn<br />
0.vmware.pool.ntp.org<br />
1.vmware.pool.ntp.org<br />
2.vmware.pool.ntp.org</p>
<p>~<br />
~<br />
~<br />
~<br />
~<br />
~<br />
~<br />
~<br />
~<br />
&#8220;/etc/hosts&#8221; 8L, 244C written<br />
[root@esx02 root]# service ntpd restart<br />
Shutting down ntpd: [ OK ]<br />
ntpd: Synchronizing with time server: [ OK ]<br />
Starting ntpd: [ OK ]<br />
[root@esx02 root]#<br />
设置ESX开机, NTP服务自启动:</p>
<p>chkconfig &#8211;level 345 ntpd on</p>
<p>指定ESX关机时, 硬件时钟与系统时钟同步:</p>
<p>hwclock &#8211;systohc</p>
<p>关于vmware 客户机的配置<br />
VM时间同步十分重要. 普通计算机一般都可以通过硬件所提供的时钟中断(CLOCK INTERRUPT)或时钟标记(CLOCK TICK), 来计算出系统时间. 对于运行在ESX上的VM来说, 它们并不直接使用ESX硬件, 时钟中断或时钟标记是由ESX的虚拟提供的. 在ESX繁忙的时候, 常常无法准时准确的为所有VM提供时钟中断和.时钟标记. 这样VM就很根据这些信号计算出准确的时间. 所以需要与时间源同步.</p>
<p>VM可以选择与ESX服务器做时间同步, 或是采用惯常的同步方式与其他时间源同步.</p>
<p>VM与ESX时间同步. 是由ESX直接提供时间给VM(而不是上述的时钟中断, 标记, 由VM自己计算出时间). VM必需安装VMWARE TOOLS. 然后在VMWARE TOOLS的配置中选择: 与ESX HOST同步. 如果是WINDOWS VM, 必需关闭WINDOWS TIME SERVICE, 否则WINDOWS TIME SERVICE将霸占UDP 123口, 使与ESX的时间同步无法正常进行.</p>
<p>VM与ESX时间同步, 只有当VM的时间>>落后<<于ESX时才能起到校正的作用! </p>
<p>如果不采用VM与ESX进行时间同步. VM可以与其他NTP时间源同步. 加入了WINDOWS AD的WINDOWS PC/服务器, 一般莫认与PD同步. 其他的需要手动设置.</p>
<p>1、windows os关闭时钟同步功能，安装vmware-tools,设置同步为开。<br />
2、linux os 关闭ntpd服务，安装vmware-tools ,设置同步为开，或者直接编辑vmx文件，并加入：<br />
tools.syncTime = &#8220;TRUE&#8221;。</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=454&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_454" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/05/16/esx-ntp-sync-confi.htm/feed</wfw:commentRss>
		</item>
		<item>
		<title>linux下安装及配置snmp服务</title>
		<link>http://www.tuifei.com/2008/05/12/linux-snmp-config.htm</link>
		<comments>http://www.tuifei.com/2008/05/12/linux-snmp-config.htm#comments</comments>
		<pubDate>Mon, 12 May 2008 08:01:49 +0000</pubDate>
		<dc:creator>David</dc:creator>
		
		<category><![CDATA[Unix|Linux]]></category>

		<guid isPermaLink="false">http://www.daydayup.org.cn/?p=453</guid>
		<description><![CDATA[1、确保本机已经安装了snmp服务 
[root@idc ~]# rpm -qa &#124;grep snmp 
net-snmp-libs-5.1.2-11.EL4.7 
net-snmp-5.1.2-11.EL4.7 
如果没有，那么放入linux安装盘找到snmp的rpm包进行安装，或者到网上搜索适合自己linux发... ]]></description>
			<content:encoded><![CDATA[<p>1、确保本机已经安装了snmp服务 </p>
<p>[root@idc ~]# rpm -qa |grep snmp </p>
<p>net-snmp-libs-5.1.2-11.EL4.7 </p>
<p>net-snmp-5.1.2-11.EL4.7 </p>
<p>如果没有，那么放入linux安装盘找到snmp的rpm包进行安装，或者到网上搜索适合自己linux发行版本的rpm包进行安装<br />
在新版本的centos及redhat es版本中可能在安装时会提示依赖性错误，这时需要安装lm_sensors-2.8.7-2.40.3.i386.rpm，再安装netsnmp软件。</p>
<p>2、snmpd.conf文件配置 </p>
<p>按照如下方式修改snmpd.conf文件 </p>
<p>A、修改默认的community string </p>
<p>com2sec notConfigUser default public </p>
<p>将public修改为你才知道的字符串 </p>
<p>B、把下面的#号去掉 </p>
<p>#view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc </p>
<p>C、把下面的语句 </p>
<p>access notConfigGroup &#8220;&#8221; any noauth exact systemview none none </p>
<p>改成： </p>
<p>access notConfigGroup &#8220;&#8221; any noauth exact mib2 none none </p>
<p>3、重启snmpd服务 </p>
<p>#/etc/rc.d/init.d/snmpd restart </p>
<p>完成snmpd的配置 </p>
<p>4、确保linux的iptables防火墙对我们的流量监控服务器开放了udp 161端口的访问权限 </p>
<p>可使用iptables –L –n 查看当前iptables规则 </p>
<p>可编辑/etc/sysconfig/iptables文件来修改iptables规则。 </p>
<p>把snmpd服务添加为自启动</p>
<p>chkconfig snmpd on</p>
<p>可以用chkconfig &#8211;list |grep on 来查看是否已经是自启组</p>
<p>如果chkconfig &#8211;list |grep snmpd 没有的话可以先用以下命令增加</p>
<p>chkconfig &#8211;add snmpd</p>
<p class="akst_link"><a href="http://www.tuifei.com/?p=453&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_453" class="akst_share_link" rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.tuifei.com/2008/05/12/linux-snmp-config.htm/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
