<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>gjw_apparitor 博客 &#187; 转载</title>
	<atom:link href="http://www.apparitor.info/category/%e8%bd%ac%e8%bd%bd/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.apparitor.info</link>
	<description>孤独是一种态度</description>
	<lastBuildDate>Wed, 16 May 2012 07:36:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>第四次作业—吕宇鹏—DNS安全威胁与防护(转载)</title>
		<link>http://www.apparitor.info/2011/07/20/%e7%ac%ac%e5%9b%9b%e6%ac%a1%e4%bd%9c%e4%b8%9a%e2%80%94%e5%90%95%e5%ae%87%e9%b9%8f%e2%80%94dns%e5%ae%89%e5%85%a8%e5%a8%81%e8%83%81%e4%b8%8e%e9%98%b2%e6%8a%a4%e8%bd%ac%e8%bd%bd/</link>
		<comments>http://www.apparitor.info/2011/07/20/%e7%ac%ac%e5%9b%9b%e6%ac%a1%e4%bd%9c%e4%b8%9a%e2%80%94%e5%90%95%e5%ae%87%e9%b9%8f%e2%80%94dns%e5%ae%89%e5%85%a8%e5%a8%81%e8%83%81%e4%b8%8e%e9%98%b2%e6%8a%a4%e8%bd%ac%e8%bd%bd/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 13:42:43 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[Dns]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=375</guid>
		<description><![CDATA[本文转自：http://course.ccert.edu.cn/2010/blog/ppoksblog/ 第四次作业—吕宇鹏—DNS安全威胁与防护 国际著名网络安全专家Roland Dobbins曾说过，域名系统就像是“空气”，平时我们感觉不到它的存在，但是一旦出现问题，其影响可能是“致命”的。近年来的“163.net域名劫持”事件、“adobe.com域名劫持”事件、“Google域名劫持”事件、“twitter域名劫持”事件、“百度域名劫持”事件以及“暴风影音断网门”都说明了域名系统安全性面临的巨大风险以及在安全性遭受到破坏时将会导致的巨大损失。那么，为什么长久以来DNS系统总是会遭受到类似域名劫持的攻击呢？本文尝试从技术角度对域名系统的安全性进行分析及建议。 本文第一部分简要介绍了域名系统（DNS）的概念和基本原理，第二部分分析了DNS系统易遭受的各种攻击。第三部分综述了目前已有的安全解决方案，第四部分进行了总结。 一、 概述 DNS系统 DNS是英文Domain Name System（域名系统）的缩写，它是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统，为互联网的运行提供关键性的基础服务。各种基于域名的Web访问，email系统、文件共享系统等都依靠DNS服务得以正常实现。DNS系统采用备份技术和缓存技术保证了数据库运行的可靠性和服务速率。 DNS服务原理 DNS系统采用递归查询请求的方式来响应用户的查询。 下面引用老师的课件插图来进行说明： 1） 用户向DNS 客户端发送DNS请求，客户端先查看本地缓存，如果缓存中有该域名，则直接返回给用户；客户端若没有域名的相关缓存，则向本地域名服务器提出解析请求。 2） 本地域名服务器在收到请求后，先查看缓存，若缓存中有相关记录，则应答客户端的请求；否则，本地域名服务器直接向根域名服务器提出请求。 3） 根域名服务器接到请求后，将包含有所需解释的域名的顶级域名服务器返回给本地域名服务器。 4） 本地域名服务器根据根域名服务器的返回结果，向顶级域名服务器发送请求。 5） 顶级域名服务器接到请求后，将包含所查询的域名的域名服务器返回给本地域名服务器。 6） 本地域名服务器根据返回结果连接包含域名的域名服务器，得到查询结果， 然后将查询结果缓存，并向客户端应答。 7） 客户端接到应答后，将查询结果缓存，然后向用户应答。 二、 安全威胁 DNS的安全威胁主要可分为几种：DNS欺骗、分布式拒绝服务攻击、DNS软件漏洞攻击、管理缺陷等。下面分别对这几类攻击进行介绍。 DNS欺骗 DNS的查询请求是基于UDP的，DNS客户端会接受首先到达的DNS应答包，而将后到达的DNS应答包当作是冗余包简单丢弃掉。客户端对DNS应答包的验证仅通过随机发送的查询ID和UDP端口号，除此之外没有任何的验证。这就给DNS欺骗提供了机会。 1、DNS ID欺骗 DNS ID欺骗中的攻击者必须跟用户处于同一个局域网内。 攻击流程： 1） Arp欺骗。欺骗者向用户发送伪造的arp应答报文，更新用户本地的arp缓存，使用户认为欺骗者为网关。这样，在用户向本地DNS服务器发送请求时，数据的流向就改为用户—欺骗者—网关—本地DNS服务器。欺骗者通过sniffer软件，嗅探到DNS请求包的ID和端口号。 2） 欺骗者利用得到的ID和端口号，优先向用户发送伪造DNS应答，用户在对ID和端口号进行核对后认为是正确的应答。此时用户访问的域名已经被替换为欺骗者伪造的IP。 3） 本地DNS服务器发送的真的DNS应答包因为晚于伪造包，用户收到后丢弃。至此，DNS ID欺骗攻击完成。 2、DNS缓存中毒 当攻击者与用户不是处于同一个局域网时，攻击者无法得到DNS请求报文的ID与端口号，“生日攻击”就是在这种情况下的对DNS缓存的一种攻击方式。 攻击流程如下： 1、 攻击者向DNS服务器发送一定数量的DNS请求包，请求的DNS选择该DNS服务器解析不了的，这样的情况下，DNS服务器会向上层DNS服务器发出相同数量的请求。 2、 攻击者快速向DNS服务器发送一定数量的伪造的DNS应答包，其中ID和端口号为随机的，当ID和端口号与正确的相碰撞时，缓存攻击成功。DNS服务器将错误的DNS解析项缓存，这样，所有DNS请求都将导向攻击者伪造的IP地址。 “生日悖论”的数学模型可以证明，一次成功的攻击所需发送伪造包的数量并不多，即是说“生日攻击”是易于发动，也易于成功的。]]></description>
			<content:encoded><![CDATA[<p>本文转自：http://course.ccert.edu.cn/2010/blog/ppoksblog/</p>
<p>第四次作业—吕宇鹏—DNS安全威胁与防护<br />
      国际著名网络安全专家Roland Dobbins曾说过，域名系统就像是“空气”，平时我们感觉不到它的存在，但是一旦出现问题，其影响可能是“致命”的。近年来的“163.net域名劫持”事件、“adobe.com域名劫持”事件、“Google域名劫持”事件、“twitter域名劫持”事件、“百度域名劫持”事件以及“暴风影音断网门”都说明了域名系统安全性面临的巨大风险以及在安全性遭受到破坏时将会导致的巨大损失。那么，为什么长久以来DNS系统总是会遭受到类似域名劫持的攻击呢？本文尝试从技术角度对域名系统的安全性进行分析及建议。<br />
      本文第一部分简要介绍了域名系统（DNS）的概念和基本原理，第二部分分析了DNS系统易遭受的各种攻击。第三部分综述了目前已有的安全解决方案，第四部分进行了总结。<br />
一、 概述<br />
DNS系统</p>
<p>DNS是英文Domain Name System（域名系统）的缩写，它是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统，为互联网的运行提供关键性的基础服务。各种基于域名的Web访问，email系统、文件共享系统等都依靠DNS服务得以正常实现。DNS系统采用备份技术和缓存技术保证了数据库运行的可靠性和服务速率。<br /><span id="more-375"></span><br />
DNS服务原理<br />
DNS系统采用递归查询请求的方式来响应用户的查询。<br />
下面引用老师的课件插图来进行说明：<br />
 <a href="http://www.apparitor.info/wp-content/uploads/2011/07/dns.jpg"><img src="http://www.apparitor.info/wp-content/uploads/2011/07/dns-300x219.jpg" alt="" title="dns" width="300" height="219" class="alignnone size-medium wp-image-377" /></a><br />
1）              用户向DNS 客户端发送DNS请求，客户端先查看本地缓存，如果缓存中有该域名，则直接返回给用户；客户端若没有域名的相关缓存，则向本地域名服务器提出解析请求。<br />
2）              本地域名服务器在收到请求后，先查看缓存，若缓存中有相关记录，则应答客户端的请求；否则，本地域名服务器直接向根域名服务器提出请求。<br />
3）              根域名服务器接到请求后，将包含有所需解释的域名的顶级域名服务器返回给本地域名服务器。<br />
4）              本地域名服务器根据根域名服务器的返回结果，向顶级域名服务器发送请求。<br />
5）              顶级域名服务器接到请求后，将包含所查询的域名的域名服务器返回给本地域名服务器。<br />
6）              本地域名服务器根据返回结果连接包含域名的域名服务器，得到查询结果，<br />
然后将查询结果缓存，并向客户端应答。<br />
7）              客户端接到应答后，将查询结果缓存，然后向用户应答。<br />
二、             安全威胁</p>
<p>DNS的安全威胁主要可分为几种：DNS欺骗、分布式拒绝服务攻击、DNS软件漏洞攻击、管理缺陷等。下面分别对这几类攻击进行介绍。<br />
DNS欺骗<br />
DNS的查询请求是基于UDP的，DNS客户端会接受首先到达的DNS应答包，而将后到达的DNS应答包当作是冗余包简单丢弃掉。客户端对DNS应答包的验证仅通过随机发送的查询ID和UDP端口号，除此之外没有任何的验证。这就给DNS欺骗提供了机会。<br />
1、DNS ID欺骗<br />
DNS ID欺骗中的攻击者必须跟用户处于同一个局域网内。</p>
<p><a href="http://www.apparitor.info/wp-content/uploads/2011/07/2.jpg"><img src="http://www.apparitor.info/wp-content/uploads/2011/07/2-300x166.jpg" alt="" title="2" width="300" height="166" class="alignnone size-medium wp-image-379" /></a></p>
<p>攻击流程：<br />
1）              Arp欺骗。欺骗者向用户发送伪造的arp应答报文，更新用户本地的arp缓存，使用户认为欺骗者为网关。这样，在用户向本地DNS服务器发送请求时，数据的流向就改为用户—欺骗者—网关—本地DNS服务器。欺骗者通过sniffer软件，嗅探到DNS请求包的ID和端口号。<br />
2）              欺骗者利用得到的ID和端口号，优先向用户发送伪造DNS应答，用户在对ID和端口号进行核对后认为是正确的应答。此时用户访问的域名已经被替换为欺骗者伪造的IP。<br />
3）              本地DNS服务器发送的真的DNS应答包因为晚于伪造包，用户收到后丢弃。至此，DNS ID欺骗攻击完成。<br />
2、DNS缓存中毒<br />
当攻击者与用户不是处于同一个局域网时，攻击者无法得到DNS请求报文的ID与端口号，“生日攻击”就是在这种情况下的对DNS缓存的一种攻击方式。<br />
攻击流程如下：<br />
1、  攻击者向DNS服务器发送一定数量的DNS请求包，请求的DNS选择该DNS服务器解析不了的，这样的情况下，DNS服务器会向上层DNS服务器发出相同数量的请求。<br />
2、  攻击者快速向DNS服务器发送一定数量的伪造的DNS应答包，其中ID和端口号为随机的，当ID和端口号与正确的相碰撞时，缓存攻击成功。DNS服务器将错误的DNS解析项缓存，这样，所有DNS请求都将导向攻击者伪造的IP地址。<br />
“生日悖论”的数学模型可以证明，一次成功的攻击所需发送伪造包的数量并不多，即是说“生日攻击”是易于发动，也易于成功的。<br />
分布式拒绝服务攻击<br />
攻击者通过控制的“僵尸网络”（成百上千的被控主机群）向目标DNS服务器发送DNS查询请求，从而导致目标DNS服务器过载以及网络线路堵塞。从而形成分布式拒绝服务攻击。<br />
著名的“暴风影音DNS攻击”事件就是分布式拒绝服务攻击的一个实例。<br />
软件漏洞攻击<br />
1、  DoS（Deny of Service）攻击<br />
利用DNS软件的漏洞，如9.2.0版本以前的BIND，向正在运行的BIND设备发送特定的DNS数据包请求，BIND会自动关闭，用户的请求将无法得到DNS服务器的任何应答，用户也将无法访问互联网，从而形成DoS攻击。<br />
2、  缓冲区溢出攻击<br />
利用DNS软件对输入的请求字符串不做做严格的检查的安全漏洞，攻击者构造特殊的数据包攻击DNS服务器，以期造成DNS软件的缓冲区溢出，在溢出成功后，通过执行特殊的代码获得高级的权限，从而得到DNS服务器的控制权。<br />
管理缺陷<br />
DNS现有的管理、配置以及安全机制的规划都非常有限，甚至还很初级。例如目前全球DNS系统仍然主要依赖多点镜像、负载均衡等方法来应对流量突发访问以及遭受DDOS攻击时保持正常运转。另外对DNS的管理和配置以及安全防护也主要依赖管理者的实际经验。<br />
三、             解决方案</p>
<p>应对上述DNS安全威胁的主要办法可总结如下：<br />
防范Arp攻击、采用UDP随机端口、建立静态IP映射、运行最新版本的BIND、限制查询、利用防火墙进行保护、利用交叉检验、使用TSIG机制、利用DNSSEC机制。<br />
下面分别做出说明。<br />
防范Arp攻击<br />
主要是针对局域网的DNS ID欺骗攻击。如上所述，DNS ID欺骗是基于Arp欺骗的，防范了Arp欺骗攻击，DNS ID欺骗攻击是无法成功实施的。<br />
采用UDP随机端口<br />
不再使用默认的53端口查询，而是在UDP端口范围内随机选择，可使对ID与端口组合的猜解难度增加6万倍，从而降低使DNS缓存攻击的成功率。<br />
建立静态IP映射<br />
         主要是指DNS服务器对少部分重要网站或经常访问的网站做静态映射表，使对这些网站的访问不再需要经过缓存或者向上一级的迭代查询，从而在机制上杜绝DNS欺骗攻击。<br />
运行最新版本的BIND<br />
         使用最新版本的BIND，可以防止已知的针对DNS软件的攻击（如DoS攻击、缓冲区溢出漏洞攻击等）。应密切关注BIND安全公告，及时打好补丁。<br />
         限制查询<br />
         在BIND8和BIND9之后，BIND的allow-query子句允许管理员对到来的查询请求使用基于IP地址的控制策略，访问控制列表可以对特定的区甚至是对该域名服务器受到的任何查询请求使用限制策略。如限制所有查询、限制特定区的查询、防止未授权的区的查询、以最少权限运行BIND等。<br />
         利用防火墙进行保护<br />
         这种保护方式可以使受保护的DNS服务器不致遭受分布式拒绝服务攻击、软件漏洞攻击。原理是在DNS服务器主机上建立一个伪DNS服务器共外部查询，而在内部系统上建立一个真实的DNS服务器专供内部使用。配置用户的内部DNS客户机，用于对内部服务器的所有查询，当内部主机访问某个网站时，仅当内部DNS服务器上没有缓存记录时，内部DNS才将查询请求发送到外部DNS服务器上，以保护内部服务器免受攻击。<br />
利用交叉检验<br />
         这种保护方式可以从一定程度上防范DNS欺骗攻击。原理是反向查询已得到的IP地址对应的主机名，用该主机名查询DNS服务器对应于该主机名的IP地址，如果一致，则请求合法，否则非法。<br />
         使用TSIG机制<br />
         TSIF（事物签名）机制（RFC2845）通过使用共享密钥（Secret Key）及单向散列函数（One-way hash function）提供信息的验证以及数据的完整性。当配置了TSIG后，DNS消息会增加一个TSIF记录选项，该选项对DNS消息进行签名，为消息发送者和接受者提供共享密钥，从而保证了传输数据不被窃取和篡改。TSIP机制的部署步骤不做赘述，相关RFC文档有详细说明。<br />
         利用DNSSEC机制<br />
         为保证客户机发送的解析请求的完整性，保护DNS服务器及其中的信息，防止入侵者冒充合法用户向他人提供虚假DNS信息，IETF（网络工程任务组）提出了DNS安全扩展（DNSSEC）的安全防范思想。<br />
1、 DNSSEC工作原理<br />
为提高DNS访问数据包的安全性，DNSSEC在兼容现有协议的基础上引入加密和认证体系，在每个区域都有一对区域级的密钥对，密钥对中的公钥对域名记录信息进行数字签名，从而使支持DNSSEC的接收者可以校验应答信息的可靠性。<br />
BIND9．0支持DNS的安全扩展功能⋯。DNSSEC引入两个全新的资源记录类型：KEY和SIG，允许客户端和域名服务器对任何DNS数据来源进行密钥验证。DNSSEC主要依靠公钥技术对于包含在DNS中的信息创建密钥签名，密钥签名通过计算出一个密钥Hash数来提供DNS中数据的完整性，并将该Hash数封装进行保护。私／公钥对中的私钥用来封装Hash数，然后可以用公钥把Hash数翻译出来。如果这个翻译出的Hash值匹配接收者计算出来的Hash数，那么表明数据是完整的、没有被篡改的。<br />
2、 DNSSEC的实施<br />
1）、创建一组密钥对<br />
#cd/vat/named<br />
#dnssec -keygen -a RSA -b 512 -n ZONE qfnu．edu．Kqfnu．edu+002+27782<br />
2）、生成密钥记录<br />
#dnssec –makekeyset -t 172802 I<qfnu．edu．+002+27782．key 3）、发送密钥文件到上一级域管理员，以供签名使用 #dnssec -signkey keyset -qfnu．edu Kedu．+002+65396．private 然后将返回qfnu．edu．signedkey文件 4）、在进行区域签名之前，必须先将密钥记录添加到区域数据文件之中 #cat“$include Kqfnn．edu．+002+27782．key”>>db．qfnu．edu<br />
5）、对区域进行签名<br />
#dnssec –signzone -O qfnu．edu db．qfnu．edu<br />
6）、修改named．conf里的zone语句，系统将会载新的区域数据文件<br />
3、 DNSSEC的不足<br />
一方面，DNSSEC安全性虽然有所提高，但是标记和校验必然产生额外的开销，从而影响网络和服务器的性能，签名的数据量很大，家中了域名服务器对骨干网以及非骨干网连接的负担，同时简明校验也对CPU造成了很大的负担，同时签名和密钥也占用了占用的磁盘空间以及RAM容量。<br />
另一方面，安全性能方面的考虑。绝大多数的DNS软件是美国出口的，它们为了通过美国政府的安全规定而被迫降低加密算法和过程的安全强度。<br />
第三方面，RSA算法的使用。RSA拥有美国专利，与某些厂商和组织倡导的“免费/开放”目标有所冲突，但是同时又别无选择。在成本方面也是部署中的一个问题。<br />
四、             总结<br />
知名IT网站TechTarget近日发布的2010年五大安全主题的展望中，DNSSEC部署动向位列第三位，DNS服务的安全性已经受到人们越来越多的关注。然而DNS系统本身的复杂性以及全球性特点给DNS系统的安全部署又带来了很多的问题，而目前已有的安全方案仍然很不成熟，部署应用中也还有很多问题没有解决，如何面对这些挑战，仍然是一个尚未解决又急需解决的难题。</p>
<p>参考文献：<br />
1、Dannie-《百度域名劫持事件百日谈》<br />
2、郭大兴，周向荣 《DNS缓存中毒攻击与防范》绿盟科技开发中心<br />
3、孔致，姜秀柱 《DNS欺骗原理及其防御方案》计算机工程 2010年2月 第36卷 第三期<br />
4、Harry’s home《从百度域名劫持事件谈DNS系统的安全问题》<br />
5、《TechTarget展望2010年五大安全主题》 中国信息安全认证中心<br />
6、《互联网域名系统安全管理的现状及研究进展》 中国信息安全认证中心<br />
7、姜春茂，黄春梅，聂福林 《基于DNS攻击的安全防范策略》陕西科技大学学报 2004年<br />
8、王启建 高仲合 《基于DNS攻击的安全分析及其防范》网络与信息安全<br />
9、王昕 王静怡 《基于DNS攻击的安全加固策略应用科技》<br />
10、张红轻，王道顺 《基于DNS缓存中毒的Webmail攻击及防护》 计算机工程 2009年2月<br />
11、乔雷 《对暴风DNS遭遇攻击导致大规模网络故障的分析》 网络安全博客<br />
06月 23, 2010 | No Comments »</p>
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/07/20/%e7%ac%ac%e5%9b%9b%e6%ac%a1%e4%bd%9c%e4%b8%9a%e2%80%94%e5%90%95%e5%ae%87%e9%b9%8f%e2%80%94dns%e5%ae%89%e5%85%a8%e5%a8%81%e8%83%81%e4%b8%8e%e9%98%b2%e6%8a%a4%e8%bd%ac%e8%bd%bd/">第四次作业—吕宇鹏—DNS安全威胁与防护(转载)</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/07/20/%e7%ac%ac%e5%9b%9b%e6%ac%a1%e4%bd%9c%e4%b8%9a%e2%80%94%e5%90%95%e5%ae%87%e9%b9%8f%e2%80%94dns%e5%ae%89%e5%85%a8%e5%a8%81%e8%83%81%e4%b8%8e%e9%98%b2%e6%8a%a4%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu 11.04 Gnome 常用快捷键(转载)</title>
		<link>http://www.apparitor.info/2011/07/20/ubuntu-11-04-gnome-%e5%b8%b8%e7%94%a8%e5%bf%ab%e6%8d%b7%e9%94%ae%e8%bd%ac%e8%bd%bd/</link>
		<comments>http://www.apparitor.info/2011/07/20/ubuntu-11-04-gnome-%e5%b8%b8%e7%94%a8%e5%bf%ab%e6%8d%b7%e9%94%ae%e8%bd%ac%e8%bd%bd/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 05:29:49 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=372</guid>
		<description><![CDATA[今天系统升级到 ubuntu 11.04了，界面变了很多有点不适应。找个快捷键先熟悉一下。 · 通用快捷键 Alt + F1 类似Windows下的Win键，在GNOME中打开”应用程序”菜单(Applications) Alt + F2 类似Windows下的Win + R组合键，在GNOME中运行应用程序 Ctrl + Alt + L 类似Windows下的Win + L 组合键，锁定桌面，不同在于同时启动屏幕保护程序 Ctrl + Alt + D组合键，显示桌面 Ctrl + Alt + → / ← 在不同工作台间切换 Ctrl + Alt + Shift + → / ← 移动当前窗口到不同工作台 · Ubuntu通用快捷键 PrintScreen 全屏抓图 Alt + PrintScreen 当前窗口抓图]]></description>
			<content:encoded><![CDATA[<p>今天系统升级到 ubuntu 11.04了，界面变了很多有点不适应。找个快捷键先熟悉一下。</p>
<p>· 通用快捷键<br />
Alt + F1 类似Windows下的Win键，在GNOME中打开”应用程序”菜单(Applications)<br />
Alt + F2 类似Windows下的Win + R组合键，在GNOME中运行应用程序<br />
Ctrl + Alt + L 类似Windows下的Win + L 组合键，锁定桌面，不同在于同时启动屏幕保护程序<br />
Ctrl + Alt + D组合键，显示桌面<br />
Ctrl + Alt + → / ← 在不同工作台间切换<br />
Ctrl + Alt + Shift + → / ← 移动当前窗口到不同工作台</p>
<p>· Ubuntu通用快捷键<br />
PrintScreen 全屏抓图<br />
Alt + PrintScreen 当前窗口抓图<br />
Ctrl+ Alt+ F1-F6 进入全屏终端<br />
Ctrl+ Alt+ F7 返回图形界面<br />
<--Ctrl+Alt+Shift+F8 未知（终端或模拟终端）<br />
Ctrl+Alt+Shift+Fn 终端N或模拟终端N(n和N为数字1－6) --><br />
<span id="more-372"></span><br />
· 窗口操作快捷键（Metacity窗口管理器）<br />
· 鼠标操作<br />
Shift + 中键 拖拽文件图标，移动菜单<br />
Alt + 左键 拖拽移动窗口<br />
Alt + Shift + 左键 拖拽移动窗口并且可以使窗口停留在边缘位置<br />
Alt + 右键 弹出窗口管理器菜单<br />
Alt + 中键 拖拽改变窗口大小</p>
<p>· 纯键盘<br />
Alt + ESC 在不同程序窗口间切换<br />
Alt + Tab 为了兼容Windows下的Alt + Tab组合键习惯，提供的第二个“在不同程序窗口间切换”<br />
Alt + F4 关闭窗口<br />
Alt + F5 取消最大化窗口 (恢复窗口原来的大小)<br />
Alt + F7 移动窗口 (注: 在窗口最大化的状态下无效)<br />
Alt + F8 改变窗口大小 (注: 在窗口最大化的状态下无效)<br />
Alt + F9 最小化窗口<br />
Alt + F10 最大化窗口<br />
Alt + Space 打开窗口的控制菜单 (点击窗口左上角图标出现的菜单)</p>
<p>· 应用程序中的常用快捷键<br />
(注: 并不适用于所有程序)<br />
Ctrl+N 新建窗口<br />
Ctrl+X 剪切<br />
Ctrl+C 复制<br />
Ctrl+V 粘贴<br />
Ctrl+Z 撤销上一步操作<br />
Ctrl+Shift+Z / Ctrl+Y 重做刚撤销的一步操作<br />
Ctrl+S 保存<br />
Ctrl+B 书签</p>
<p>· 文件浏览器（部分）<br />
Ctrl+H 显示隐藏文件（切换键）<br />
Ctrl+T 新建标签<br />
Ctrl+W 关闭标签<br />
Ctrl+Page Up 上一个标签<br />
Ctrl+Page Down 下一个标签<br />
Alt+N 切换到第N个标签（N为数字）</p>
<p>· 在Ubuntu中自定义快捷键<br />
访问“System>Preferences>Keyboard Shortcuts”，选定想要设置的项目，然后键入快捷键即可
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/07/20/ubuntu-11-04-gnome-%e5%b8%b8%e7%94%a8%e5%bf%ab%e6%8d%b7%e9%94%ae%e8%bd%ac%e8%bd%bd/">Ubuntu 11.04 Gnome 常用快捷键(转载)</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/07/20/ubuntu-11-04-gnome-%e5%b8%b8%e7%94%a8%e5%bf%ab%e6%8d%b7%e9%94%ae%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iozone的使用与介绍 (转载)</title>
		<link>http://www.apparitor.info/2011/04/07/iozone%e7%9a%84%e4%bd%bf%e7%94%a8%e4%b8%8e%e4%bb%8b%e7%bb%8d-%e8%bd%ac%e8%bd%bd/</link>
		<comments>http://www.apparitor.info/2011/04/07/iozone%e7%9a%84%e4%bd%bf%e7%94%a8%e4%b8%8e%e4%bb%8b%e7%bb%8d-%e8%bd%ac%e8%bd%bd/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 08:26:59 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[iozone]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=307</guid>
		<description><![CDATA[http://blog.sina.com.cn/s/blog_3cba7ec10100ea62.html iozone介绍： iozone（www.iozone.org)是一个文件系统的benchmark工具，可以测试不同的操作系统中文件系统的读写性能。 可以测试 Read, write, re-read,re-write, read backwards, read strided, fread, fwrite, random read, pread, mmap, aio_read, aio_write 等等不同的模式下的硬盘的性能。 测试的时候请注意，设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小)，不然linux会给你的读写的内容进行缓存。会使数值非常不真实. iozone常用的几个参数. -a 全面测试，比如块大小它会自动加 -i N 用来选择测试项, 比如Read/Write/Random 比较常用的是0 1 2,可以指定成-i 0 -i 1 -i2.这些别的详细内容请查man 0=write/rewrite 1=read/re-read 2=random-read/write 3=Read-backwards 4=Re-write-record 5=stride-read 6=fwrite/re-fwrite 7=fread/Re-fread 8=random mix 9=pwrite/Re-pwrite 10=pread/Re-pread 11=pwritev/Re-pwritev 12=preadv/Re-preadv -r block size 指定一次写入/读出的块大小 -s file]]></description>
			<content:encoded><![CDATA[<p>http://blog.sina.com.cn/s/blog_3cba7ec10100ea62.html</p>
<p>iozone介绍：<br />
iozone（www.iozone.org)是一个文件系统的benchmark工具，可以测试不同的操作系统中文件系统的读写性能。<br />
可以测试 Read, write, re-read,re-write, read backwards, read strided, fread, fwrite, random read, pread,<br />
mmap, aio_read, aio_write 等等不同的模式下的硬盘的性能。<br />
测试的时候请注意，设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小)，不然linux会给你的读写的内容进行缓存。会使数值非常不真实.</p>
<p>iozone常用的几个参数.<br />
-a 全面测试，比如块大小它会自动加<br />
-i N 用来选择测试项, 比如Read/Write/Random 比较常用的是0 1 2,可以指定成-i 0 -i 1 -i2.这些别的详细内容请查man<br />
0=write/rewrite<br />
1=read/re-read<br />
2=random-read/write<br />
3=Read-backwards<br />
4=Re-write-record<br />
5=stride-read<br />
6=fwrite/re-fwrite<br />
7=fread/Re-fread<br />
8=random mix<br />
9=pwrite/Re-pwrite<br />
10=pread/Re-pread<br />
11=pwritev/Re-pwritev<br />
12=preadv/Re-preadv</p>
<p><span id="more-307"></span>-r block size 指定一次写入/读出的块大小<br />
-s file size 指定测试文件的大小<br />
-f filename 指定测试文件的名字,完成后会自动删除(这个文件必须指定你要测试的那个硬盘中)<br />
-F file1 file2&#8230; 指定多线程下测试的文件名</p>
<p>批量测试项:<br />
-g -n 指定测试文件大小范围,最大测试文件为4G,可以这样写 -g 4G<br />
-y -q 指定测试块的大小范围</p>
<p>输出:<br />
下面是几个日志记录的参数.好象要输出成图象进行分析，需要指定-a的测试才能输出<br />
-R 产生Excel到标准输出<br />
-b 指定输出到指定文件上. 比如 -Rb ttt.xls</p>
<p>我的测试实例:<br />
#./iozone -a -n 512m -g 4g -i 0 -i 1 -i 5 -f /mnt/iozone -Rb ./iozone.xls</p>
<p>注:进行全面测试.最小测试文件为512M直到测试到4G.测试read,write,和Strided Read.测试的地方在mnt下。生成Excel的文件.</p>
<p>./iozone -i 0 -i 1 -f /iozone.tmpfile -Rab /test-iozone.xls -g 8G -n 4G -C</p>
<p>结果分析：<br />
使用这条测试命令测试NAS后，我对下边产生的Execl文件中的一段表进行下解释，很简单的：<br />
Writer Report<br />
4	8	16	32	64<br />
32768	5300	8166	12726	16702	24441<br />
65536	5456	8285	9630	16101	18679<br />
131072	5539	6968	9453	13086	14136<br />
262144	5088	7092	9634	11602	14776<br />
524288	5427	9356	10502	13056	13865<br />
1048576	6061	9625	11528	12632	13466<br />
在Execl文件中的这段表，它说明了这个表单是关于write的测试结果，左侧一列是测试文件大小（Kbytes),<br />
最上边一行是记录大小，中间数据是测试的传输速度。举例说明，比如表中的“5300”，意思是测试文件大小为<br />
32M，以记录大小为4K来进行传输，它的传输速度为5300 Kbytes/s</p>
<p>关于各种测试的定义</p>
<p>Write: 测试向一个新文件写入的性能。当一个新文件被写入时，不仅仅是那些文件中的数据需要被存储，还包括那些用于定位数据存储在存储介质的具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息，所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。拜这些额外信息所赐，Write的性能通常会比Re-write的性能低。</p>
<p>Re-write: 测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时，所需工作量较少，因为此时元数据已经存在。Re-write的性能通常比Write的性能高。</p>
<p>Read: 测试读一个已存在的文件的性能。</p>
<p>Re-Read: 测试读一个最近读过的文件的性能。Re-Read性能会高些，因为操作系统通常会缓存最近读过的文件数据。这个缓存可以被用于读以提高性能。</p>
<p>Random Read: 测试读一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能，例如：操作系统缓存的大小，磁盘数量，寻道延迟和其他。</p>
<p>Random Write: 测试写一个文件中的随机偏移量的性能。同样，许多因素可能影响这种情况下的系统性能，例如：操作系统缓存的大小，磁盘数量，寻道延迟和其他。</p>
<p>Random Mix: 测试读写一个文件中的随机偏移量的性能。同样，许多因素可能影响这种情况下的系统性能，例如：操作系统缓存的大小，磁盘数量，寻道延迟和其他。这个测试只有在吞吐量测试模式下才能进行。每个线程/进程运行读或写测试。这种分布式读/写测试是基于round robin 模式的。最好使用多于一个线程/进程执行此测试。</p>
<p>Backwards Read: 测试使用倒序读一个文件的性能。这种读文件方法可能看起来很可笑，事实上，有些应用确实这么干。MSC Nastran是一个使用倒序读文件的应用程序的一个例子。它所读的文件都十分大（大小从G级别到T级别）。尽管许多操作系统使用一些特殊实现来优化顺序读文件的速度，很少有操作系统注意到并增强倒序读文件的性能。</p>
<p>Record Rewrite: 测试写与覆盖写一个文件中的特定块的性能。这个块可能会发生一些很有趣的事。如果这个块足够小（比CPU数据缓存小），测出来的性能将会非常高。如果比CPU数据缓存大而比TLB小，测出来的是另一个阶段的性能。如果比此二者都大，但比操作系统缓存小，得到的性能又是一个阶段。若大到超过操作系统缓存，又是另一番结果。</p>
<p>Strided Read: 测试跳跃读一个文件的性能。举例如下：在0偏移量处读4Kbytes，然后间隔200Kbytes,读4Kbytes，再间隔200Kbytes，如此反复。此时的模式是读4Kbytes，间隔200Kbytes并重复这个模式。这又是一个典型的应用行为，文件中使用了数据结构并且访问这个数据结构的特定区域的应用程序常常这样做。<br />
许多操作系统并没注意到这种行为或者针对这种类型的访问做一些优化。同样，这种访问行为也可能导致一些有趣的性能异常。一个例子是在一个数据片化的文件系统里，应用程序的跳跃导致某一个特定的磁盘成为性能瓶颈。</p>
<p>Fwrite: 测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块，fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。<br />
这个测试是写一个新文件，所以元数据的写入也是要的。</p>
<p>Frewrite:测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块，fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。<br />
这个测试是写入一个已存在的文件，由于无元数据操作，测试的性能会高些。</p>
<p>Fread:测试调用库函数fread()来读文件的性能。这是一个执行缓存与阻塞读操作的库例程。缓存在用户空间之内。如果一个应用程序想要读很小的传输块，fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。</p>
<p>Freread: 这个测试与上面的fread 类似，除了在这个测试中被读文件是最近才刚被读过。这将导致更高的性能，因为操作系统缓存了文件数据。</p>
<p>几个特殊测试:</p>
<p>Mmap:许多操作系统支持mmap()的使用来映射一个文件到用户地址空间。映射之后,对内存的读写将同步到文件中去。这对一些希望将文件当作内存块来使用的应用程序来说很方便。一个例子是内存中的一块将同时作为一个文件保存在于文件系统中。<br />
mmap 文件的语义和普通文件略有不同。如果发生了对内存的存储，并不是立即发生相应的文件I/O操作。使用MS_SYNC 和MS_ASYNC标志位的 msyc()函数调用将控制内存和文件的一致性。调用msync() 时将MS_SYNC置位将强制把内存里的内容写到文件中去并等待直到此操作完成才返回。而MS_ASYNC 置位则告诉操作系统使用异步机制将内存刷新到磁盘，这样应用程序可以直接返回而不用等待此操作的完成。<br />
这个测试就是测量使用mmap()机制完成I/O的性能。</p>
<p>Async I/O: 许多操作系统支持的另外一种I/O机制是POSIX 标准的异步I/O。本程序使用POSIX标准异步I/O接口来完成此测试功能。<br />
例如： aio_write(), aio_read(), aio_error()。这个测试测量POSIX异步I/O机制的性能。</p>
<p>命令行参数：</p>
<p>接下来解释每个参数的用法。</p>
<p>Usage: iozone [-s filesize_Kb] [-r record_size_Kb ] [-f [path]filename]<br />
[-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children] [-h] [-o]<br />
[-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x]<br />
[-d microseconds] [-F path1 path2...] [-V pattern] [-j stride]<br />
[-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point]<br />
[-S cache_size] [-O] [-K] [-L line_size] [-g max_filesize_Kb]<br />
[-n min_filesize_Kb] [-N] [-Q] [-P start_cpu] [-c] [-e] [-b filename]<br />
[-J milliseconds] [-X filename] [-Y filename] [-w] [-W]<br />
[-y min_recordsize_Kb] [-q max_recordsize_Kb] [-+m filename]<br />
[-+u ] [ -+d ] [-+p percent_read] [-+r] [-+t ] [-+A #]</p>
<p>它们都是什么意思 ?<br />
-a<br />
用来使用全自动模式。生成包括所有测试操作的报告，使用的块 大小从4k到16M，文件大小从64k到512M。</p>
<p>-A<br />
这种版本的自动模式提供更加全面的测试但是消耗更多时间。参数–a在文件不小于<br />
32MB时将自动停止使用低于64K的块 大小测试。这节省了许多时间。而参数–A<br />
则告诉Iozone你不介意等待，即使在文件非常大时也希望进行小块 的测试。<br />
注意： 不推荐在Iozone3.61版中使用这个参数。使用–az –i 0 –i 1替代。</p>
<p>-b filename<br />
Iozone输出结果时将创建一个兼容Excel的二进制格式的文件。</p>
<p>-B<br />
使用mmap()文件。这将使用mmap()接口来创建并访问所有测试用的临时文件。一<br />
些应用程序倾向于将文件当作内存的一块来看待。这些应用程序对文件执行mmap()<br />
调用，然后就可以以读写内存的方式访问那个块来完成文件I/O。</p>
<p>-c<br />
计算时间时将close()包括进来。This is useful only if you suspect that close() is<br />
broken in the operating system currently under test. 对于NFS版本3测试而言这将会<br />
很有用，同时它也能帮助我们识别nfs3_commit 是否正常工作。</p>
<p>-C<br />
显示吞吐量测试中每个客户传输的字节数。如果你的操作系统在文件I/O或进程管<br />
理方面存在饥饿问题时这将派上用场。</p>
<p>-d #<br />
穿过“壁垒”时微秒级的延迟。在吞吐量测试中所有线程或进程在执行测试前都必<br />
须挂起在一道“壁垒”之前。通常来说，所有线程或进程在同一时间被释放。这个<br />
参数允许在释放每个进程或线程之间有一定的延迟（微秒级）。Microsecond delay out of barrier.  During the throughput tests all threads or processes are<br />
forced to a barrier before beginning the test.</p>
<p>-D<br />
对mmap文件使用msync(MS_ASYNC) 。这告诉操作系统在mmap空间的所有数据<br />
需要被异步地写到磁盘上。</p>
<p>-e<br />
计算时间时将flush (fsync,fflush) 包括进来。</p>
<p>-E<br />
用来进行一些扩展的测试。只在一些平台上可用。使用pread 接口。</p>
<p>-f filename<br />
用来指定测试时使用的临时文件的文件名。当使用unmount参数时这将很有用。测试时在每个测试之间进行unmount的话，测试使用的临时文件在一个可以被卸载的文件夹中是很有必要的。卸载当前工作目录是不可能的，因为Iozone进程运行于此。</p>
<p>-F filename filename filename …<br />
指定吞吐量测试中每个临时文件的文件名。文件名的数量应该和指定的进程或线程<br />
数相同。</p>
<p>-g #<br />
设置自动模式可使用的最大文件大小（Kbytes）。</p>
<p>-G<br />
对mmap文件使用msync(MS_SYNC)。这告诉操作系统在mmap空间的所有数据<br />
需要被同步地写到磁盘上。</p>
<p>-h<br />
显示帮助。</p>
<p>-H #<br />
使用POSIX异步I/O接口中的#号异步操作。Iozone使用POSIX 异步I/O接口，并使<br />
用bcopy 从异步缓存拷贝回应用程序缓存。一些版本的MSC NASTRAN就是这么进<br />
行I/O操作的。应用程序使用这一技术以便异步I/O可以在一个库中实现，而不需要<br />
更改程序内模。<br />
This technique is used by applications so that the async<br />
I/O may be performed in a library and requires no changes to the applications internal model.</p>
<p>-i #<br />
用来指定运行哪个测试。 (0=write/rewrite, 1=read/re-read, 2=random-read/write<br />
3=Read-backwards, 4=Re-write-record, 5=stride-read, 6=fwrite/re-fwrite, 7=fread/Re-fread,<br />
8=random mix, 9=pwrite/Re-pwrite, 10=pread/Re-pread, 11=pwritev/Re-pwritev, 12=preadv/Re-preadv).<br />
总是需要先进行0号测试以便后面的测试有文件可以测试。<br />
也支持使用-i # -i # -i # 以便可以进行多个测试。</p>
<p>-I<br />
对所有文件操作使用VxFS VX_DIRECT 。告诉VXFS 文件系统所有对文件的操作将跨<br />
过缓存直接在磁盘上进行。</p>
<p>-j #<br />
设置访问文件的跨度为 (# * 块 大小). Stride read测试将使用这个跨度来读块 。</p>
<p>-J # (毫秒级)<br />
在每个I/O操作之前产生指定毫秒的计算延迟。看 -X 和-Y来获取控制计算延<br />
迟的其他参数。<br />
-k #<br />
Use POSIX async I/O (no bcopy) with # async operations. Iozone will use POSIX async<br />
I/O and will not perform any extra bcopys. The buffers used by Iozone will be handed to<br />
the async I/O system call directly.</p>
<p>-K<br />
在普通测试时生成一些随机访问。</p>
<p>-l #<br />
Set the lower limit on number of processes to run. When running throughput tests this<br />
option allows the user to specify the least number of processes or threads to start. This<br />
option should be used in conjunction with the -u option.</p>
<p>-L #<br />
Set processor cache line size to value (in bytes). Tells Iozone the processor cache line size.<br />
This is used internally to help speed up the test.</p>
<p>-m<br />
Tells Iozone to use multiple buffers internally. Some applications read into a single<br />
buffer over and over. Others have an array of buffers. This option allows both types of<br />
applications to be simulated.  Iozone’s default behavior is to re-use internal buffers.<br />
This option allows one to override the default and to use multiple internal buffers.</p>
<p>-M<br />
Iozone will call uname() and will put the string in the output file.</p>
<p>-n #<br />
为自动模式设置最小文件大小(Kbytes)。</p>
<p>-N<br />
报告结果以毫秒每操作的方式显示。</p>
<p>-o<br />
写操作是同步写到磁盘的。 (O_SYNC). Iozone 会以O_SYNC 标志打开文件。这强制所有写操作完全写入磁盘后才返回测试。</p>
<p>-O<br />
报告结果以操作每秒的方式显示。</p>
<p>-p<br />
This purges the processor cache before each file operation. Iozone will allocate another<br />
internal buffer that is aligned to the same processor cache boundary and is of a size that<br />
matches the processor cache. It will zero fill this alternate buffer before beginning each test.<br />
This will purge the processor cache and allow one to see the memory subsystem without<br />
the acceleration due to the processor cache.</p>
<p>-P #<br />
Bind processes/threads to processors, starting with this cpu #. Only available on some<br />
platforms. The first sub process or thread will begin on the specified processor. Future processes or threads will be placed on the next processor. Once the total number of cpus is exceeded then future processes or threads will be placed in a round robin fashion.</p>
<p>-q #<br />
设置自动模式下使用的最大块大小(Kbytes) 。也可以通过-q #k ( Kbytes) 或 -q #m ( Mbytes) 或 -q #g ( Gbytes)。设置最小块大小见 –y 。</p>
<p>-Q<br />
Create offset/latency files. Iozone will create latency versus offset data files that can be<br />
imported with a graphics package and plotted. This is useful for finding if certain offsets<br />
have very high latencies. Such as the point where UFS will allocate its first indirect block.<br />
One can see from the data the impacts of the extent allocations for extent based filesystems<br />
with this option.</p>
<p>-r #<br />
指定测试块 大小，K字节。也可以通过-r #k (Kbytes) 或 -r #m (Mbytes) 或 -r #g (Gbytes).</p>
<p>-R<br />
生成Excel报告. Iozone将生成一个兼容Excel的标准输出报告。这个文件可以使用<br />
Microsoft Excel打开，可以创建一个文件系统性能的图表。注意：3D图表是面向列<br />
的。画图时你需要选择这项因为Excel默认处理面向行的数据。</p>
<p>-s #<br />
指定测试文件大小，K字节。也可以通过-s #k (Kbytes) 或 -s #m (Mbytes) 或 -s #g (Gbytes).</p>
<p>-S #<br />
Set processor cache size to value (in Kbytes). This tells Iozone the size of the processor cache.<br />
It is used internally for buffer alignment and for the purge functionality.</p>
<p>-t #<br />
以吞吐量模式运行Iozone。这一选项允许用户指定测试时使用多少个线程或者进程。</p>
<p>-T<br />
吞吐量测试时使用POSIX线程。仅在兼容POSIX线程的平台上可用。</p>
<p>-u #<br />
Set the upper limit on number of processes to run. When running throughput tests this<br />
option allows the user to specify the greatest number of processes or threads to start.<br />
This option should be used in conjunction with the -l option.</p>
<p>-U mountpoint<br />
在测试之间卸载并重新挂载挂载点。这保证了缓存cache不包含任何测试过的文件。</p>
<p>-v<br />
显示Iozone的版本号。</p>
<p>-V #<br />
Specify a pattern that is to be written to the temporary file and validated for accuracy in<br />
each of the read tests.</p>
<p>-w<br />
当临时文件使用完毕时不删除它们。把它们留在文件系统中。</p>
<p>-W<br />
读或写时锁文件。</p>
<p>-x<br />
关闭“stone-walling”. Stonewalling 是 Iozone内部使用的一种技术。它是在进行吞吐量测试时使用的。程序启动所有线程或进程然后将它们暂停在“壁垒”前。<br />
一旦它们都做好准备工作，它们将被同时释放。当其中任何一个线程或进程完成工作，整个测试就终止了并计算到达这个点时所有I/O的吞吐量。这保证了整个测试进行时所有的进程和线程都是并行的。这个标志位允许取消 stonewalling并看看会发生什么。</p>
<p>-X filename<br />
Use this file for write telemetry information. The file contains  triplets of information:<br />
Byte offset, size of transfer, compute delay in milliseconds.  This option is useful if one has<br />
taken a system call trace of the application that is of interest.  This allows Iozone to replicate the I/O operations that this specific application generates and provide benchmark results for this file behavior.  (if column 1 contains # then the line is a comment)</p>
<p>-y #<br />
设置自动模式下使用的最小块大小(Kbytes) 。也可以通过-y #k ( Kbytes) 或 -y #m ( Mbytes) 或 -y #g ( Gbytes)。设置最大块大小见 –y 。</p>
<p>-Y filename<br />
Use this file for read telemetry information. The file contains triplets of information:<br />
Byte offset, size of transfer, compute delay in milliseconds.  This option is useful if one has<br />
taken a system call trace of the application that is of interest.  This allows Iozone to replicate the I/O operations that this specific application generates and provide benchmark results for this file behavior. (if column 1 contains # then the line is a comment)</p>
<p>-z<br />
Used in conjunction with -a to test all possible record sizes. Normally Iozone omits testing<br />
of small record sizes for very large files when used in full automatic mode.  This option forces<br />
Iozone to include the small record sizes in the automatic tests also.</p>
<p>-Z<br />
启动混合 mmap I/O 和文件 I/O.</p>
<p>-+m filename<br />
Use this file to obtain the configuration information of the clients for cluster testing. The file contains one line for each client. Each line has three fields. The fields are space delimited. A # sign in column zero is a comment line. The first field is the name of the client. The second field is the path, on the client, for the working directory where Iozone will execute. The third field is the path, on the client, for the executable Iozone.<br />
To use this option one must be able to execute commands on the clients without being challenged for a password. Iozone will start remote execution by using “rsh”.</p>
<p>-+u<br />
Enable CPU utilization mode.</p>
<p>-+d<br />
启动诊断模式。在这一模式下每个字节都将被验证。这在怀疑I/O子系统出错时有用。</p>
<p>-+p  percent_read<br />
Set the percentage of the thread/processes that will perform random read testing. Only valid in throughput mode and with more than 1 process/thread.</p>
<p>-+r<br />
Enable O_RSYNC and O_SYNC for all I/O testing.</p>
<p>-+t<br />
启动网络性能测试。需要 -+m</p>
<p>-+A<br />
Enable madvise. 0 = normal, 1=random, 2=sequential, 3=dontneed, 4=willneed.<br />
For use with options that activate mmap() file I/O. See: -B
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/04/07/iozone%e7%9a%84%e4%bd%bf%e7%94%a8%e4%b8%8e%e4%bb%8b%e7%bb%8d-%e8%bd%ac%e8%bd%bd/">iozone的使用与介绍 (转载)</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/04/07/iozone%e7%9a%84%e4%bd%bf%e7%94%a8%e4%b8%8e%e4%bb%8b%e7%bb%8d-%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>合理的利用CPU 资源 taskset (转载)</title>
		<link>http://www.apparitor.info/2011/04/07/%e5%90%88%e7%90%86%e7%9a%84%e5%88%a9%e7%94%a8cpu-%e8%b5%84%e6%ba%90-taskset-%e8%bd%ac%e8%bd%bd/</link>
		<comments>http://www.apparitor.info/2011/04/07/%e5%90%88%e7%90%86%e7%9a%84%e5%88%a9%e7%94%a8cpu-%e8%b5%84%e6%ba%90-taskset-%e8%bd%ac%e8%bd%bd/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 08:00:59 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[taskset]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=297</guid>
		<description><![CDATA[出处： http://www.hiadmin.com/%E5%88%A9%E7%94%A8taskset%E6%9C%89%E6%95%88%E6%8E%A7%E5%88%B6cpu%E8%B5%84%E6%BA%90/ 常常感觉系统资源不够用，一台机子上跑了不下3个比较重要的服务，但是每天我们还要在上面进行个备份压缩等处理，网络长时间传输，这在就很影响本就不够用的系统资源； 这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上，或者是多核的cpu的一颗核心上进行处理，虽然这不一定是最有效的方法，但可以最大程度上利用了有效资源，降低那些不太重要的进程占用cpu资源； 查看系统下cpu信息：#cat /proc/cpuinfo taskset就可以帮我们完成这项工作，而且操作非常简单； 该工具系统默认安装，rpm包名util-linux （我的系统用的是schedutils-1.4.0-2 这个包 ） #taskset &#8211;help taskset (util-linux 2.13-pre7) usage: taskset [options] [mask &#124; cpu-list] [pid &#124; cmd [args...]] set or get the affinity of a process -p, –pid operate on existing given pid -c, –cpu-list display and specify cpus in list format -h, –help display this help]]></description>
			<content:encoded><![CDATA[<p>出处：</p>
<p>http://www.hiadmin.com/%E5%88%A9%E7%94%A8taskset%E6%9C%89%E6%95%88%E6%8E%A7%E5%88%B6cpu%E8%B5%84%E6%BA%90/</p>
<p>常常感觉系统资源不够用，一台机子上跑了不下3个比较重要的服务，但是每天我们还要在上面进行个备份压缩等处理，网络长时间传输，这在就很影响本就不够用的系统资源；</p>
<p>这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上，或者是多核的cpu的一颗核心上进行处理，虽然这不一定是最有效的方法，但可以最大程度上利用了有效资源，降低那些不太重要的进程占用cpu资源；</p>
<p>查看系统下cpu信息：#cat /proc/cpuinfo</p>
<p>taskset就可以帮我们完成这项工作，而且操作非常简单；<br />
<span id="more-297"></span><br />
该工具系统默认安装，rpm包名util-linux （我的系统用的是schedutils-1.4.0-2 这个包 ）<br />
#taskset &#8211;help<br />
taskset (util-linux 2.13-pre7)<br />
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]<br />
set or get the affinity of a process</p>
<p>-p, –pid operate on existing given pid<br />
-c, –cpu-list display and specify cpus in list format<br />
-h, –help display this help<br />
-v, –version output version information</p>
<p>举例：<br />
1、开启一个只用0标记的cpu核心的新进程(job.sh是你的工作脚本)<br />
#taskset -c 0 sh job.sh</p>
<p>2、查找现有的进程号，调整该进程cpu核心使用情况（23328举例用的进程号）<br />
#taskset -pc 0 23328<br />
pid 23328&#8242;s current affinity list: 0-3 #0-3表示使用所有4核进行处理<br />
pid 23328&#8242;s new affinity list: 0 #调整后改为仅适用0标记单核处理</p>
<p>3、可在top中进行负载check</p>
<p>最后你可以在你的工作脚本中加入该指令来合理利用现有的cpu资源；
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/04/07/%e5%90%88%e7%90%86%e7%9a%84%e5%88%a9%e7%94%a8cpu-%e8%b5%84%e6%ba%90-taskset-%e8%bd%ac%e8%bd%bd/">合理的利用CPU 资源 taskset (转载)</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/04/07/%e5%90%88%e7%90%86%e7%9a%84%e5%88%a9%e7%94%a8cpu-%e8%b5%84%e6%ba%90-taskset-%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>squid 对gzip压缩请求的过程 （转贴）</title>
		<link>http://www.apparitor.info/2011/04/06/squid-%e5%af%b9gzip%e5%8e%8b%e7%bc%a9%e8%af%b7%e6%b1%82%e7%9a%84%e8%bf%87%e7%a8%8b-%ef%bc%88%e8%bd%ac%e8%b4%b4%ef%bc%89/</link>
		<comments>http://www.apparitor.info/2011/04/06/squid-%e5%af%b9gzip%e5%8e%8b%e7%bc%a9%e8%af%b7%e6%b1%82%e7%9a%84%e8%bf%87%e7%a8%8b-%ef%bc%88%e8%bd%ac%e8%b4%b4%ef%bc%89/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 07:00:22 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[Squid]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=246</guid>
		<description><![CDATA[squid 对gzip压缩请求的过程 （转贴） 转载：http://squidcn.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&#038;_c=BlogPart&#038;partqs=amonth%3d4%26ayear%3d2008 Squid 能否正确的处理gzip，完全取决于realserver会否发送正确的Vary:头部。一般来说，反向代理环境里，自己能控制realserver。而 采用Apache这样的标准web服务器，可配置mod_deflate让它发送正确的Vary:头部。这个头部的作用，就是指示squid，应该根据客 户端的请求方式不同，返回不同的压缩或非压缩目标。 浏 览器请求squid上的某个目标，假设该目标在squid上有压缩过的缓存，该缓存同时包括一个”Vary:”头部（按照RFC 2616协议，对压缩过的内容Apache必须返回该头部给squid）。Squid会根据缓存里的Vary头部的值和请求头部进行匹配，如果请求头部里 包含了Accept-Encoding相应值，则squid返回压缩过的目标给浏览器。相反，如果请求头部里没有包含Accept-Encoding字段 （通常是http/1.0方式），则squid会将请求转发给realserver。按照标准，Squid不允许发送压缩过的目标拷贝给不接受 Encoding的浏览器。 Squid的请求到了realserver，mod_deflate返回非压缩的内容给Squid。这个响应也包含Vary头部，但不 是压缩的。squid拿到这个响应后，更新自己的缓存（squid的缓存目标存储结构是以url为key的哈希，就是同一个url下只能存储一份 cache目标），并将响应返回给客户端。 下一次如果客户的请求又包含了Accept-Encoding字段，squid会根据缓存目标的Vary头部，再去realserver取一份压缩的内容返回给客户端，并更新自己的缓存。 所以，在上述机制下，squid对gzip的兼容没有问题。 但是，这里有2个明显的问题： 1. 对某个cache住的目标，一个http/1.0请求可能会导致squid强制更新其缓存。但接下来的另一个http/1.1请求又会导致squid再次更新缓存。这就极大的降低了cache命中率。 2. 某些客户端，如IE6及以下，如果发送http/1.0的请求，realserver会返回没有压缩过的内容，同时包含一个Vary:头部。这些客户端不能处理这个头部，结果就导致目标无法下载。这是IE的bug，我们做不了什么。但碰到这种情况，用户会投诉你。 原创文章，转载请注明： 转载自gjw_apparitor 博客 本文链接地址: squid 对gzip压缩请求的过程 （转贴）]]></description>
			<content:encoded><![CDATA[<p>squid 对gzip压缩请求的过程 （转贴）</p>
<p>转载：http://squidcn.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&#038;_c=BlogPart&#038;partqs=amonth%3d4%26ayear%3d2008</p>
<p>Squid 能否正确的处理gzip，完全取决于realserver会否发送正确的Vary:头部。一般来说，反向代理环境里，自己能控制realserver。而 采用Apache这样的标准web服务器，可配置mod_deflate让它发送正确的Vary:头部。这个头部的作用，就是指示squid，应该根据客 户端的请求方式不同，返回不同的压缩或非压缩目标。</p>
<p>浏 览器请求squid上的某个目标，假设该目标在squid上有压缩过的缓存，该缓存同时包括一个”Vary:”头部（按照RFC 2616协议，对压缩过的内容Apache必须返回该头部给squid）。Squid会根据缓存里的Vary头部的值和请求头部进行匹配，如果请求头部里 包含了Accept-Encoding相应值，则squid返回压缩过的目标给浏览器。相反，如果请求头部里没有包含Accept-Encoding字段 （通常是http/1.0方式），则squid会将请求转发给realserver。按照标准，Squid不允许发送压缩过的目标拷贝给不接受 Encoding的浏览器。</p>
<p>Squid的请求到了realserver，mod_deflate返回非压缩的内容给Squid。这个响应也包含Vary头部，但不 是压缩的。squid拿到这个响应后，更新自己的缓存（squid的缓存目标存储结构是以url为key的哈希，就是同一个url下只能存储一份 cache目标），并将响应返回给客户端。<br />
下一次如果客户的请求又包含了Accept-Encoding字段，squid会根据缓存目标的Vary头部，再去realserver取一份压缩的内容返回给客户端，并更新自己的缓存。</p>
<p>所以，在上述机制下，squid对gzip的兼容没有问题。<br />
但是，这里有2个明显的问题：</p>
<p>1. 对某个cache住的目标，一个http/1.0请求可能会导致squid强制更新其缓存。但接下来的另一个http/1.1请求又会导致squid再次更新缓存。这就极大的降低了cache命中率。<br />
2. 某些客户端，如IE6及以下，如果发送http/1.0的请求，realserver会返回没有压缩过的内容，同时包含一个Vary:头部。这些客户端不能处理这个头部，结果就导致目标无法下载。这是IE的bug，我们做不了什么。但碰到这种情况，用户会投诉你。
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/04/06/squid-%e5%af%b9gzip%e5%8e%8b%e7%bc%a9%e8%af%b7%e6%b1%82%e7%9a%84%e8%bf%87%e7%a8%8b-%ef%bc%88%e8%bd%ac%e8%b4%b4%ef%bc%89/">squid 对gzip压缩请求的过程 （转贴）</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/04/06/squid-%e5%af%b9gzip%e5%8e%8b%e7%bc%a9%e8%af%b7%e6%b1%82%e7%9a%84%e8%bf%87%e7%a8%8b-%ef%bc%88%e8%bd%ac%e8%b4%b4%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化Squid的几个基本因素 （转载）</title>
		<link>http://www.apparitor.info/2011/04/06/%e4%bc%98%e5%8c%96squid%e7%9a%84%e5%87%a0%e4%b8%aa%e5%9f%ba%e6%9c%ac%e5%9b%a0%e7%b4%a0-%ef%bc%88%e8%bd%ac%e8%bd%bd%ef%bc%89/</link>
		<comments>http://www.apparitor.info/2011/04/06/%e4%bc%98%e5%8c%96squid%e7%9a%84%e5%87%a0%e4%b8%aa%e5%9f%ba%e6%9c%ac%e5%9b%a0%e7%b4%a0-%ef%bc%88%e8%bd%ac%e8%bd%bd%ef%bc%89/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 06:59:46 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[Squid]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=244</guid>
		<description><![CDATA[优化Squid的几个基本因素 （转载） 转载：http://squidcn.spaces.live.com/blog/cns!B49104BB65206A10!120.entry 优化Squid的几个基本因素 1. 文件句柄数,这个影响squid的基本处理能力.在编译squid时加上&#8211;with-maxfd=N (squid2.6及以后),N表示一个足够大的整数.另外,在运行squid之前,记得用ulimit调整进程最大文件描述符.squid最终可使用多 少文件句柄,请见squidclient的输出,如squidclient -p80 -h127.0.0.1 mgr:info,最后那段里有关于文件句柄的描述. 2. 如果在Linux下使用squid,那么尽量使用epoll.squid是单进程多路复用的,epoll的效率比select好得多. 3. aufs的存储机制比默认的ufs要好,aufs的a表示异步,即squid采用异步线程处理文件存储.对繁忙的系统,这个线程数可调大一点,如256. 可观察cache.log,如果经常提示队列繁忙,就该调大该值.aufs的支持和线程数调整,需要在编译squid时执行. 4. 许多人的使用经验表明,对小文件,使用GDSF的cache选择算法比默认的lru算法效率要高. 5. 如果squid只缓存小文件,那么cache目录的磁盘文件系统选用reiserfs比ext好.cache目录最好位于单独的磁盘分区. 6. 当然,最好是没有目标交换到磁盘.观察squidinfo的输出,”Request Memory Hit Ratios”越高越好,与之相反的是”Request Disk Hit Ratios”越低越好.可适当调大maximum_object_size_in_memory的值.如果缓存目标的总size小于 cache_mem,那么就应该全部从内存响应,磁盘命中率为0. 7. 对繁忙的系统,可关闭access.log. 原创文章，转载请注明： 转载自gjw_apparitor 博客 本文链接地址: 优化Squid的几个基本因素 （转载）]]></description>
			<content:encoded><![CDATA[<p>优化Squid的几个基本因素 （转载）</p>
<p>转载：http://squidcn.spaces.live.com/blog/cns!B49104BB65206A10!120.entry</p>
<p>优化Squid的几个基本因素</p>
<p>1. 文件句柄数,这个影响squid的基本处理能力.在编译squid时加上&#8211;with-maxfd=N (squid2.6及以后),N表示一个足够大的整数.另外,在运行squid之前,记得用ulimit调整进程最大文件描述符.squid最终可使用多 少文件句柄,请见squidclient的输出,如squidclient -p80 -h127.0.0.1 mgr:info,最后那段里有关于文件句柄的描述.</p>
<p>2. 如果在Linux下使用squid,那么尽量使用epoll.squid是单进程多路复用的,epoll的效率比select好得多.</p>
<p><span id="more-244"></span>3. aufs的存储机制比默认的ufs要好,aufs的a表示异步,即squid采用异步线程处理文件存储.对繁忙的系统,这个线程数可调大一点,如256. 可观察cache.log,如果经常提示队列繁忙,就该调大该值.aufs的支持和线程数调整,需要在编译squid时执行.</p>
<p>4. 许多人的使用经验表明,对小文件,使用GDSF的cache选择算法比默认的lru算法效率要高.</p>
<p>5. 如果squid只缓存小文件,那么cache目录的磁盘文件系统选用reiserfs比ext好.cache目录最好位于单独的磁盘分区.</p>
<p>6. 当然,最好是没有目标交换到磁盘.观察squidinfo的输出,”Request Memory Hit Ratios”越高越好,与之相反的是”Request Disk Hit Ratios”越低越好.可适当调大maximum_object_size_in_memory的值.如果缓存目标的总size小于 cache_mem,那么就应该全部从内存响应,磁盘命中率为0.</p>
<p>7. 对繁忙的系统,可关闭access.log.
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/04/06/%e4%bc%98%e5%8c%96squid%e7%9a%84%e5%87%a0%e4%b8%aa%e5%9f%ba%e6%9c%ac%e5%9b%a0%e7%b4%a0-%ef%bc%88%e8%bd%ac%e8%bd%bd%ef%bc%89/">优化Squid的几个基本因素 （转载）</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/04/06/%e4%bc%98%e5%8c%96squid%e7%9a%84%e5%87%a0%e4%b8%aa%e5%9f%ba%e6%9c%ac%e5%9b%a0%e7%b4%a0-%ef%bc%88%e8%bd%ac%e8%bd%bd%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>squid TIME_WAIT值过高引起的服务器被拖死 (转)</title>
		<link>http://www.apparitor.info/2011/04/06/233/</link>
		<comments>http://www.apparitor.info/2011/04/06/233/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 06:52:51 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[sysctl]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=233</guid>
		<description><![CDATA[squid TIME_WAIT值过高引起的服务器被拖死 (转) 查看TCP的连接状态值: # netstat -n &#124; awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' vi /etc/sysctl.conf 添加如下行: net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_max_tw_buckets = 3000 # sysctl -p 使其生效 备注: 根据TCP协议，主动发起关闭的一方，会进入TIME_WAIT状态，持续2*MSL(Max Segment Lifetime)，缺省为240秒，在这个post中简洁的介绍了为什么需要这个状态。 值得一说的是，对于基于TCP的HTTP协议，关闭TCP连接的是Server端，这样，Server端会进入TIME_WAIT状态，可想而知， 对于访问量大的Web Server，会存在大量的TIME_WAIT状态，假如server一秒钟接收1000个请求，那么就会积压240*1000=240，000个 TIME_WAIT的记录，维护这些状态给Server带来负担。当然现代操作系统都会用快速的查找算法来管理这些TIME_WAIT，所以对于新的 TCP连接请求，判断是否hit中一个TIME_WAIT不会太费时间，但是有这么多状态要维护总是不好。 HTTP协议1.1版规定default行为是Keep-Alive，也就是会重用TCP连接传输多个request/response，一个主要原因就是发现了这个问题。 TCP TIME_WAIT套接字数量非常大，服务器很容易被拖死。通过修改Linux内核参数，可以减少Squid服务器的TIME_WAIT套接字数量。 # vi /etc/sysctl.conf net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200]]></description>
			<content:encoded><![CDATA[<p>squid TIME_WAIT值过高引起的服务器被拖死 (转)</p>
<p>查看TCP的连接状态值:</p>
<pre># netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'</pre>
<pre>vi /etc/sysctl.conf
添加如下行:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_tw_buckets = 3000</pre>
<p># sysctl -p 使其生效<br />
<span id="more-233"></span>备注:<br />
根据TCP协议，主动发起关闭的一方，会进入TIME_WAIT状态，持续2*MSL(Max Segment Lifetime)，缺省为240秒，在这个post中简洁的介绍了为什么需要这个状态。<br />
值得一说的是，对于基于TCP的HTTP协议，关闭TCP连接的是Server端，这样，Server端会进入TIME_WAIT状态，可想而知， 对于访问量大的Web Server，会存在大量的TIME_WAIT状态，假如server一秒钟接收1000个请求，那么就会积压240*1000=240，000个 TIME_WAIT的记录，维护这些状态给Server带来负担。当然现代操作系统都会用快速的查找算法来管理这些TIME_WAIT，所以对于新的 TCP连接请求，判断是否hit中一个TIME_WAIT不会太费时间，但是有这么多状态要维护总是不好。<br />
HTTP协议1.1版规定default行为是Keep-Alive，也就是会重用TCP连接传输多个request/response，一个主要原因就是发现了这个问题。<br />
TCP TIME_WAIT套接字数量非常大，服务器很容易被拖死。通过修改Linux内核参数，可以减少Squid服务器的TIME_WAIT套接字数量。</p>
<pre># vi /etc/sysctl.conf

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000</pre>
<p>说明：<br />
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时，启用cookies来处理，可防范少量SYN攻击，默认为0，表示关闭；<br />
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接，默认为0，表示关闭；<br />
net.ipv4.tcp_synack_retries = 3  表示SYN从式的次数。默认是5次，3分钟。<br />
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收，默认为0，表示关闭。<br />
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭，这个参数决定了它保持在FIN-WAIT-2状态的时间。<br />
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候，TCP发送keepalive消息的频度。缺省是2小时，改为20分钟。<br />
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小：32768到61000，改为1024到65000。<br />
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度，默认为1024，加大队列长度为8192，可以容纳更多等待连接的网络连接数。<br />
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量，如果超过这个数字，TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000，改 为5000。对于Apache、Nginx等服务器，上几行的参数可以很好地减少TIME_WAIT套接字数量，但是对于Squid，效果却不大。此项参 数可以控制TIME_WAIT套接字的最大数量，避免Squid服务器被大量的TIME_WAIT套接字拖死。</p>
<p>执行以下命令使配置生效：<br />
# /sbin/sysctl -p
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/04/06/233/">squid TIME_WAIT值过高引起的服务器被拖死 (转)</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/04/06/233/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Awk学习笔记(转载)</title>
		<link>http://www.apparitor.info/2011/04/06/awk%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e8%bd%ac%e8%bd%bd/</link>
		<comments>http://www.apparitor.info/2011/04/06/awk%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e8%bd%ac%e8%bd%bd/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 06:07:22 +0000</pubDate>
		<dc:creator>gjw_apparitor</dc:creator>
				<category><![CDATA[转载]]></category>
		<category><![CDATA[awk]]></category>

		<guid isPermaLink="false">http://www.apparitor.info/?p=196</guid>
		<description><![CDATA[Awk学习笔记 整理：Jims of 肥肥世家 &#60;jims.yang@gmail.com&#62; Copyright © 2004 本文遵从GPL协议，欢迎转载、修改、散布。 第一次发布时间:2004年8月6日 Table of Contents 1. awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项 3. 模式和操作 3.1. 模式 3.2. 操作 4. awk的环境变量 5. awk运算符 6. 记录和域 6.1. 记录 6.2. 域 6.3. 域分隔符 7. gawk专用正则表达式元字符 8. POSIX字符集 9. 匹配操作符(~) 10. 比较表达式 11. 范围模板 12. 一个验证passwd文件有效性的例子 13. 几个实例 14. awk编程]]></description>
			<content:encoded><![CDATA[<p>Awk学习笔记</p>
<p>整理：Jims of 肥肥世家</p>
<p>&lt;jims.yang@gmail.com&gt;</p>
<p>Copyright © 2004 本文遵从GPL协议，欢迎转载、修改、散布。</p>
<p>第一次发布时间:2004年8月6日</p>
<p>Table of Contents</p>
<p>1. awk简介<br />
2. awk命令格式和选项<br />
2.1. awk的语法有两种形式<br />
2.2. 命令选项<br />
3. 模式和操作<br />
3.1. 模式<br />
3.2. 操作<br />
4. awk的环境变量<br />
5. awk运算符<br />
6. 记录和域<br />
6.1. 记录<br />
6.2. 域<br />
<span id="more-196"></span>6.3. 域分隔符<br />
7. gawk专用正则表达式元字符<br />
8. POSIX字符集<br />
9. 匹配操作符(~)<br />
10. 比较表达式<br />
11. 范围模板<br />
12. 一个验证passwd文件有效性的例子<br />
13. 几个实例<br />
14. awk编程<br />
14.1. 变量<br />
14.2. BEGIN模块<br />
14.3. END模块<br />
14.4. 重定向和管道<br />
14.5. 条件语句<br />
14.6. 循环<br />
14.7. 数组<br />
14.8. awk的内建函数<br />
15. How-to<br />
1. awk简介</p>
<p>awk 是一种编程语言，用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件，或其它命令的输出。它支持用户自定义函数和 动态正则表达式等先进功能，是linux/unix下的一个强大编程工具。它在命令行中使用，但更多是作为脚本来使用。awk的处理文本和数据的方式是这 样的，它逐行扫描文件，从第一行到最后一行，寻找匹配的特定模式的行，并在这些行上进行你想要的操作。如果没有指定处理动作，则把匹配的行显示到标准输出 (屏幕)，如果没有指定模式，则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人，分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本，它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GUN的gawk为例的，在 linux系统中已把awk链接到gawk，所以下面全部以awk进行介绍。</p>
<p>2. awk命令格式和选项</p>
<p>2.1. awk的语法有两种形式</p>
<p>awk [options] &#8216;script&#8217; var=value file(s)</p>
<p>awk [options] -f scriptfile var=value file(s)</p>
<p>2.2. 命令选项</p>
<p>-F fs or &#8211;field-separator fs<br />
指定输入文件折分隔符，fs是一个字符串或者是一个正则表达式，如-F:。</p>
<p>-v var=value or &#8211;asign var=value<br />
赋值一个用户定义变量。</p>
<p>-f scripfile or &#8211;file scriptfile<br />
从脚本文件中读取awk命令。</p>
<p>-mf nnn and -mr nnn<br />
对nnn值设置内在限制，-mf选项限制分配给nnn的最大块数目；-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能，在标准awk中不适用。</p>
<p>-W compact or &#8211;compat, -W traditional or &#8211;traditional<br />
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样，所有的awk扩展都被忽略。</p>
<p>-W copyleft or &#8211;copyleft, -W copyright or &#8211;copyright<br />
打印简短的版权信息。</p>
<p>-W help or &#8211;help, -W usage or &#8211;usage<br />
打印全部awk选项和每个选项的简短说明。</p>
<p>-W lint or &#8211;lint<br />
打印不能向传统unix平台移植的结构的警告。</p>
<p>-W lint-old or &#8211;lint-old<br />
打印关于不能向传统unix平台移植的结构的警告。</p>
<p>-W posix<br />
打开兼容模式。但有以下限制，不识别：\x、函数关键字、func、换码序列以及当fs是一个空格时，将新行作为一个域分隔符；操作符**和**=不能代替^和^=；fflush无效。</p>
<p>-W re-interval or &#8211;re-inerval<br />
允许间隔正则表达式的使用，参考(grep中的Posix字符类)，如括号表达式[[:alpha:]]。</p>
<p>-W source program-text or &#8211;source program-text<br />
使用program-text作为源代码，可与-f命令混用。</p>
<p>-W version or &#8211;version<br />
打印bug报告信息的版本。</p>
<p>3. 模式和操作</p>
<p>awk脚本是由模式和操作组成的：<br />
pattern {action} 如$ awk &#8216;/root/&#8217; test，或$ awk &#8216;$3 &lt; 100&#8242; test。</p>
<p>两者是可选的，如果没有模式，则action应用到全部记录，如果没有action，则输出匹配全部记录。默认情况下，每一个输入行都是一条记录，但用户可通过RS变量指定不同的分隔符进行分隔。</p>
<p>3.1. 模式</p>
<p>模式可以是以下任意一个：</p>
<p>/正则表达式/：使用通配符的扩展集。</p>
<p>关系表达式：可以用下面运算符表中的关系运算符进行操作，可以是字符串或数字的比较，如$2&gt;%1选择第二个字段比第一个字段长的行。</p>
<p>模式匹配表达式：用运算符~(匹配)和~!(不匹配)。</p>
<p>模式，模式：指定一个行的范围。该语法不能包括BEGIN和END模式。</p>
<p>BEGIN：让用户指定在第一条输入记录被处理之前所发生的动作，通常可在这里设置全局变量。</p>
<p>END：让用户在最后一条输入记录被读取之后发生的动作。</p>
<p>3.2. 操作</p>
<p>操作由一人或多个命令、函数、表达式组成，之间由换行符或分号隔开，并位于大括号内。主要有四部份：</p>
<p>变量或数组赋值</p>
<p>输出命令</p>
<p>内置函数</p>
<p>控制流命令</p>
<p>4. awk的环境变量</p>
<p>Table 1. awk的环境变量</p>
<p>变量 描述<br />
$n 当前记录的第n个字段，字段间由FS分隔。<br />
$0 完整的输入记录。<br />
ARGC 命令行参数的数目。<br />
ARGIND 命令行中当前文件的位置(从0开始算)。<br />
ARGV 包含命令行参数的数组。<br />
CONVFMT 数字转换格式(默认值为%.6g)<br />
ENVIRON 环境变量关联数组。<br />
ERRNO 最后一个系统错误的描述。<br />
FIELDWIDTHS 字段宽度列表(用空格键分隔)。<br />
FILENAME 当前文件名。<br />
FNR 同NR，但相对于当前文件。<br />
FS 字段分隔符(默认是任何空格)。<br />
IGNORECASE 如果为真，则进行忽略大小写的匹配。<br />
NF 当前记录中的字段数。<br />
NR 当前记录数。<br />
OFMT 数字的输出格式(默认值是%.6g)。<br />
OFS 输出字段分隔符(默认值是一个空格)。<br />
ORS 输出记录分隔符(默认值是一个换行符)。<br />
RLENGTH 由match函数所匹配的字符串的长度。<br />
RS 记录分隔符(默认是一个换行符)。<br />
RSTART 由match函数所匹配的字符串的第一个位置。<br />
SUBSEP 数组下标分隔符(默认值是\034)。<br />
5. awk运算符</p>
<p>Table 2. 运算符</p>
<p>运算符 描述<br />
= += -= *= /= %= ^= **= 赋值<br />
?: C条件表达式<br />
|| 逻辑或<br />
&amp;&amp; 逻辑与<br />
~ ~! 匹配正则表达式和不匹配正则表达式<br />
&lt; &lt;= &gt; &gt;= != == 关系运算符<br />
空格 连接<br />
+ &#8211; 加，减<br />
* / &amp; 乘，除与求余<br />
+ &#8211; ! 一元加，减和逻辑非<br />
^ *** 求幂<br />
++ &#8212; 增加或减少，作为前缀或后缀<br />
$ 字段引用<br />
in 数组成员<br />
6. 记录和域</p>
<p>6.1. 记录</p>
<p>awk把每一个以换行符结束的行称为一个记录。</p>
<p>记录分隔符：默认的输入和输出的分隔符都是回车，保存在内建变量ORS和RS中。</p>
<p>$0变量：它指的是整条记录。如$ awk &#8216;{print $0}&#8217; test将输出test文件中的所有记录。</p>
<p>变量NR：一个计数器，每处理完一条记录，NR的值就增加1。如$ awk &#8216;{print NR,$0}&#8217; test将输出test文件中所有记录，并在记录前显示记录号。</p>
<p>6.2. 域</p>
<p>记录中每个单词称做“域”，默认情况下以空格或tab分隔。awk可跟踪域的个数，并在内建变量NF中保存该值。如$ awk &#8216;{print $1,$3}&#8217; test将打印test文件中第一和第三个以空格分开的列(域)。</p>
<p>6.3. 域分隔符</p>
<p>内建变量FS保存输入域分隔符的值，默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: &#8216;{print $1,$5}&#8217; test将打印以冒号为分隔符的第一，第五列的内容。</p>
<p>可以同时使用多个域分隔符，这时应该把分隔符写成放到方括号中，如$awk -F&#8217;[:\t]&#8216; &#8216;{print $1,$3}&#8217; test，表示以空格、冒号和tab作为分隔符。</p>
<p>输出域的分隔符默认是一个空格，保存在OFS中。如$ awk -F: &#8216;{print $1,$5}&#8217; test，$1和$5间的逗号就是OFS的值。</p>
<p>7. gawk专用正则表达式元字符</p>
<p>一般通用的元字符集就不讲了，可参考我的Sed和Grep学习笔记。以下几个是gawk专用的，不适合unix版本的awk。</p>
<p>\Y<br />
匹配一个单词开头或者末尾的空字符串。</p>
<p>\B<br />
匹配单词内的空字符串。</p>
<p>\&lt;<br />
匹配一个单词的开头的空字符串，锚定开始。</p>
<p>\&gt;<br />
匹配一个单词的末尾的空字符串，锚定末尾。</p>
<p>\w<br />
匹配一个字母数字组成的单词。</p>
<p>\W<br />
匹配一个非字母数字组成的单词。</p>
<p>\‘<br />
匹配字符串开头的一个空字符串。</p>
<p>\&#8217;<br />
匹配字符串末尾的一个空字符串。</p>
<p>8. POSIX字符集</p>
<p>可参考我的Grep学习笔记</p>
<p>9. 匹配操作符(~)</p>
<p>用来在记录或者域内匹配正则表达式。如$ awk &#8216;$1 ~/^root/&#8217; test将显示test文件第一列中以root开头的行。</p>
<p>10. 比较表达式</p>
<p>conditional expression1 ? expression2: expression3，例如：$ awk &#8216;{max = {$1 &gt; $3} ? $1: $3: print max}&#8217; test。如果第一个域大于第三个域，$1就赋值给max，否则$3就赋值给max。</p>
<p>$ awk &#8216;$1 + $2 &lt; 100&#8242; test。如果第一和第二个域相加大于100，则打印这些行。</p>
<p>$ awk &#8216;$1 &gt; 5 &amp;&amp; $2 &lt; 10&#8242; test,如果第一个域大于5，并且第二个域小于10，则打印这些行。</p>
<p>11. 范围模板</p>
<p>范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现，则匹配到开头或末尾。如$ awk &#8216;/root/,/mysql/&#8217; test将显示root第一次出现到mysql第一次出现之间的所有行。</p>
<p>12. 一个验证passwd文件有效性的例子</p>
<p>$ cat /etc/passwd | awk -F: &#8216;\<br />
NF != 7{\<br />
printf(“line %d,does not have 7 fields:%s\n”,NR,$0)}\<br />
$1 !~ /[A-Za-z0-9]/{printf(“line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\<br />
$2 == “*” {printf(“line %d, no password: %s\n”,NR,$0)}&#8217;</p>
<p>cat把结果输出给awk，awk把域之间的分隔符设为冒号。</p>
<p>如果域的数量(NF)不等于7，就执行下面的程序。</p>
<p>printf打印字符串”line ?? does not have 7 fields”，并显示该条记录。</p>
<p>如果第一个域没有包含任何字母和数字，printf打印“no alpha and numeric user id” ，并显示记录数和记录。</p>
<p>如果第二个域是一个星号，就打印字符串“no passwd”，紧跟着显示记录数和记录本身。</p>
<p>13. 几个实例</p>
<p>$ awk &#8216;/^(no|so)/&#8217; test&#8212;&#8211;打印所有以模式no或so开头的行。</p>
<p>$ awk &#8216;/^[ns]/{print $1}&#8217; test&#8212;&#8211;如果记录以n或s开头，就打印这个记录。</p>
<p>$ awk &#8216;$1 ~/[0-9][0-9]$/(print $1}&#8217; test&#8212;&#8211;如果第一个域以两个数字结束就打印这个记录。</p>
<p>$ awk &#8216;$1 == 100 || $2 &lt; 50&#8242; test&#8212;&#8211;如果第一个或等于100或者第二个域小于50，则打印该行。</p>
<p>$ awk &#8216;$1 != 10&#8242; test&#8212;&#8211;如果第一个域不等于10就打印该行。</p>
<p>$ awk &#8216;/test/{print $1 + 10}&#8217; test&#8212;&#8211;如果记录包含正则表达式test，则第一个域加10并打印出来。</p>
<p>$ awk &#8216;{print ($1 &gt; 5 ? “ok “$1: “error”$1)}&#8217; test&#8212;&#8211;如果第一个域大于5则打印问号后面的表达式值，否则打印冒号后面的表达式值。</p>
<p>$ awk &#8216;/^root/,/^mysql/&#8217; test&#8212;-打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记 录，则继续打印直到下一个以正则表达式mysql开头的记录为止，或到文件末尾。</p>
<p>14. awk编程</p>
<p>14.1. 变量</p>
<p>在awk中，变量不需要定义就可以直接使用，变量类型可以是数字或字符串。</p>
<p>赋 值格式：Variable = expression，如$ awk &#8216;$1 ~/test/{count = $2 + $3; print count}&#8217; test,上式的作用是,awk先扫描第一个域，一旦test匹配，就把第二个域的值加上第三个域的值，并把结果赋值给变量count，最后打印出来。</p>
<p>awk 可以在命令行中给变量赋值，然后将这个变量传输给awk脚本。如$ awk -F: -f awkscript month=4 year=2004 test，上式的month和year都是自定义变量，分别被赋值为4和2004。在awk脚本中，这些变量使用起来就象是在脚本中建立的一样。注意，如 果参数前面出现test，那么在BEGIN语句中的变量就不能被使用。</p>
<p>域变量也可被赋值和修改，如$ awk &#8216;{$2 = 100 + $1; print }&#8217; test,上式表示，如果第二个域不存在，awk将计算表达式100加$1的值，并将其赋值给$2，如果第二个域存在，则用表达式的值覆盖$2原来的值。 再例如：$ awk &#8216;$1 == “root”{$1 =”test”;print}&#8217; test，如果第一个域的值是“root”，则把它赋值为“test”，注意，字符串一定要用双引号。</p>
<p>内建变量的使用。 变量列表在前面已列出，现在举个例子说明一下。$ awk -F: &#8216;{IGNORECASE=1; $1 == “MARY”{print NR,$1,$2,$NF}&#8217;test，把IGNORECASE设为1代表忽略大小写，打印第一个域是mary的记录数、第一个域、第二个域和最后一个 域。</p>
<p>14.2. BEGIN模块</p>
<p>BEGIN 模块后紧跟着动作块，这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值，如OFS, RS和FS等，以及打印标题。如：$ awk &#8216;BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示，在处理输入文件以前，域分隔符(FS)被设为冒号，输出文件分隔符(OFS)被设置为制表符，输出记录分隔符(ORS)被设置为两个 换行符。$ awk &#8216;BEGIN{print “TITLE TEST”}只打印标题。</p>
<p>14.3. END模块</p>
<p>END不匹配任何的输入文件，但是执行动作块中的所有动作，它在整个输入文件处理完成后被执行。如$ awk &#8216;END{print “The number of records is” NR}&#8217; test，上式将打印所有被处理的记录数。</p>
<p>14.4. 重定向和管道</p>
<p>awk 可使用shell的重定向符进行重定向输出，如：$ awk &#8216;$1 = 100 {print $1 &gt; “output_file” }&#8217; test。上式表示如果第一个域的值等于100，则把它输出到output_file中。也可以用&gt;&gt;来重定向输出，但不清空文件，只做追加 操作。</p>
<p>输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件 获得输入。它负责从输入获得下一行的内容，并给NF,NR和FNR等内建变量赋值。如果得到一条记录，getline函数返回1，如果到达文件的末尾就返 回0，如果出现错误，例如打开文件失败，就返回-1。如：</p>
<p>$ awk &#8216;BEGIN{ “date” | getline d; print d}&#8217; test。执行linux的date命令，并通过管道输出给getline，然后再把输出赋值给自定义变量d，并打印它。</p>
<p>$ awk &#8216;BEGIN{“date” | getline d; split(d,mon); print mon[2]}&#8217; test。执行shell的date命令，并通过管道输出给getline，然后getline从管道中读取并将输入赋值给d，split函数把变量d转 化成数组mon，然后打印数组mon的第二个元素。</p>
<p>$ awk &#8216;BEGIN{while( “ls” | getline) print}&#8217;，命令ls的输出传递给geline作为输入，循环使getline从ls的输出中读取一行，并把它打印到屏幕。这里没有输入文件，因为 BEGIN块在打开输入文件前执行，所以可以忽略输入文件。</p>
<p>$ awk &#8216;BEGIN{printf “What is your name?”; getline name &lt; “/dev/tty” } $1 ~name {print “Found” name on line “, NR “.”} END{print “See you,” name “.”} test。在屏幕上打印”What is your name?”,并等待用户应答。当一行输入完毕后，getline函数从终端接收该行输入，并把它储存在自定义变量name中。如果第一个域匹配变量 name的值，print函数就被执行，END块打印See you和name的值。</p>
<p>$ awk &#8216;BEGIN{while (getline &lt; “/etc/passwd” &gt; 0) lc++; print lc}&#8217;。awk将逐行读取文件/etc/passwd的内容，在到达文件末尾前，计数器lc一直增加，当到末尾时，打印lc的值。注意，如果文件不存 在，getline返回-1，如果到达文件的末尾就返回0，如果读到一行，就返回1，所以命令 while (getline &lt; “/etc/passwd”)在文件不存在的情况下将陷入无限循环，因为返回-1表示逻辑真。</p>
<p>可以在awk中打开一个管 道，且同一时刻只能有一个管道存在。通过close()可关闭管道。如：$ awk &#8216;{print $1, $2 | “sort” }&#8217; test END {close(“sort”)}。awd把print语句的输出通过管道作为linux命令sort的输入,END块执行关闭管道操作。</p>
<p>system函数可以在awk中执行linux的命令。如：$ awk &#8216;BEGIN{system(“clear”)&#8217;。</p>
<p>fflush函数用以刷新输出缓冲区，如果没有参数，就刷新标准输出的缓冲区，如果以空字符串为参数，如fflush(“”),则刷新所有文件和管道的输出缓冲区。</p>
<p>14.5. 条件语句</p>
<p>awk中的条件语句是从C语言中借鉴过来的，可控制程序的流程。</p>
<p>14.5.1. if语句</p>
<p>格式：<br />
{if (expression){<br />
statement; statement; &#8230;<br />
}<br />
}<br />
$ awk &#8216;{if ($1 &lt;$2) print $2 “too high”}&#8217; test。如果第一个域小于第二个域则打印。</p>
<p>$ awk &#8216;{if ($1 &lt; $2) {count++; print “ok”}}&#8217; test.如果第一个域小于第二个域，则count加一，并打印ok。</p>
<p>14.5.2. if/else语句，用于双重判断。</p>
<p>格式：<br />
{if (expression){<br />
statement; statement; &#8230;<br />
}<br />
else{<br />
statement; statement; &#8230;<br />
}<br />
}<br />
$ awk &#8216;{if ($1 &gt; 100) print $1 “bad” ; else print “ok”}&#8217; test。如果$1大于100则打印$1 bad,否则打印ok。</p>
<p>$ awk &#8216;{if ($1 &gt; 100){ count++; print $1} else {count&#8211;; print $2}&#8217; test。如果$1大于100，则count加一，并打印$1，否则count减一，并打印$1。</p>
<p>14.5.3. if/else else if语句，用于多重判断。</p>
<p>格式：<br />
{if (expression){<br />
statement; statement; &#8230;<br />
}<br />
else if (expression){<br />
statement; statement; &#8230;<br />
}<br />
else if (expression){<br />
statement; statement; &#8230;<br />
}<br />
else {<br />
statement; statement; &#8230;<br />
}<br />
}<br />
14.6. 循环</p>
<p>awk有三种循环:while循环；for循环；special for循环。</p>
<p>$ awk &#8216;{ i = 1; while ( i &lt;= NF ) { print NF,$i; i++}}&#8217; test。变量的初始值为1，若i小于可等于NF(记录中域的个数),则执行打印语句，且i增加1。直到i的值大于NF.</p>
<p>$ awk &#8216;{for (i = 1; i&lt;NF; i++) print NF,$i}&#8217; test。作用同上。</p>
<p>breadkcontinue语句。break用于在满足条件的情况下跳出循环；continue用于在满足条件的情况下忽略后面的语句，直接返回循环的顶端。如：</p>
<p>{for ( x=3; x&lt;=NF; x++)<br />
if ($x&lt;0){print “Bottomed out!”; break}}<br />
{for ( x=3; x&lt;=NF; x++)<br />
if ($x==0){print “Get next item”; continue}}</p>
<p>next语句从输入文件中读取一行，然后从头开始执行awk脚本。如：</p>
<p>{if ($1 ~/test/){next}<br />
else {print}<br />
}</p>
<p>exit语句用于结束awk程序，但不会略过END块。退出状态为0代表成功，非零值表示出错。</p>
<p>14.7. 数组</p>
<p>awk中的数组的下标可以是数字和字母，称为关联数组。</p>
<p>14.7.1. 下标与关联数组</p>
<p>用 变量作为数组下标。如：$ awk {name[x++]=$2};END{for(i=0;i&lt;NR;i++) print i,name[i]}&#8217; test。数组name中的下标是一个自定义变量x，awk初始化x的值为0，在每次使用后增加1。第二个域的值被赋给name数组的各个元素。在END 模块中，for循环被用于循环整个数组，从下标为0的元素开始，打印那些存储在数组中的值。因为下标是关健字，所以它不一定从0开始，可以从任何值开始。</p>
<p>special for循环用于读取关联数组中的元素。格式如下：</p>
<p>{for (item in arrayname){<br />
print arrayname[item]<br />
}<br />
}<br />
$ awk &#8216;/^tom/{name[NR]=$1}; END{for(i in name){print name[i]}}&#8217; test。打印有值的数组元素。打印的顺序是随机的。<br />
用字符串作为下标。如：count["test"]</p>
<p>用 域值作为数组的下标。一种新的for循环方式，for (index_value in array) statement。如:$ awk &#8216;{count[$1]++} END{for(name in count) print name,count[name]}&#8217; test。该语句将打印$1中字符串出现的次数。它首先以第一个域作数组count的下标，第一个域变化，索引就变化。</p>
<p>delete 函数用于删除数组元素。如：$ awk &#8216;{line[x++]=$1} END{for(x in line) delete(line[x])}&#8217; test。分配给数组line的是第一个域的值，所有记录处理完成后，special for循环将删除每一个元素。</p>
<p>14.8. awk的内建函数</p>
<p>14.8.1. 字符串函数</p>
<p>sub函数匹配记录中最大、最靠左边的子字符串的正则表达式，并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下：</p>
<p>sub (regular expression, substitution string):<br />
sub (regular expression, substitution string, target string)<br />
实例：</p>
<p>$ awk &#8216;{ sub(/test/, “mytest”); print }&#8217; testfile<br />
$ awk &#8216;{ sub(/test/, “mytest”); $1}; print }&#8217; testfile<br />
第一个例子在整个记录中匹配，替换只发生在第一次匹配发生的时候。如要在整个文件中进行匹配需要用到gsub</p>
<p>第二个例子在整个记录的第一个域中进行匹配，替换只发生在第一次匹配发生的时候。</p>
<p>gsub函数作用如sub，但它在整个文档中进行匹配。格式如下：</p>
<p>gsub (regular expression, substitution string)<br />
gsub (regular expression, substitution string, target string)<br />
实例：</p>
<p>$ awk &#8216;{ gsub(/test/, “mytest”); print }&#8217; testfile<br />
$ awk &#8216;{ gsub(/test/, “mytest”), $1 }; print }&#8217; testfile<br />
第一个例子在整个文档中匹配test，匹配的都被替换成mytest。</p>
<p>第二个例子在整个文档的第一个域中匹配，所有匹配的都被替换成mytest。</p>
<p>index函数返回子字符串第一次被匹配的位置，偏移量从位置1开始。格式如下：</p>
<p>index(string, substring)<br />
实例：</p>
<p>$ awk &#8216;{ print index(“test”, “mytest”) }&#8217; testfile<br />
实例返回test在mytest的位置，结果应该是3。</p>
<p>length函数返回记录的字符数。格式如下：</p>
<p>length( string )<br />
length<br />
实例：</p>
<p>$ awk &#8216;{ print length( “test” ) }&#8217;<br />
$ awk &#8216;{ print length }&#8217; testfile<br />
第一个实例返回test字符串的长度。</p>
<p>第二个实例返回testfile文件中第条记录的字符数。</p>
<p>substr函数返回从位置1开始的子字符串，如果指定长度超过实际长度，就返回整个字符串。格式如下：</p>
<p>substr( string, starting position )<br />
substr( string, starting position, length of string )<br />
实例：</p>
<p>$ awk &#8216;{ print substr( “hello world”, 7,11 ) }&#8217;<br />
上例截取了world子字符串。</p>
<p>match函数返回在字符串中正则表达式位置的索引，如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位置，RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串。函数格式如下：</p>
<p>match( string, regular expression )<br />
实例：</p>
<p>$ awk &#8216;{start=match(“this is a test”,/[a-z]+$/); print start}&#8217;<br />
$ awk &#8216;{start=match(“this is a test”,/[a-z]+$/); print start, RSTART, RLENGTH }&#8217;<br />
第一个实例打印以连续小写字符结尾的开始位置，这里是11。</p>
<p>第二个实例还打印RSTART和RLENGTH变量，这里是11(start)，11(RSTART)，4(RLENGTH)。</p>
<p>toupper和tolower函数可用于字符串大小间的转换，该功能只在gawk中有效。格式如下：</p>
<p>toupper( string )<br />
tolower( string )<br />
实例：</p>
<p>$ awk &#8216;{ print toupper(“test”), tolower(“TEST”) }&#8217;<br />
split函数可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供，则按当前FS值进行分割。格式如下：</p>
<p>split( string, array, field separator )<br />
split( string, array )<br />
实例：</p>
<p>$ awk &#8216;{ split( “20:18:00&#8243;, time, “:” ); print time[2] }&#8217;<br />
上例把时间按冒号分割到time数组内，并显示第二个数组元素18。</p>
<p>14.8.2. 时间函数</p>
<p>systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数。格式如下：</p>
<p>systime()<br />
实例：</p>
<p>$ awk &#8216;{ now = systime(); print now }&#8217;<br />
strftime函数使用C库中的strftime函数格式化时间。格式如下：</p>
<p>systime( [format specification][,timestamp] )<br />
Table 3. 日期和时间格式说明符</p>
<p>格式 描述<br />
%a 星期几的缩写(Sun)<br />
%A 星期几的完整写法(Sunday)<br />
%b 月名的缩写(Oct)<br />
%B 月名的完整写法(October)<br />
%c 本地日期和时间<br />
%d 十进制日期<br />
%D 日期 08/20/99<br />
%e 日期，如果只有一位会补上一个空格<br />
%H 用十进制表示24小时格式的小时<br />
%I 用十进制表示12小时格式的小时<br />
%j 从1月1日起一年中的第几天<br />
%m 十进制表示的月份<br />
%M 十进制表示的分钟<br />
%p 12小时表示法(AM/PM)<br />
%S 十进制表示的秒<br />
%U 十进制表示的一年中的第几个星期(星期天作为一个星期的开始)<br />
%w 十进制表示的星期几(星期天是0)<br />
%W 十进制表示的一年中的第几个星期(星期一作为一个星期的开始)<br />
%x 重新设置本地日期(08/20/99)<br />
%X 重新设置本地时间(12：00：00)<br />
%y 两位数字表示的年(99)<br />
%Y 当前月份<br />
%Z 时区(PDT)<br />
%% 百分号(%)<br />
实例：</p>
<p>$ awk &#8216;{ now=strftime( “%D”, systime() ); print now }&#8217;<br />
$ awk &#8216;{ now=strftime(“%m/%d/%y”); print now }&#8217;<br />
14.8.3. 内建数学函数</p>
<p>Table 4.</p>
<p>函数名称 返回值<br />
atan2(x,y) y,x范围内的余切<br />
cos(x) 余弦函数<br />
exp(x) 求幂<br />
int(x) 取整<br />
log(x) 自然对数<br />
rand() 随机数<br />
sin(x) 正弦<br />
sqrt(x) 平方根<br />
srand(x) x是rand()函数的种子<br />
int(x) 取整，过程没有舍入<br />
rand() 产生一个大于等于0而小于1的随机数<br />
14.8.4. 自定义函数</p>
<p>在awk中还可自定义函数，格式如下：</p>
<p>function name ( parameter, parameter, parameter, &#8230; ) {<br />
statements<br />
return expression                  # the return statement and expression are optional<br />
}<br />
15. How-to</p>
<p>如何把一行竖排的数据转换成横排？</p>
<p>awk &#8216;{printf(“%s,”,$1)}&#8217; filename
<div style="margin-top: 15px; font-style: italic">
<p><strong>原创文章，转载请注明：</strong> 转载自<a href="http://www.apparitor.info/">gjw_apparitor 博客</a></p>
<p><strong>本文链接地址:</strong> <a href="http://www.apparitor.info/2011/04/06/awk%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e8%bd%ac%e8%bd%bd/">Awk学习笔记(转载)</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.apparitor.info/2011/04/06/awk%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e8%bd%ac%e8%bd%bd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

