??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美亚洲日本久久精品,777久久精品一区二区三区无码,日韩电影久久久被窝网http://www.shnenglu.com/range/L世界的心Q寻找自q?zh-cnWed, 07 May 2025 20:37:22 GMTWed, 07 May 2025 20:37:22 GMT60unix׃n内存要点http://www.shnenglu.com/range/archive/2012/07/23/184665.htmlRangeRangeSun, 22 Jul 2012 16:08:00 GMThttp://www.shnenglu.com/range/archive/2012/07/23/184665.htmlhttp://www.shnenglu.com/range/comments/184665.htmlhttp://www.shnenglu.com/range/archive/2012/07/23/184665.html#Feedback0http://www.shnenglu.com/range/comments/commentRss/184665.htmlhttp://www.shnenglu.com/range/services/trackbacks/184665.html׃n内存优点Q?.在进E之间不通过内核传递数据,即不通过pȝ调用拯数据Q达到快速,高效的数据传输?br />                    2.随内核持l?br />*nix的共享内存有两套APIQPosix和System V

两者的主要差别是共享内存的大小
1.Posix׃n内存大小可通过函数ftruncate随时修改
2.System V׃n内存大小在创建时已l确定,而且最大值根据系l有所不同

 Posix׃n内存 
    #include <sys/mman.h>  QmmapQmunmapQmsyncQshm_openQshm_unlinkQ?br />
最主要的函? -- mmap
     void* mmap(void* addr,size_t len,int prot,int flags,int fd,off_t offset)
     函数一个句柄映到内存中,q个句柄可以是open的文件句柄,也可以是shm_open的共享内存区对象。当fd=-1时ؓ匿名׃n内存?br />     *nix一切皆文g的观点,shm_open也是?dev/shm目录下创Z个文件对象,q回对象的描q符?br />     mmap句柄作为共享内存的底层支撑对象Q映到内存中,q样可以不通过read、write在进E之间共享内存。由此推一下,?nix的进E间传递数据更加原始的Ҏ是进E间d一个文件。但是频J的open、read、write、lseekpȝ调用会消耗过多的计算资源。所以想C这个文件句柄映到内存中,q样提高了q程间传递数据的效率?br />
