后台进程读/写控制台触发SIGTTIN/SIGTTOU信号量

  Unix环境下,当一个进程以后台形式启动,但尝试去读写控制台终端时,将会触发SIGTTIN(读)和SIGTTOU(写)信号量,接着,进程将会暂停(linux默认情况下),read/write将会返回错误。这个时候,shell将会发送通知给用户,提醒用户切换此进程为前台进程,以便继续执行。由后台切换至前台的方式是fg命令,前台转为后台则为CTRL+Z快捷键。   那么问题来了,如何才能在不把进程切换至前台的情况下,读写控制器不会被暂停?答案:只要忽略SIGTTIN和SIGTTOU信号量即可:signal(SIGTTOU, SIG_IGN)。   stty stop/-stop命令是用于设置收到SIGTTOU信号量后是否执行暂停,因为有些系统的默认行为不一致,比如mac是默认忽略,而linux是默认启用。stty -a可以查看当前…

Read more

Pid file和进程副本

  在守护进程(daemon)中,经常需要向/var/run/中写入pid文件:xxx.pid,该文件里的内容是xxx进程的进程号。 1.如何防止启动多个副本   为了防止启动一个进程的多个副本,需要在写的时候申请文件锁,一个进程一旦申请文件锁后,会一直锁住该pid文件,直到进程退出,这样也就达到了只启动一个副本的目的。   实例代码如下: const string LOCKFILE = "/var/run/agent.pid"; const mode_t LOCKMOD = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); int lockfile (int fd) { struct flock fl; fl.l_type = F_WRLCK; fl.l_sta…

Read more

Automake中的BUILT_SOURCES

  BUILT_SOURCES变量作用是自动化编译依赖文件。   举个例子,比如我需要编译A.c代码,而A.c代码依赖A.h和B.h、B.c,A.h是实际存在的,而B.h和B.c是需要通过调用gen二进制程序生成的,我不想每次都先执行gen生成B.h和B.c,再执行Makefile.am,而是想要集成化操作,一步到位,那么就需要用到BUILT_SOURCES了。相当于在Makefile.am里面加上下面这三行就行,其中$(EXEEXT)标识gen为可执行程序,当然,不加也可以。 BUILT_SOURCES = B.h B.c $(BUILT_SOURCES): Makefile gen$(EXEEXT)   需要注意的是,BUILT_SOURCES只支持make all,make check和make install,…

Read more

PortLand数据中心架构

  PortLand是2009年提出的一种数据中心架构模式,它解决了传统架构的几种不足,具有以下几个优点:虚机迁移IP不变且原连接正常;部署前不需要人工配置交换机;任意主机可达;无环;链路失败检测。PortLand采用的是二层架构模式,方便扩容、迁移,同时解决了二层ARP,广播等带来的问题。   下图是几个胖树拓扑(Fat tree)的例子,也是PortLand采用的拓扑。拓扑为三层拓扑,从上而下分别是核心层、汇聚层和边缘层。边缘交换机下连主机,上连汇聚层,一个主机连接一个边缘交换机。几个汇聚层交换机(文中为2个)和几个边缘交换机(文中为2个)互连组成一个Pod。每个汇聚层上连2条链路到核心层,注意一个Pod上连的核心交换机各不相同,这是为了充分负载和容错的考虑。 1.Fabric Manager   Fabric Mana…

Read more

VL2数据中心架构

  VL2数据中心架构由微软在2009年提出,它是一种新型的架构方式,使得数据中心在节约成本的同时,保证资源的灵活动态分配。它支持数据数据中心内服务器之间均匀的高容量(uniform high capacity)、不同服务带宽互相隔离(performance isolation between services)、二层环境(Ethernet layer-2 semantics)。它采用了: 扁平化地址管理,使得不同的服务可以位于数据中心内部不同的位置。 Valiant Load Balancing(VLB)的负载均衡方式。 方便扩容。   通过在小型数据中心的实验,证明了VL2的可用性。本文部分用语可能翻译不是特别恰当,我根据自己的理解进行表述。 1.传统数据中心架构的缺点   传统数据中心架构具有以下几个缺点: 数据中心…

Read more

Valiant Load-Balancing学习

  第一次接触Valiant Load-Balancing (VLB)的时候,对这个意思揣摩了半天,难道是『英勇的负载均衡』?Oh, no...后来才知道,是一个名叫Valiant推出的Load-Balancing方案。本文主要介绍了以下五点内容: 传统网络状况 VLB的算法思想 VLB的扩展,应对不同容量的链路 VLB如何应对链路断开情况 两个VLB网络之间如何连接 1.传统网络的不足   目前的网络流量很难估计和预测,充满了不确定性,这就导致了网络很容易拥塞。举个例子,比如不同数据中心流量传输,可能存在部分链路网络拥塞导致丢包,而部分链路仍然未满载(满流);也可能在平时的时候链路都未满载,而在高峰期就拥塞。所以链路的设计就不断的扩大链路的容量,以满足高峰期流量,降低丢包率,而这种方式的弊端是成本越来越高,且链路空闲导致带宽浪费。…

Read more

Switch python version and solve this problem: Fatal Python error: PyThreadState_Get: no current thread

  Switch python version in MAC-OS is a confused problem, so i use pyenv to switch python version, it works very well: vinllen@ ~$ python --version Python 2.7.11 vinllen@ ~$ pyenv global <tab> --help 2.7.10 3.4.0 system vinllen@ ~$ pyenv global 3.4.0 --help 2.7.10 3.4.0 system vinllen@ ~$ python --version Python 3.4.0   Problem occurs when i using cmak…

Read more

vxlan科普

  vxlan的出现是为了解决vlan的几个局限性:二层网络边界的限制、vlan数量不足、在多租户场景下的不适应。   vxlan定义了vtep(VXLAN Tunnel End Point--虚拟扩展本地网络隧道终结节点)的实体,vtep将虚机产生的数据封装到UDP包头内再发送出去,虚机本身的MAC地址和vlan信息在经过封装后已经不作为数据转发的依据。vtep可以是软件、硬件服务器或网络设备,其实现形式非常灵活,如果将vtep的功能直接集成到虚机Hypervisor内,则所有的虚机流量在进入交换机之前已经被打上新的vxlan标签和udp包头,相当于建立了任意两点之间的隧道。   因为虚机本身的vlan信息对外不可见,因此vxlan添加了一个新的标签VNI (VXLAN Network Identifer--虚拟扩展本地网络标识…

Read more

虚拟化网卡

  在之前的文章中介绍过,VEB是一种软件交换机,通过CPU模拟出的简单二层转发功能。它的优点是简单,成本低。缺点是,软件转发流量会消耗CPU资源;另外,虚拟机往往要求特殊的端口队列模型,而单一的物理网卡无法对上层多个虚拟化OS提供不同的队列服务。   因此,一些厂商提出了硬件VEB方案,又称为Hypervisor Bypass方案,也就是说虚机绕过软件交换机直接同网卡打交道,这样做的好处是一个虚机独享一个PCIe通道。但这样的缺点是,每一个PCIe插槽比较珍贵,涉及能耗、散热、空间支出、以及数量上限等问题。所以虚拟化网卡随即产生。 1. 虚拟化网卡   虚拟化网卡具有两大重要特性:虚拟接入和虚拟通道。虚拟接入是:对于服务器外部网络,VN-TAG/VEPA可以区分出不同虚机的流量,并在整个数据中心内部署有针对性的隔离和QoS策略。…

Read more

VN-Tag和VEPA

  现有的虚拟接入的服务对象是虚机的网络流量,虚机运行在虚拟化平台软件中,而虚机又运行在物理服务器上,这就使得虚机的流量同时受到上联交换机、服务器网卡和Hypervisor的影响。在虚拟化服务器中一直有一个重要的概念称为VEB(Virtual Etherenet Bridges--虚拟桥接网络),VEB指代的是用于连接虚拟机到接入交换机的网络服务,VEB有软件和硬件两种实现方式。软件比如Open vSwitch。不管是硬件VEB还是软件VEB,它们目前都只能完成简单的二层网络转发,缺乏QoS机制和二层安全策略,流量镜像功能薄弱,但要在VEB里完全塞进一个接入交换机的功能特性,在短期内仍然具有很大难度;其次,网管人员没有独立的管理界面;最后,VEB形成了一个分类的网络接入层,如果VEB作为接入交换机,那么理应该在上面部署与接入交换机一样的端口策略,然而由于VEB与接入交换…

Read more

TRILL/FabricPath和SPB

  虚机的动态迁移要求在一个二层VLAN内进行。在常用的三层数据架构中,接入层和汇聚层为二层网络,三层网关设在汇聚层或者核心层,所有二层链路上多运行STP。 1. 二层网络存在的问题   未来数据中心内部的横向流量会越来越大,如果采用STP阻断多余端口,而只启用一条链路,则会导致资源的浪费;其次,二层设计会越来越复杂;然后,传统二层MAC没有层次化概念,边缘设备的MAC地址空间将会耗尽。   如果二层网络没办法解决问题,另一种思路是采用在汇聚交换机和接入交换机上设置IP网关,通过三层路由将所有交换机连接起来,类似的解决方案还包括将网关设备设在核心设备上,通过核心设备集中互联。该方案存在的问题如下: 在虚拟化环境中,虚拟只有在一个二层网络的范围内才能动态迁移,而不能跨三层网关迁移。虚拟化的最大特点是可以将业务动态部署到数据中心的任何…

Read more

云计算中的网络通道

  本文主要介绍了DNS重定向,健康路由注入和LISP技术,文章参考参见《腾云》。   DNS重定向和健康路由注入都是应对用户访问,根据其位置将流量送到最适合的数据中心,并且在数据中心发生故障时,尽可能快地利用备份中心来吸收请求流量的技术。 1. DNS重定向   DNS重定向的思路是子DNS服务器中动态地维持几个后台数据中心的出口IP地址,针对一般的用户请求返回优先级最高的出口IP。如果其中一个数据中心出现问题,DNS服务器便将其对应的IP地址暂停使用,当收到后续的DNS请求时,便将流量导向仍在正常工作的数据中心,从而在广域网上实现后台资源的负载均衡。   但,DNS重定向远不是一个完美的解决方案,原因如下。 DNS重定向局限于基于域名解析的WEB服务。对于互联网上那些非WEB业务,该方案显得不那么方便。…

Read more

QoS浅析

  标准的网络QoS流程分为流量识别、流量标记和流量处理三个步骤。 1. 流量识别   流量识别在传统的QoS文档中被称为Classification,目的是将混合在一起的数据流进行分类。流量识别的依据是数据包头的内容,比如目的ip+tcp端口+dscp值。   QoS流量识别没有统一的公开标准,通常采用如下字段: 物理层。物理端口、子接口、PVC接口。 链路层。MAC地址、CoS值、MPLS EXP。 网络层。IP值、DSCP值、IP优先级。 传输层。TCP/UDP端口号。 会话层以上。业务特定标签,如URL等。   许多厂商退出了识别业务流程的功能。如NBAR是内置在CISCO路由器内的深度包检测功能,原理类似于IPS(Intrusion Prevention System--入侵检测设备)。NBAR会将每…

Read more

VPN技术

  上篇文章所说的准入技术保证了只有正确的用户可以访问,剩下的工作就是确保这些用户的访问过程安全、可靠。这个也就是VPN发挥用处的地方。   VPN具备两个特性--长连接和加密。长连接的意思是每条VPN有状态,通信双方通过类似『三次握手』机制保证通信对端的唯一性以及数据的可靠性。加密则保证数据传输的私密性。   VPN只是用来描述一种架设在基础网络上的加密通道,至于实现这种效果的技术则是五花八门。比如:VT2P,VPLS,IPsec,EoMPLS等。IPsec和SSL是目前企业市场最常见额两种VPN技术。 1. IPsec   IPsec是目前部署最广泛的点对点VPN技术之一。IPsec网关设备将发往对端的数据打包加密后在因特网上传输,对端节点收到数据包后解封装发往最终用户,整个过程中用户感觉不到IPsec隧道…

Read more

现有的三种网络准入技术

  网络准入的执行在『加密』之前,只有接入用户的合法性得到保证,数据加密才有意义。目前,存在三种常用的准入技术:二层准入、三层准入、基于客户端方式的认证。 1.二层准入   二层准入是用户在获取三层IP之前必须通过的认证,当用户在接入网络时,需要同网络侧通过二层连接进行认证数据的交互,只有成功通过认证才能向DHCP服务器申请IP,从而发送数据。   二层准入的代表实现方式就是802.1X,由IEEE推出。而EAP是IETF推出的在数据链路层进行认证行为的一种机制。这个逻辑连起来就是,IETF首先制定了在数据链路层进行验证的EAP机制,然后IEEE给出了EAP在以太网环境中的运行机制。注意:EAP可以被运用在任何一种数据链路层智商,例如PPP,以太网。   802.1的认证流程可以归纳为以下四步: 1.1 端口初…

Read more

交换机中的交换原理

  之前写过一篇简单地三层交换机转发原理,本篇文章介绍二三层交换机内部交换原理,主要参考CCNP的内容。 1.二层交换原理   以太网交换机相比较集线器而言提供了如下几种形式的隔离: 限制冲突域范围在每个端口内。 主机可以工作在全双工模式。 带宽不再共享。相反的,每一个交换端口能够提供专用的带宽,甚至还包括从交换矩阵到另一个交换端口的整个转发过程。这里指数据帧从主机发出,到连接主机的交换端口,然后进入交换机的交换矩阵,最后到达目的端口,数据帧所能占用的带宽都是专用的。 错误帧不会被转发。 流量控制。 支持其他类型的智能过滤或转发。   一个数据帧穿越二层交换机一共经历如下几个步骤: RX交换端口。 入站队列。 CAM和TCAM,注意以下是并行执行的。 3.1 入站及出站的安全ACL(TCAM)。TCA…

Read more

Linux页高速缓存和页回写

  页高速缓存(cache)是Linux内核实现磁盘缓存的机制。磁盘高速缓存之所以重要的原因有二:1.访问磁盘的速度要远远低于访问内存的速度;2.数据一旦被访问,根据临时局部原理,它将很有可能在短时间内再次被访问到。 1.缓存手段   页高速缓存是由内存中的物理页面组成的,其内容对应磁盘上的物理块。页高速缓存大小能动态调整--它可以通过占用空闲内存以扩张大小,也可以自我收缩以缓解内存压力。注意,系统不一定要将整个文件都缓存,而只是缓存部分。 1.1写缓存   包括以下三种: 不缓存。直接写磁盘。 写透缓存。写操作自动更新内存缓存,同时也更新磁盘文件。 回写。程序执行写操作直接写到缓存中,后端存储不会立刻更新,而是将页高速缓存中被写入的页面标记为『脏』页,并被加入到脏页链表。然后由一个进程周期性将脏页链表中的页写回到磁盘。…

Read more

EIGRP协议

  EIGRP也被称为混合路由选择协议或高级距离矢量协议,因为他兼具距离矢量协议和链路状态协议的特征。例如,EIGRP不像OSPF那样发送链路状态分组,而发送传统的距离矢量更新,这种更新包含有关网络的信息以及从通告路由器前往这些网络的成本。EIGRP还具备链路状态协议的特征:启动时与邻居同步网络拓扑信息,随后只在拓扑发生变化时发送具体的更新。   EIGRP默认跳数为100,最大可为255,RIP为16。EIGRP并不使用跳数来计算度量值。管理距离比较: 协议 管理距离 直连接口 0 静态路由 1 EIGRP 90…

Read more

Linux进程地址空间

  对一个进程而言,它好像都可以访问整个系统的所有物理内存。即使单独一个进程,它拥有的地址空间也远远大于系统物理内存。 1.地址空间   每个进程都有一个32位或者64位的平坦(flat)地址空间,空间具体大小取决于体系结构,平坦指的是地址空间范围是一个独立的连续区间。一些操作系统提供了段地址空间,这种空间并非是一个独立的线性区域,而是被分段的,但现代采用虚拟内存的操作系统通常都是使用平坦地址空间而不是分段式的内存模式。通常情况下,每个进程都有唯一的这种平坦地址空间。一个进程的地址空间与另一个进程的地址空间即使有相同的内存地址,实际上彼此不相干。我们称这样的进程为线程。   尽管一个进程可以寻址4GB的虚拟内存,但这并不代表它就有权访问所有的虚拟地址。我们把可被访问的合法地址空间称为内存区域。通过内核,进程可以给自己的地址空间动态…

Read more

Linux块I/O

  Linux下有两种基本的设备类型,一种是字符设备,另外一种是块设备。如果一个硬件设备是以字符流的方式被访问的话,则属于字符设备;反之,如果一个设备是随机(无序)访问的话,则属于块设备。比如键盘属于字符设备,硬盘属于块设备。字符设备仅仅需要控制一个位置--当前位置,而块设备访问的位置必须能够在截至的不同区间前后移动。   扇区是块设备最小寻址单元,一般为512字节。块是文件系统的一种抽象--只能基于块来访问文件系统。虽然物理磁盘寻址是按照扇区级进行的,但是内核执行的所有磁盘操作都是按块进行的。内核还要求块大小是2的整数倍,而且不能超过一个页的长度。总结来说,扇区是设备的最小寻址单元,而块是文件系统的最小寻址单元。 1.缓冲区和缓冲区头   当一个块被调入内存时,它要存储在一个缓冲区中,每一个缓冲区与一个块对于,它相当于是磁盘块在…

Read more