标准输入,输出和错误
---------------------------------
文件文件 描述符
---------------------------------
输入文件—标准输入 0
输出文件—标准输出 1
错误输出文件—标准错误 2
---------------------------------
1.重定向
COMMAND_OUTPUT > 2 # 将stdout重定向到一个文件. 3 # 如果这个文件不存在, 那就创建, 否则就覆盖. 4 5 ls -lR > dir-tree.list 6 # 创建一个包含目录树列表的文件. 7 8 : > filename 9 # >操作, 将会把文件"filename"变为一个空文件(就是size为0). 10 # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 11 # :是一个占位符, 不产生任何输出. 12 13 > filename 14 # >操作, 将会把文件"filename"变为一个空文件(就是size为0). 15 # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 16 # (与上边的": >"效果相同, 但是某些shell可能不支持这种形式.) 17 18 COMMAND_OUTPUT >> 19 # 将stdout重定向到一个文件. 20 # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边. 21 22 23 # 单行重定向命令(只会影响它们所在的行): 24 # -------------------------------------------------------------------- 25 26 1>filename 27 # 重定向stdout到文件"filename". 28 1>>filename 29 # 重定向并追加stdout到文件"filename". 30 2>filename 31 # 重定向stderr到文件"filename". 32 2>>filename 33 # 重定向并追加stderr到文件"filename". 34 &>filename 35 # 将stdout和stderr都重定向到文件"filename". 36 37 M>N 38 # "M"是一个文件描述符, 如果没有明确指定的话默认为1. 39 # "N"是一个文件名. 40 # 文件描述符"M"被重定向到文件"N". 41 M>&N 42 # "M"是一个文件描述符, 如果没有明确指定的话默认为1. 43 # "N"是另一个文件描述符. 44 45 #============================================================================== 46 47 # 重定向stdout, 一次一行. 48 LOGFILE=script.log 49 50 echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE 51 echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE 52 echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE 53 echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"." 54 # 每行过后, 这些重定向命令会自动"reset". 58 # 重定向stderr, 一次一行. 59 ERRORFILE=script.errors 61 bad_command1 2>$ERRORFILE # Error message sent to $ERRORFILE. 62 bad_command2 2>>$ERRORFILE # Error message appended to $ERRORFILE. 63 bad_command3 # Error message echoed to stderr, 64 #+ and does not appear in $ERRORFILE. 65 # 每行过后, 这些重定向命令也会自动"reset". 66 #============================================================================== 67 70 2>&1 71 # 重定向stderr到stdout. 72 # 将错误消息的输出, 发送到与标准输出所指向的地方. 73 74 i>&j 75 # 重定向文件描述符i到j. 76 # 指向i文件的所有输出都发送到j. 77 78 >&j 79 # 默认的, 重定向文件描述符1(stdout)到j. 80 # 所有传递到stdout的输出都送到j中去. 81 82 0< FILENAME 83 < FILENAME 84 # 从文件中接受输入. 85 # 与">"是成对命令, 并且通常都是结合使用. 86 # 87 # grep search-word <filename 88 90 [j]<>filename 91 # 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它. 92 # 如果文件"filename"不存在, 那么就创建它. 93 # 如果文件描述符"j"没指定, 那默认是fd 0, stdin. 94 # 95 # 这种应用通常是为了写到一个文件中指定的地方. 96 echo 1234567890 > File # 写字符串到"File". 97 exec 3<> File # 打开"File"并且将fd 3分配给它. 98 read -n 4 <&3 # 只读取4个字符. 99 echo -n . >&3 # 写一个小数点. 100 exec 3>&- # 关闭fd 3. 101 cat File # ==> 1234.67890 102 # 随机访问. 106 | 107 # 管道. 108 # 通用目的处理和命令链工具. 109 # 与">", 很相似, 但是实际上更通用. 110 # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用. 111 cat *.txt | sort | uniq > result-file 112 # 对所有.txt文件的输出进行排序, 并且删除重复行. 113 # 最后将结果保存到"result-file"中.
command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把command命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入
2.双向重定向
即在重定向数据到目标文件的同时,还要保证数据能够正常处理,使用tee命令。
tee [-a] file
-a 往文件尾添加内容
last | tee last_backup | cut -d " " -f 1 #tee相当于对last的结果备份了一次
现在流行的web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile是什么,怎么影响性能的呢?sendfile实际上是 Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用 sendfile这个系统调用。先来看一下不用 sendfile的传统网络传输过程:
read(file,tmp_buf, len);
write(socket,tmp_buf, len);
硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈
一般来说一个网络应用是通过读硬盘数据,然后写数据到socket 来完成网络传输的。上面2行用代码解释了这一点,不过上面2行简单的代码掩盖了底层的很多操作。来看看底层是怎么执行上面2行代码的:
1、系统调用 read()产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
2、数据从 kernel buffer拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。
3、 系统调用write()产生一个上下文切换:从 user mode切换到 kernel mode,然后把步骤2读到 user buffer的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket相关联。
4、系统调用 write()返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换了),然后 DMA 从 kernel buffer拷贝数据到协议栈(第4次拷贝了)。
上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。在kernel2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数。
再来看一下用 sendfile()来进行网络传输的过程:
sendfile(socket,file, len);
硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈
1、 系统调用sendfile()通过 DMA把硬盘数据拷贝到 kernel buffer,然后数据被 kernel直接拷贝到另外一个与 socket相关的 kernel buffer。这里没有 user mode和 kernel mode之间的切换,在 kernel中直接完成了从一个 buffer到另一个 buffer的拷贝。
2、DMA 把数据从 kernelbuffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。
步骤减少了,切换减少了,拷贝减少了,自然性能就提升了。这就是为http://write.blog.csdn.net/postedit什么说在Nginx 配置文件里打开 sendfile on 选项能提高 web server性能的原因。
tcp_nopush
官方:
tcp_nopush
Syntax: tcp_nopush on | off
Default: off
Context: http
server
location
Reference: tcp_nopush
This directive permits or forbids the use of thesocket options TCP_NOPUSH on FreeBSD or TCP_CORK on Linux. This option is onlyavailable when using sendfile.
Setting this option causes nginx to attempt to sendit’s HTTP response headers in one packet on Linux and FreeBSD 4.x
You can read more about the TCP_NOPUSH and TCP_CORKsocket options here.
linux
下是tcp_cork,上面的意思就是说,当使用sendfile函数时,tcp_nopush才起作用,它和指令tcp_nodelay是互斥的。tcp_cork是linux下tcp/ip传输的一个标准了,这个标准的大概的意思是,一般情况下,在tcp交互的过程中,当应用程序接收到数据包后马上传送出去,不等待,而tcp_cork选项是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵
VMware vSphere服务器虚拟化实验十一高可用性之三Fault Tolerance
Fault Tolerance(FT)即容错双机热备,通过创建与主实例保持虚拟同步的虚拟机实时影子实例,使应用在服务器发生故障的情况下也能够持续可用。通过在发生硬件故障时在两个实例之间进行即时故障切换,FT 完全消除了数据丢失或中断的风险确保业务连续性。Fault Tolerance 使用 ESXi 主机平台上的 VMware vLockstep 技术确保主虚拟机和辅助虚拟机的状态在虚拟机的指令执行的任何时间点均相同来提供连续可用性。vLockstep 通过使主虚拟机 和辅助虚拟机执行相同顺序的 x86 指令来完成此过程。主虚拟机捕获所有输入和事件(从处理器到虚拟 I/O 设备),并在辅助虚拟机上进行重放。辅助虚拟机执行与主虚拟机相同的指令序列,而仅单个虚拟机映像(主虚拟机)执行工作负载。如果运行主虚拟机的主机或运行辅助虚拟机的主机发生故障,则会发生即时且透明的故障切换。正常运行的ESXi 主机将无缝变成主虚拟机的主机,而不会断开网络连接或中断正在处理的事务。使用透明故障切换,不会有数据损失,并且可以维护网络连接。在进行透明故障切换之后,将重新生成新的辅助虚拟机,并将重新建立冗余。整个过程是透明且全自动的,并且即使 vCenter Server 不可用,也会发生。
虽然FT功能很强大,但是在虚拟化中很少用到FT功能,一是对资源浪费比较严重,二是单个虚拟CPU无法满足业务的需求,三是只有很少有一些应用要求低配置,却要求高可用的要求
说明:
环境基于实验十,主要创建FT双机热备功能(FT功能需要HA群集功能支持)
1、打开vSphere Client管理控制台,检查Cluster群集是否开启了vSphere HA功能,必须要开启此功能
2、为两台ESXi主机建立FT功能的专用的VMlernel网络
3、检查要开启FT功能的虚拟机虚拟CPU是否满足是1颗1核心
4、对Windows 8虚拟机配置FT功能,开启FT需要使用精简置备的磁盘,所以在开启FT前,vCenter会自动转换虚拟机磁盘转换之后,特定的虚拟机将指定为主虚拟机,并在另一台主机上次要辅助虚拟机。现在,主虚拟机已启用了容错功能。虚拟机运行在esxi01上,FT保护副本运行在esxi02上
视频分享:http://pan.baidu.com/share/link?shareid=3542013005&uk=1025659618
测试环境条件有限,此实验无法完成