需要注意的函数 -- msync
      当修改了内存映射区的内存后,内核会在某个时刻文件的内容更新。ؓ了确信文件被更新Q调用函数msync。文件的更新可以是同步(MS_SYNCQ也可以是异步(MS_ASYNCQ。(估计q里也是调用了函数write更新文gQ?br />
System V׃n内存
    #include <sys/shm.h>  (shmget,shmat,shmdt,shmctl)
׃System V的共享内存有大小的限Ӟ所以可考虑Q用共享内存数l来解决q个问。虽然数l的大小即一个进E可以获取共享内存的数量也是有限Ӟ但是可以~解System V单个׃n内存q小的问题?img src ="http://www.shnenglu.com/range/aggbug/184665.html" width = "1" height = "1" />

Range 2012-07-23 00:08 发表评论
]]>
erlang Receive的工作机?/title><link>http://www.shnenglu.com/range/archive/2012/07/01/181020.html</link><dc:creator>Range</dc:creator><author>Range</author><pubDate>Sun, 01 Jul 2012 09:17:00 GMT</pubDate><guid>http://www.shnenglu.com/range/archive/2012/07/01/181020.html</guid><wfw:comment>http://www.shnenglu.com/range/comments/181020.html</wfw:comment><comments>http://www.shnenglu.com/range/archive/2012/07/01/181020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/range/comments/commentRss/181020.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/range/services/trackbacks/181020.html</trackback:ping><description><![CDATA[<div>receive works as follows:</div><div>1. When we enter a receive statement, we start a timer (but only if an after section is present in the expression).</div><div>2. Take the first message in the mailbox and try to match it against Pattern1, Pattern2, and so on. If the match succeeds, the message is removed from the mailbox, and the expressions following the pattern are evaluated.</div><div>3. If none of the patterns in the receive statement matches the first message in the mailbox, then the first message is removed from the mailbox and put into a “save queue.” The second message in the mailbox is then tried. This procedure is repeated until a matching message is found or until all the messages in the mailbox have been examined.</div><div><div>4. If none of the messages in the mailbox matches, then the process is suspended and will be rescheduled for execution the next time a new message is put in the mailbox. Note that when a new message arrives, the messages in the save queue are not rematched; only the new message is matched.</div><div>5. As soon as a message has been matched, then all messages that have been put into the save queue are reentered into the mailbox in the order in which they arrived at the process. If a timer was set, it is cleared.</div><div>6. If the timer elapses when we are waiting for a message, then evaluate the expressions ExpressionsTimeout and put any saved messages back into the mailbox in the order in which they arrived at the process.</div></div><img src ="http://www.shnenglu.com/range/aggbug/181020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/range/" target="_blank">Range</a> 2012-07-01 17:17 <a href="http://www.shnenglu.com/range/archive/2012/07/01/181020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strcasestr函数http://www.shnenglu.com/range/archive/2011/10/09/157888.htmlRangeRangeSun, 09 Oct 2011 11:12:00 GMThttp://www.shnenglu.com/range/archive/2011/10/09/157888.htmlhttp://www.shnenglu.com/range/comments/157888.htmlhttp://www.shnenglu.com/range/archive/2011/10/09/157888.html#Feedback0http://www.shnenglu.com/range/comments/commentRss/157888.htmlhttp://www.shnenglu.com/range/services/trackbacks/157888.html
       #define _GNU_SOURCE

       #include <string.h>

       char *strcasestr(const char *haystack, const char *needle);

        用于在c串haystack中查找c串needleQ忽略大写。如果找到则q回needle串在haystack串中W一ơ出现的位置的char指针

        在实际的应用中如果只加上头文Ӟ当编译时会出? warning: assignment makes pointer from integer without a cast

       q是因ؓ函数的声明在调用之后。未l声明的函数默认q回int型?/span>
 
       因此要在#include所?/span>头文件之前加  
#define _GNU_SOURCE  Q以此解x问题?/span>


Range 2011-10-09 19:12 发表评论
]]>
服务器高性能E序 盘I/O?/title><link>http://www.shnenglu.com/range/archive/2011/08/26/154449.html</link><dc:creator>Range</dc:creator><author>Range</author><pubDate>Fri, 26 Aug 2011 12:04:00 GMT</pubDate><guid>http://www.shnenglu.com/range/archive/2011/08/26/154449.html</guid><wfw:comment>http://www.shnenglu.com/range/comments/154449.html</wfw:comment><comments>http://www.shnenglu.com/range/archive/2011/08/26/154449.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/range/comments/commentRss/154449.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/range/services/trackbacks/154449.html</trackback:ping><description><![CDATA[<div><p>Linux IO<span style="font-family:宋体;">pȝ的架构图</span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/range/21.jpg" width="326" height="433" alt="" /><br /></p> <p> </p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span><span>一Q?/span><span style="font-family:宋体;">讑֤</span>-------- </span><span style="font-family:宋体;">影响盘性能的因?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">盘的{速媄响硬盘的整体性能。一般情况下转速越大,性能会越好?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">盘的性能因素主要包括两个Q?.</span><span style="font-family:宋体;">q_讉K旉2</span><span style="font-family:宋体;">传输速率?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">q_讉K旉包括两方面因素:</span></p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">q_寻道旉</span><span><span><span style="font-family:"Arial","sans-serif";color:black">(Average Seek Time)</span></span></span><span><span><span style="font-family:宋体; color:black">是指盘的磁头移动到盘面指定道所需的时?/span></span></span><span style="font-family:宋体;">。一般在3ms</span><span style="font-family:宋体;">?5ms</span><span style="font-family:宋体;">之间?/span></p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">q_旋{{待旉</span><span><span style="font-family:"Arial","sans-serif";color:black">(Latency)</span></span><span><span style="font-family:宋体;color:black">是指头已处于要讉K的磁道,{待所要访问的扇区旋{至磁头下方的旉?/span></span><span style="font-family:宋体;">一般在2ms</span><span style="font-family:宋体;">?ms</span><span style="font-family:宋体;">之间?/span></p> <p style="margin-left:21.0pt;"> </p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">传输速率(Data Transfer Rate) </span><span style="font-family:宋体;">盘的数据传输率是指盘d数据的速度Q单位ؓ兆字节每U(MB/s</span><span style="font-family:宋体;">Q。磁盘每U能传输80M~320M</span><span style="font-family:宋体;">字节?/span></p> <p style="margin-left:21.0pt;"> </p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">传输速率包括内部传输速率和外部传输速率?/span></p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">内部传输?Internal Transfer Rate) </span><span style="font-family:宋体;">也称为持l传输率(Sustained Transfer Rate)</span><span style="font-family:宋体;">Q它反映了硬?/span><a target="_blank"><span><span style="font-family:宋体; color:windowtext;text-decoration:none;text-underline:none">~冲?/span></span></a><span style="font-family:宋体;">未用时的性能。内部传输率主要依赖于硬盘的旋{速度?/span></p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">外部传输率(External Transfer Rate</span><span style="font-family:宋体;">Q也UCؓ</span><a target="_blank"><span><span style="font-family:宋体; color:windowtext;text-decoration:none;text-underline:none">H发数据传输?/span></span></a><span style="font-family:宋体;">Q?span>Burst Data Transfer Rate</span></span><span style="font-family:宋体;">Q或接口传输率,它标U的?/span><a target="_blank"><span><span style="font-family:宋体; color:windowtext;text-decoration:none;text-underline:none">pȝȝ</span></span></a><span style="font-family:宋体;">与硬盘缓冲区之间的数据传输率Q外部数据传输率?/span><a target="_blank"><span><span style="font-family:宋体; color:windowtext;text-decoration:none;text-underline:none">盘接口cd</span></span></a><span style="font-family:宋体;">?/span><a target="_blank"><span><span style="font-family:宋体; color:windowtext;text-decoration:none;text-underline:none">盘~存</span></span></a><span style="font-family:宋体;">的大有兟뀂STAT2 </span><span style="font-family:宋体;">的传输速率?00MB/s</span><span style="font-family:宋体;">U别?/span></p> <p style="margin-left:21.0pt;"> </p> <p style="text-indent:20.25pt"><span style="font-family:宋体;">因此在硬件上,提高盘性能的关键主要是降低q_讉K旉?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span><span>二.</span><span style="font-family:宋体;">讑֤驱动</span></span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">内存到硬盘的传输方式Qpoll</span><span style="font-family:宋体;">Q中断,DMA</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>DMA</span><span style="font-family:宋体;">Q当 CPU </span><span style="font-family:宋体;">初始化这个传输动作,传输动作本n是由 DMA </span><span style="font-family:宋体;">控制?nbsp;</span><span style="font-family:宋体;">来实行和完成?/span></p> <p style="margin-left:52.5pt; text-indent:-31.5pt;"><span>DMA</span><span style="font-family:宋体;">控制器获得ȝ控制权后QCPU</span><span style="font-family:宋体;">卛_挂v或只执行内部操作Q由DMA</span><span style="font-family:宋体;">控制器输写命令,直接控制RAM</span><span style="font-family:宋体;">与I/O</span><span style="font-family:宋体;">接口q行DMA</span><span style="font-family:宋体;">传输。DMA</span><span style="font-family:宋体;">每次传送的是磁盘上盔R的扇区。Scatter-gather DMA</span><span style="font-family:宋体;">允许传送不盔R的扇区?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>CPU</span><span style="font-family:宋体;">性能与硬盘与内存的数据传输速率关系不大?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">讑֤驱动内有一个结构管理着IO</span><span style="font-family:宋体;">的请求队?/span></p> <p style="margin-left:21.0pt;"><span>structrequest_queue</span><span style="font-family:宋体;">Qinclude/linux/Blkdev.h</span><span style="font-family:宋体;">Q?/span></p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">q里不仅仅有dh的数据块Q还有用于IO</span><span style="font-family:宋体;">调度的回调函数结构。每ơ需要传输的时候,׃队列中选出一个数据块交给DMA</span><span style="font-family:宋体;">q行传输?/span></p> <p style="margin-left:21.0pt;"> </p> <p style="margin-left:21.0pt;"><span style="font-family:宋体;">所?a name="_GoBack">IO</a></span><span><span style="font-family:宋体;">调度的回调函数这是降低^均访问的旉</span></span><span style="font-family:宋体;">的关键?/span></p> <p> </p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span><span>三.</span>OS</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>IO</span><span style="font-family:宋体;">调度?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Linux kernel</span><span style="font-family:宋体;">提供了四个调度器供用户选择。他们是noop,cfq,deadline,as</span><span style="font-family:宋体;">。可以在pȝ启动时设|内核参数elevator=<name></span><span style="font-family:宋体;">来指定默认的调度器。也可以在运行时为某个块讑֤讄IO</span><span style="font-family:宋体;">调度E序?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">下面来简要介l这四个调度器的甉|调度法?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Noop</span><span style="font-family:宋体;">Q最单的调度法。新的请求L被添加到队头或者队,然后L从队头中选出要被处理的h?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>CFQ</span><span style="font-family:宋体;">Q(Complete FarinessQueueing</span><span style="font-family:宋体;">Q它的目标是在所有请求的q程中^均分配IO</span><span style="font-family:宋体;">的带宽。因此,它会Ҏq程创徏自己的请求队列,然后IO</span><span style="font-family:宋体;">h攑օ相应的队列中。在使用轮{法从每个非空的队列中取出IO</span><span style="font-family:宋体;">h?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Deadline</span><span style="font-family:宋体;">Q用了四个队列Q两个以盘块序h序的d队列Q两个以最后期限时间排序的d队列。算法首先确定下一个读写的方向Q读的优先高于写。然后检查被选方向的最后期限队列:如果最后期限时间的队列中有时的请求,则将刚才的请求移动至队尾Q然后在盘h序队列中从超时请求开始处理。当处理完一个方向的h后,在处理另一个方向的h。(读请求的时旉?00ms</span><span style="font-family:宋体;">Q写h的超时时间是5s</span><span style="font-family:宋体;">Q?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Anticipatory</span><span style="font-family:宋体;">Q它是最复杂的IO</span><span style="font-family:宋体;">调度法。和deadline</span><span style="font-family:宋体;">法一h四个队列。还附带了一些启发式{略。它会从当前的磁头位|后的磁盘号中选择h。在调度了一个由P</span><span style="font-family:宋体;">q程的IO</span><span style="font-family:宋体;">h后,会检查下一个请求,如果q是P</span><span style="font-family:宋体;">q程的请求,则立卌度,如果不是Q同旉P</span><span style="font-family:宋体;">q程很快会发求,则还廉大约7ms</span><span style="font-family:宋体;">的时间等待P</span><span style="font-family:宋体;">q程的IO</span><span style="font-family:宋体;">h?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Write/Read</span><span style="font-family:宋体;">函数</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">以ext3</span><span style="font-family:宋体;">的write</span><span style="font-family:宋体;">ZQ?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">pȝ调用write()</span><span style="font-family:宋体;">的作用就是修攚w高速缓存内的一些页的内容,如果高速缓存内没有所要的则分配q追加这些页?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">当脏达C定数量或者超时后Q将脏页刷回盘。也可以执行相关pȝ调用?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">Z么要辑ֈ一定数量,是因为gq写能在一定层度上提高pȝ的性能Q这也得块讑֤的^均读h会多于写h?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">在程序中调用write</span><span style="font-family:宋体;">函数Q将q入pȝ调用f_op->write</span><span style="font-family:宋体;">。这个函数将调用ext3</span><span style="font-family:宋体;">的do_sync_write</span><span style="font-family:宋体;">。这个函数将参数装后调用generic_file_aio_write</span><span style="font-family:宋体;">。由参数名可以看出同步写变成了异步写。如果没有标记O_DIRECT</span><span style="font-family:宋体;">Q将调用函数generic_file_buffered_write</span><span style="font-family:宋体;">写的内容写qkernel</span><span style="font-family:宋体;">的高速页~存中。Buffer</span><span style="font-family:宋体;">是以page</span><span style="font-family:宋体;">为单位即4k</span><span style="font-family:宋体;">。之后当调用cond_resched()</span><span style="font-family:宋体;">q行q程的调度,DMA</span><span style="font-family:宋体;">会将buffer</span><span style="font-family:宋体;">中的内容写进盘?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">所以当每次?k</span><span style="font-family:宋体;">为单位写入硬盘时效率会达到最高。下面是UNIX</span><span style="font-family:宋体;">环境高~程的实验结果:</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/22.jpg" width="471" height="598" alt="" /><br /></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">下图是linux </span><span style="font-family:宋体;">的块讑֤的数据操作层ơ:</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Sector</span><span style="font-family:宋体;">扇区Q是讑֤驱动和IO</span><span style="font-family:宋体;">调度E序处理数据_度?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Block</span><span style="font-family:宋体;">块:是VFS</span><span style="font-family:宋体;">和文件系l处理数据的_度。其大小不唯一Q可以是512,1024,2048,4096</span><span style="font-family:宋体;">字节。内核操作的块大是4096</span><span style="font-family:宋体;">字节?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Segment</span><span style="font-family:宋体;">D:是DMA</span><span style="font-family:宋体;">传送的单位。每一个段包含了相ȝ扇区Q它能DMA</span><span style="font-family:宋体;">传送不盔R的扇区?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/23.jpg" width="359" height="353" alt="" /><br /></p> <p> </p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span><span>四.</span><span style="font-family:宋体;">用户E序</span></span></p> <p style="margin-left:21.0pt"><span style="font-family:宋体;">Ҏ以上的分析,我们?span>write buffer</span></span><span style="font-family:宋体;">一般设|ؓ4K</span><span style="font-family:宋体;">的倍数?/span></p> <p style="margin-left:21.0pt"> </p> <p style="margin-left:21.0pt"><span style="font-family:宋体;">在程序中有意识的延迟写。这个是os</span><span style="font-family:宋体;">的策略,当然也可以应用到E序的设计中。当然也会有~点Q?.</span><span style="font-family:宋体;">如果g错误或掉电,则会丢失内容Q做额外的备份)2.</span><span style="font-family:宋体;">需要额外的内存I间。(牺牲内存来提高IO</span><span style="font-family:宋体;">的效率)</span></p> <p style="margin-left:21.0pt"> </p> <p style="margin-left:21.0pt"><span style="font-family:宋体;">我们q需Ҏpȝ的IO</span><span style="font-family:宋体;">调度器的调度{略Q设计出不同的IO</span><span style="font-family:宋体;">{略。尽量降低磁盘的q_讉K旉Q降低请求队列,提高数据传输的速率?/span></p> <p> </p> <p> </p> <p> </p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span><span>五.</span><span style="font-family:宋体;">监控盘的工具和指标</span></span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Iostat–x –k 1</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span> -x</span><span style="font-family:宋体;">昄更多的消?nbsp;-k</span><span style="font-family:宋体;">数据以KB</span><span style="font-family:宋体;">为单?1</span><span style="font-family:宋体;">每秒昄一?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">输出昄的信?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Iowait</span><span style="font-family:宋体;">Qcpu</span><span style="font-family:宋体;">{待未完成的IO</span><span style="font-family:宋体;">h而空闲的旉的比例?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Idle</span><span style="font-family:宋体;">Qcpu</span><span style="font-family:宋体;">I闲且无IO</span><span style="font-family:宋体;">h的比例?/span></p> <p style="margin-left:31.5pt; text-indent:-10.5pt;"><span>rrqm/s</span><span style="font-family:宋体;">Q每U这个设备相关的dh有多被Merge</span><span style="font-family:宋体;">了?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>wrqm/s</span><span style="font-family:宋体;">Q每U这个设备相关的写入h有多被Merge</span><span style="font-family:宋体;">了?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>rsec/s</span><span style="font-family:宋体;">Q每U读取的扇区敎ͼ</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>wsec/</span><span style="font-family:宋体;">Q每U写入的扇区数?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>r/s</span><span style="font-family:宋体;">Q每U完成的?I/O </span><span style="font-family:宋体;">讑֤ơ数。即<span> delta(rio)/s</span></span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>w/s</span><span style="font-family:宋体;">Q每U完成的?I/O </span><span style="font-family:宋体;">讑֤ơ数。即<span> delta(wio)/s</span></span></p> <p style="margin-left:31.5pt; text-indent:-10.5pt;"><span>await</span><span style="font-family:宋体;">Q每一个IO</span><span style="font-family:宋体;">h的处理的q_旉Q单位是毫秒Q。包括加入请求队列和服务的时间?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>svctm:   </span><span style="font-family:宋体;">q_每次讑֤I/O</span><span style="font-family:宋体;">操作的服务时间?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>avgrq-sz: </span><span style="font-family:宋体;">q_每次讑֤I/O</span><span style="font-family:宋体;">操作的数据大?(</span><span style="font-family:宋体;">扇区)</span><span style="font-family:宋体;">。即<span> delta(rsect+wsect)/delta(rio+wio)<br /> avgqu-sz: </span></span><span style="font-family:宋体;">q_I/O</span><span style="font-family:宋体;">队列长度。即 delta(aveq)/s/1000 (</span><span style="font-family:宋体;">因ؓaveq</span><span><span style="font-family:宋体;color:#333333">的单位ؓ毫秒</span></span><span><span style="font-family:"Arial","sans-serif";color:#333333">)</span></span><span><span style="font-family:宋体;color:#333333">?/span></span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>%util</span><span style="font-family:宋体;">Q在l计旉内所有处理IO</span><span style="font-family:宋体;">旉Q除以dl计旉。例如,如果l计间隔1</span><span style="font-family:宋体;">U,该设备有0.8</span><span style="font-family:宋体;">U在处理IO</span><span style="font-family:宋体;">Q?.2</span><span style="font-family:宋体;">U闲|,那么该设备的%util = 0.8/1 = 80%</span><span style="font-family:宋体;">Q所以该参数暗示了设备的J忙E度。一般地Q如果该参数?00%</span><span style="font-family:宋体;">表示讑֤已经接近满负药行了Q当然如果是多磁盘,即%util</span><span style="font-family:宋体;">?00%</span><span style="font-family:宋体;">Q因为磁盘的q发能力Q所以磁盘用未必就C瓉Q?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">下面我们做一个实验来分析一?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">我们使用命o</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span><span>time dd if=/dev/zero of=/home/zhouyuan/mytest bs=1M count=3000</span></span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">向mytest</span><span style="font-family:宋体;">写入数据Q写?G</span><span style="font-family:宋体;">?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">截取部分的状态监控:</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/24.jpg" width="992" height="354" alt="" /><br /></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/25.jpg" width="692" height="361" alt="" /><br /></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/26.jpg" width="668" height="357" alt="" /><br /></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">如图2</span><span style="font-family:宋体;">Q当两条数据<span> iowait </span></span><span><span style="font-family: 宋体;">辑ֈ?/span> 99% </span><span style="font-family:宋体;">以上Q写入的数据?</span><span style="font-family:宋体;">Q这是因为DMA</span><span style="font-family:宋体;">内存的中的数据传输l设备。结合图1</span><span style="font-family:宋体;">的前两条数据Q利用率辑ֈ?9%+</span><span style="font-family:宋体;">却没有写入的盘块?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">如图3</span><span style="font-family:宋体;">Qiowait</span><span style="font-family:宋体;">下降Q说明cpu</span><span style="font-family:宋体;">开始执行相关程序,而此时块讑֤开始写入的数据。这两个操作是异步进行的?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Vmstat–k –n 1</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>Swap</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">  si: </span><span style="font-family:宋体;">从磁盘交换到内存的交换页数量Q单位:KB/</span><span style="font-family:宋体;">U?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">  so: </span><span style="font-family:宋体;">从内存交换到盘的交换页数量Q单位:KB/</span><span style="font-family:宋体;">U?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span>IO</span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">  bi: ?/span><span style="font-family:宋体;">块设备接受的块数Q单位:?</span><span style="font-family:宋体;">U?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><span style="font-family:宋体;">  bo: </span><span style="font-family:宋体;">发送到块设备的块数Q单位:?</span><span style="font-family:宋体;">U?/span></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/27.jpg" width="748" height="31" alt="" /><br /></p> <p style="margin-left:21.0pt;text-indent:0cm;"><img src="http://www.shnenglu.com/images/cppblog_com/range/28.jpg" width="736" height="461" alt="" /><br /></p> <p style="margin-left: 21pt; text-indent: 0cm; "><span style="font-family: 宋体; ">从图中我们可以看出系l的延迟写?/span></p></div><img src ="http://www.shnenglu.com/range/aggbug/154449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/range/" target="_blank">Range</a> 2011-08-26 20:04 <a href="http://www.shnenglu.com/range/archive/2011/08/26/154449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma pack学习http://www.shnenglu.com/range/archive/2011/07/15/151094.htmlRangeRangeFri, 15 Jul 2011 12:36:00 GMThttp://www.shnenglu.com/range/archive/2011/07/15/151094.htmlhttp://www.shnenglu.com/range/comments/151094.htmlhttp://www.shnenglu.com/range/archive/2011/07/15/151094.html#Feedback6http://www.shnenglu.com/range/comments/commentRss/151094.htmlhttp://www.shnenglu.com/range/services/trackbacks/151094.html      最q调试网l的服务端程序,自己写了一个小客户端程序来试Q发现服务程序解包错误。经调试发现客户端的协议头大和服务器端的协议头大小不一致。原因是服务器端加了#pragma pack(1),而客L没加?/span>

    之前没接触过q个~译宏,现在来认真学习之?/span>

    首先google?/span>~~

    原来#pragma pack有几UŞ式,我所接触到的?/span>#pragma pack(n)Q即变量?/span>n字节寚w?/span>

    变量寚w在每个系l中是不一LQ默认的寚w方式能有效的提高cpu取指取数的速度Q但是可能会费一定的I间。在|络E序中采?/span>#pragma pack(1),卛_量紧~,不但可以减少|络量Q还可以兼容各种pȝQ不会因为系l对齐方式不同而导致解包错误?/span>

    了解了概念和优点Q现在我们就来测试之~

 

    q_Q?/span>CPU—Pentium E5700 内存—2G

     1.操作pȝQ?/span>ubuntu 11.04 32bit   ~译器:G++ 4.5.2

     2.操作pȝQ?/span>windows xp              ~译器:VS2010

 

    先看W一个测试?/span>

    l构体在正常情况和紧~情况在以上不同环境下占用的内存大小?/span>

