tc
tc 网络状况
增加延迟100ms ± 10ms
tc qdisc change dev eth0 root netem delay 100ms 10ms增加延迟100ms ± 10ms, 下一个随机数25%依赖于上一个
tc qdisc change dev eth0 root netem delay 100ms 10ms 25%随机丢包0.1%
tc qdisc change dev eth0 root netem loss 0.1%
tc 网络状况
增加延迟100ms ± 10ms
tc qdisc change dev eth0 root netem delay 100ms 10ms
增加延迟100ms ± 10ms, 下一个随机数25%依赖于上一个
tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
随机丢包0.1%
tc qdisc change dev eth0 root netem loss 0.1%
netstat 用于列出所有tcp,udp连接
显示当前所有活动的网络连接
~ » netstat -an | head -n 10 wazi@eli
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 172.16.13.172.54304 180.149.131.55.8843 SYN_SENT
tcp4 0 0 172.16.13.172.54303 45.32.41.155.44005 ESTABLISHED
tcp4 0 0 127.0.0.1.60409 127.0.0.1.54302 ESTABLISHED
tcp4 0 0 127.0.0.1.54302 127.0.0.1.60409 ESTABLISHED
tcp4 0 0 172.16.13.172.54300 45.32.41.155.44005 ESTABLISHED
tcp4 0 0 127.0.0.1.60409 127.0.0.1.54299 ESTABLISHED
tcp4 0 0 127.0.0.1.54299 127.0.0.1.60409 ESTABLISHED
tcp4 0 0 172.16.13.172.54296 111.203.187.167.3306 ESTABLISHED
连接状态:
LISTEN:侦听来自远方的TCP端口的连接请求
SYN-SENT:再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:代表一个打开的连接
FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:没有任何连接状态
显示所有连接ip
netstat -n -p | grep ES | awk ‘{print $5}’ | awk -F: ‘{print $1}’
显示数量
netstat -anp |grep ‘tcp|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -d
iostat
avg-cpu: %user %nice %system %iowait %steal %idle
1.95 0.06 0.41 0.03 0.00 97.56
cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
注:
iostat -d -x -k 1 1
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 7.38 0.04 4.60 0.73 63.26 27.59 0.06 12.58 19.94 12.53 6.63 3.07
vdb 0.00 6.97 0.21 6.14 6.30 180.95 58.99 0.07 11.59 4.15 11.85 0.61 0.39
rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
r/s: 每秒完成的读 I/O 设备次数。即 rio/s
w/s: 每秒完成的写 I/O 设备次数。即 wio/s
rsec/s: 每秒读扇区数。即 rsect/s
wsec/s: 每秒写扇区数。即 wsect/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz: 平均I/O队列长度。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
备注:如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,
io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 idle小于70% IO压力就较大了,一般读取速度有较多的wait。 同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。
另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。
avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读定速度是这个来决定的。
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。
形象的比喻:
r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例
设备IO操作:总IO(io)/s = r/s(读) +w/s(写)
平均等待时间=单个I/O服务器时间*(1+2+…+请求总数-1)/请求总数
每秒发出的I/0请求很多,但是平均队列就4,表示这些请求比较均匀,大部分处理还是比较及时。
|
|
|
|
|
|
|
|
|
|
原文链接:http://www.yusufaytas.com/who-needs-architect/
架构师?根据维基百科,架构师指的是计划,设计和监督建筑的构造。因此,很明显我们可以看出架构师这个角色取自土木工程。对应的,我们得到了软件架构。软件架构指的是软件系统的高层结构。正如你可能猜到的,我不认为我们需要一个正式的架构师角色,而是需要软件架构。在开始另一次争吵之前,让我们先看一下矩阵架构场景。
很酷吧?这对于每一个构建软件的人来说都是应得的。就是这样。我认为任何工作的软件都有一种架构。哇,那每个人都是架构师了?其实,也对也不对。对的方面是,一个架构需要架构师(们)。不对的地方是,我不认为没有必要定义一个正式的角色,把每个人都叫做架构师。
回到土木工程。一个架构师设计一个建筑,考虑的是美观,艺术性和构造的外形。一个土木工程师则专注于设计的每个元素,是架构的实践者。就这样,没有更多的定义。正如你所看到的,这些是定义明确的角色,它们有一种分层的感觉。当开发软件时,你认为我们有或应该有这种分层吗?不。当然一个有经验的工程师与一个刚毕业的有不同的观点。然而这两种工程师同样地影响着软件系统和架构。如果把一个叫做架构师而另外一个不是,你认为这样公平吗?不!因此,一个正式的架构师职位并不适合软件开发领域。
如果你认为我们只需要软件“软件架构”这个职称来强调其资历水平,我不同意。大多数大公司有着很好的开发路径。差不多是软件工程师1->软件工程师2->资深软件工程师->核心工程师。让我强调一下,他们不需要一个架构师。
一些问题和解答:
如果把核心工程师当作架构师。我们需要总工程师来评价我们构建的每个软件吗?简单的讲不。因为他们在构建自己的项目。
在客户和团队之间,我们真的需要一个代理吗?为什么我们不能都与客户坐在一起,来共同做决定?我认为应该整个团队一起来理解繁乱的需求并从中提出具体任务。当然,有时需要一些有经验的人,领导其他成员。但是我们不必叫他们架构师。他们只是经验丰富的开发人员。
在一个没有架构师的团队里,人们就不能写整洁,高质量的代码了吗?系统设计的阶段就可以去掉?我认为一个好的团队应该先做设计审查,然后代码审查,来分享知识,提高代码质量,倾听不同的意见。如果能很好的沟通交流,开发人员根据能力水平分配任务,那么就可以交付高质量的软件,即使没有一个正式的架构师角色。
我们真的需要一个架构师来领导和制定策略吗?难道不是项目经理来领导团队并决定策略?我认为由于这两个方面的原因,才有了项目经理这个职位。那么技术领导呢?由于软件开发像手工艺,工匠(高级工程师)应该分享如何开发高水平的软件。因此,我们不需要一个正式的架构师角色。
总的来说,我不认为我们需要为设计架构分离出一个专门的角色。我认为团队中的每个成员都应该参与架构讨论,由团队共同完成整个设计。而且,架构师并不需要对应于开发经验水平。最后,再见架构师,让我们专心于架构本身。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SSH全称secure shell,是管理远程服务器最常用的方法。通过使用一系列的
加密技术,SSH 提供了这样一个机制:建立安全加密连接,互相授权,发送命令和返回输出结果。
在其他文章中,我们讨论过了如何配置ssh访问,如何使用ssh连接,和一些ssh建议和技巧。
在本文,我们将介绍SSH的底层加密技术和建立加密连接的方法。这对于理解多个加密层以及建立连接,相互授权的步骤是非常有用的。
为了安全的传输信息,SSH在传输过程中的不同阶段,采用不同类型的控制技术。这些技术包括对称加密,非对称加密和哈希。
加密和解密组件的关系决定了一个加密技术是对称的还是非对称的。
对称加密指的是一个密钥既可以用来加密消息,也可以用来解密消息。这意味着通信双方都持有相同的密钥,既可以加密又可以解密。这种加密方式又叫做“共享加密”或“密钥加密”。典型的是只有一个密钥或者一对关系紧密的密钥(获得另一个密钥并不重要)。
在SSH中,对称加密用于加密整个连接。与一些用户猜想的不同,公/私非对称密钥只用来授权。对称加密也用于密码授权。
客户端和服务器一起生成密钥,生成的密钥不会被第三方知道。密钥是通过一个叫做密钥交换算法生成的。交换的结果是服务器和客户端双方获得相同的密钥。这个流程将在后面详细介绍。
对称加密密钥的生成是基于session的,并建立了实际传输数据的加密。一旦密钥建立所有数据必须通过共享密钥加密。这是在授权客户端之前完成的。
SSH可配置使用多种不同的对称加密系统,包括AES,Blowfish,3DES,CAST128,和Arcfour。客户端和服务器都有一个算法列表,根据优先级来决定使用哪种加密算法。客户端列表中的第一选择,如果服务器也支持,这个算法将被采用。
在Ubuntu 14.04,客户端和服务器的默认算法列表均为:aes128-ctr, aes192-ctr, aes256-ctr, arcfour256, arcfour128, aes128-gcm@openssh.com, aes256-gcm@openssh.com, chacha20-poly1305@openssh.com, aes128-cbc, blowfish-cbc, cast128-cbc, aes192-cbc, aes256-cbc, arcfour。 这就是说,如果两个Ubuntu14.04机器建立连接,(如果没有通过修改配置文件,修改默认算法列表),它们将采用aes128-ctr算法来加密连接。
非对称加密中,需要两个密钥:一个叫公钥,另一个叫私钥。公钥可以被放到任何地方。私钥应该保密,不能与其他方共享。私钥不能靠公钥计算获得。公钥和私钥的关系是:公钥加密的数据只能靠私钥解密。这个操作是单向的,也就是说,公钥没有办法解密自己加密的数据。
SSH在很多地方使用了非对称加密。比如,在建立对称加密时,交换密钥的过程中,双方产生临时密钥对,用来交换共享密钥(对称加密,用于加密整个session)。
非对称加密在SSH中最被人熟知的用途是基于密钥的授权。客户端生成密钥对,然后将公钥上传到访问服务器,放到~/.ssh/authorized_keys 文件中。
在服务器与客户端的对称加密建立以后,客户端需要被授权访问。服务器使用公钥加密一条消息并发送给客户端。如果客户端能解密这条消息,说明拥有私钥,于是授权成功。
SSH还用了一种数据处理叫做哈希加密。哈希加密用来生成数字签名。哈希加密的主要特点是不能反向解密。生成的数字签名不可预测,而且是唯一的。
使用相同的哈希算法加密消息产生的hash值是不变的。修改消息的任何部分将产生完全不同的哈希值。用户不能通过hash值获得原始的消息,但是可以根据能判断一个消息是否对应给定的hash值。
基于以上特性,哈希值一般用于数据完整性验证和消息可靠性检查。
SSH中哈希主要用于HMAC(hash-based message authentication code基于hash的消息授权检查),用来保证收到的消息是完整的,未修改的。
<未完待续…>