1 struct pack {
2   int i;
3   short s;
4   double d;
5   char c;
6   short f;
7 }

  
   试l果为:

    1Q?br />   

 

    2Q?br />    
  
    试l果分析Q?/span>

 

 

    可以看出紧羃后结构体的大ؓ15Q是l构体内|类型大的和。但是在默认情况下,l构体的大小都是寚w字节数的倍数?/span>ubuntu?/span>pack只需?/span>20个字节,?/span>windows?/span>24个字节。这是因?/span>ubuntu是以4字节寚wQ?/span>windows则是以最大的内置cd的字节数寚wQ在l构体内最大的内置cd?/span>doubleQ其大小?/span>8个字节。他们在内存中的寚w方式如下图:

    1Q?/span>

    

    2Q?/span>

    

   q需注意的是Q?/span>在对齐类型的内部都是?/span>2字节寚w的?/span>

   l论Q?/span>在默认情况下Q?/span>linux操作pȝ是以4字节寚wQ?/span>windows操作pȝ则是以最大的内置cd寚w?/span>

 

   W二个测?/span>

   一个结构体内包含另外一个结构体Q其大小的情c?/span>

   内部的结构体?/span>

1 struct pack {
2   short s;
3   double d;
4 }

   外部的结构体?/span>

   1 struct complex _pack{

2   char c;
3   struct pack s;
4   double d;
5 };

    我们有四U情况:

     1.      pack紧羃Q?/span>complex _pack紧羃

     2.      pack紧羃Q?/span>complex _pack默认

     3.      pack默认Q?/span>complex _pack紧羃

     4.      pack默认Q?/span>complex _pack默认

    以下的排列均按此序?/span>

     试的结?/span>

      1Q?/span>

      

     2Q?/span>

      

    试l果分析Q?/span>

    在两个操作系l下Q除了第一U情?/span>----内结构体和外l构体都紧羃----相同之外Q其他三U情况都不相同。我们可以根据偏Uȝ出结构体在内存中的情c第一U情늜略?/span>

     1Q?/span>

     

     2Q?/span>

     

    l论Q?/span>#pragma pack只媄响当前结构体的变量的寚w情况Qƈ不会影响l构体内部的l构体变量的排列情况。或者说#pragma pack的作用域只是一?/span>。我们由W三U情况,内部l构体正常,外部l构体紧~,可以得出l构体的寚w是按偏移计算的?/span>

    q里q有一个问题没解决Qؓ什么第二种情况内部l构体的偏移都是1?不是4或?Q?/p>

 



Range 2011-07-15 20:36 发表评论
]]>
NAT学习http://www.shnenglu.com/range/archive/2011/07/15/151093.htmlRangeRangeFri, 15 Jul 2011 12:35:00 GMThttp://www.shnenglu.com/range/archive/2011/07/15/151093.htmlhttp://www.shnenglu.com/range/comments/151093.htmlhttp://www.shnenglu.com/range/archive/2011/07/15/151093.html#Feedback2http://www.shnenglu.com/range/comments/commentRss/151093.htmlhttp://www.shnenglu.com/range/services/trackbacks/151093.html      The IP Network Address TranslatorQ?/span>IP|络地址转换是h们说?/span>NATQ或者说NA(P)T?/span>NAT是ؓ了解?/span>IPv4地址不而提出来得一U替代方案,可以对外界屏蔽内部的|络拓扑。随着|络的发展,NATȝ了构建在覆盖|络?/span>P2PE序的发展。因盖网l是构徏在应用层Q屏蔽了传输层以下的|络拓扑Q网l中的每一个节Ҏ某些节点有此|络的\pQ由q些路由表构建出q个覆盖|络Q但?/span>NATȝ的覆盖网l中节点的连接?br />    
    
   
    
上图昄?/span>NAT的原理?/span>NAT内|的IP替换为公|?/span>IPQ将端口映射为公|的端口。公|?/span>IP替换内网IP是固定的Q?/span>NAT的不之处在于端口的替换。因?/span>NATq没有Ş成标准,替换{略有几U,q也?/span>NAT行ؓ的关键?/span>

     在?/span>Behavior and Classification of NAT Devices and Implications for NAT Traversal》一文中把端口映射的行为分成四U,其中包括保留端口Q不保留端口Q端口重载,端口复用。这四种分类最l区分了NAT的四U类型即Full cone NATQ?/span>Symmetric NATQ?/span>Port-Restrictes cone NAT Q?/span>Address-Restriced cone NAT?/span>

     Z使覆盖网l中的节点相互通信Q我们需要进?/span>NATI越。在?/span>A NAT Traversal Mechanism for Peer-To-Peer Networks》一文种介绍了根据两端不同的NATcd对应的四U?/span>NATI越Ҏ。如下图
     
     

    q些解决Ҏ都需?/span>STUNQ?/span>Simple Traversal of User Datagram Protocol through Network Address Translators (NATs)Q?/span>NAT?/span>UDP单穿)协议帮助。STUN协议要求一台具有公|?/span>IP的主机帮助一C?/span>NATcd的判断?br />    

      上图?/span>STUN协议的流E,其主要的思想是通过STUN的回来判断L?/span>NATcd?/span>

     除了直接q接Q反向连接、打z和依赖都需要第三台L的帮助?/span>

     在?/span>Characterization and Measurement of TCP Traversal through NATs and Firewalls》一文中介绍?/span>TCPI越的方法。在STUNT#2Ҏ中,W三C机和两台需要连接的L都有长连接,当一斚w要发hq接Ӟ向第三台L发请求,W三C机向被请求的L发送邀P此时需要连接的L都向Ҏ发?/span>SYN包,此时双方的防火墙都有了洞Q只要有一方的SYN包到辑֯方主机,q接׃被徏立?/span>RelayҎ需要耗费的代价太大,?/span>P2P应用中一般会消极的处理双斚w是对U?/span>NAT的情c?/span>






 



Range 2011-07-15 20:35 发表评论
]]>
Initializationhttp://www.shnenglu.com/range/archive/2011/07/15/151092.htmlRangeRangeFri, 15 Jul 2011 12:31:00 GMThttp://www.shnenglu.com/range/archive/2011/07/15/151092.htmlhttp://www.shnenglu.com/range/comments/151092.htmlhttp://www.shnenglu.com/range/archive/2011/07/15/151092.html#Feedback0http://www.shnenglu.com/range/comments/commentRss/151092.htmlhttp://www.shnenglu.com/range/services/trackbacks/151092.htmlHello WorldQ?/span>

Range 2011-07-15 20:31 发表评论
]]>
ŷ鶹þþþþ| ĻۺϾþ2| Բľþþþþ| ŷþþXXX| ޾ƷĻþò| þ99ֻоƷ| þۺϸۺϾþ| þĻר| ѾƷþþþþĻ | þ99ƷþþþþҰ| ޺ݺݾþۺһ77777| Ʒþþþaaaa| þþƷӰԺ| 뾫Ʒþþþ| ھƷ99þ| ҹþþþƷӰԺ| Ʒþùһ㽶| ŷƷ˾þ| þþþӰԺŮ| 91Ʒɫ۾þ| ɫۺϾþ߹ۿ| þרƷ| ˸ŮѲžþþ| ھƷþù½| ľþۺĻ| ޾Ʒһۺ99þ| ˳˳ۺþþ| ɫɫݺɫۺϾþ| ɫۺϾþĻ| ŷۺϾþͼƬ| þþþø߳ۺӰԺ| þ| պݺݾþ͵͵ɫۺ0| þ޾ƷĻ| þþþƷר | 91Ըߺþþþ| 18պҹþó| Ʒһþþþþþվ| ߾þþƷĹ| 99reþùƷҳ| ӰȷŮAV³ɫԴþ |