通常来讲,在域名解析的过程中,有关我们自己的二级域名的权威NS信息,是从顶级域获取的,而相关授权 Name Server 也是提前在域名注册商的管理页面中配置的,似乎无法对权威NS这一层做CDN智能访问(除了BGP anycast routing,后文也有介绍)。
本文就是为了解决这个问题而进行的一个研究,较详细的介绍了一些背景知识和相关思路,提供一个没有BGP条件的次优的解决方案。
域名解析是一个相对复杂的过程,需要多个环节,遍历多个DNS服务器,才能获取域名的IP地址。解析过程如下图:
(图片引用自阿里公共DNS网站的知识中心页面)
Enhanced Intel SpeedStep® Technology(EIST,增强型 Intel SpeedStep® 动态节能技术),是Intel公司专门为移动平台和服务器平台处理器开发的一种动态节能技术,在实现高性能的同时又能满足移动式系统的节能需求。到后来,新推出的桌面处理器也内置了该项技术,Intel CPU产品中频率在2.8G以上的Pentium 4 6xx系列、Pentium D以及CORE全系列处理器都已支持EIST技术。它能够根据不同的系统工作量自动调节处理器的电压和频率,以减少耗电量和发热量。
传统的英特尔 SpeedStep 动态节能技术,在处理器负载发生变化时,需要“捆绑式地”调高或调低CPU的电压与频率(即要想调节频率,必先调节电压)。增强型的 Intel SpeedStep 动态节能技术在该传统架构上构建,采用了如下更新的设计策略,包括:
电压和频率变化的分离。通过向上和向下以小幅增量独立调节电压,处理器能够减少系统不可用的时间(在频率变化时CPU所处理的指令是需要暂停的)。因此,系统就可以更频繁在不同的电压和频率状态之间转换,提供更好的功率/性能平衡。
时钟分区和恢复(Clock partitioning and recovery)。总线时钟在状态转换期间持续运转(甚至当核心时钟和锁相环路(phase-locked loop)均停止时),从而允许逻辑电路保持活动状态。在增强型 Intel SpeedStep 动态节能技术下内核时钟还能比传统架构下更快地重新启动。
增强型 Intel SpeedStep 动态节能技术降低了与更改电压/频率对 (称为p-state) 相关的等待时间,因此状态转换可以更频繁的进行,从而实现更细粒度的依需求切换和按需的功率/性能平衡优化。
BIOS中对应的设置为:
CPUfreq,也即CPU speed scaling,是 Linux 内核用来支持在移动处理器上显式调节CPU主频的子系统。Linux内核做了大量工作用来加强其模块化架构,下图显示下2.6.8内核下的cpufreq框架:
图:Cpufreq 基础框架概览
在数据中心网络内,机器之间数据传输的往返时间(rtt)一般在10ms以内,为此调内部服务的超时时间一般会设置成50ms、200ms、500ms等,如果在传输过程中出现丢包,这样的服务超时时间,tcp层有机会发现并重传一次数据么?如果设置成200ms以内,答案是没有机会,原因是linux系统下第一次重传时间等于传输的往返时间上至少加上200ms的预测偏差值,即如果rtt值是7ms,第一次重传超时时间至少是207ms,这样如果对某个接口的超时时间设置成200ms以内, 即便是rtt时间很小,仍然无法容忍一次丢包,因为在tcp发现丢包之前,该接口已经超时了。
本文针对linux系统tcp数据包第一次重传时间的计算进行探究,结果会让人大吃一惊。提出的优化方法,理论上能够降低内部服务调用时延和出错量。
tcp发送数据包后,会设置一个定时器,到期后如果还没有收到对方的回复(ack),就会重传数据包。从发出数据包到第一次重传之间的间隔时间称为retransmission timeout(RTO),rto由数据包的往返时间(rtt)加上rtt的预测偏差(波动值)计算出来。
即 rto = srtt + rttvar,其中srtt是rtt的平滑值,而rttvar是波动值,代表可能的预测偏差。
接下来我们做一个试验。
先ping一下www.weibo.com,看一下数据包的往返时间,如下:
[xiaohong@localhost ~]$ ping www.weibo.com PING www.weibo.com (123.125.104.197) 56(84) bytes of data. 64 bytes from 123.125.104.197: icmp_seq=1 ttl=55 time=3.65 ms 64 bytes from 123.125.104.197: icmp_seq=2 ttl=55 time=3.38 ms 64 bytes from 123.125.104.197: icmp_seq=3 ttl=55 time=4.34 ms 64 bytes from 123.125.104.197: icmp_seq=4 ttl=55 time=7.82 ms
再看一下tcp对到www.weibo.com的rtt相关数据,下面的命令是针对centos7(如果是以下的版本,运行的命令是ip route list tab cache)如下:
[xiaohong@localhost ~]$ sudo ip tcp_metrics 123.125.104.197 age 22.255sec rtt 7375us rttvar 7250us cwnd 10
由上面看出,平滑后的rtt值约为7ms,rttvar约为7ms,那按理说rto值应该是14ms左右,也就是等14ms后,如果没有收到对方的响应,就会重传数据。实际的情况会是这样么?
在一个命令窗口里,运行下面的命令:
[xiaohong@localhost ~]$ nc www.weibo.com 80 GET / HTTP/1.1 Host: www.weibo.com Connection:
同时再开一个命令行窗口里,运行下面的命令:
[xiaohong@localhost iproute2-3.19.0]$ ss -eipn '( dport = :www )' tcp ESTAB 0 0 10.209.80.111:56486 123.125.104.197:80 users:(("nc",1713,3)) uid:1000 ino:14243 sk:ffff88002c992d00 <-> ts sack cubic wscale:0,7 rto:207 rtt:7.375/7.25 mss:1448 cwnd:10 send 15.7Mbps rcv_space:14600
从上面的结果可以看出,实际的rto值是207ms,相当于rtt值加上200ms,为什么呢?
百度官方推荐的UEditor for Typecho第三方插件,支持Typecho 1.0/0.9/0.8。
1、下载和安装
注:Typecho 1.0/0.9用户请在[控制台/个人设置]中关闭Markdown解析再启用插件!
1)直接下载zip压缩包: 点这里 。
2)解压后,将 UEditor 文件夹放入 /typecho/usr/plugins/ 下,然后到Typecho后台启用插件即可。
2、修改主题文件
为了在页面展示中显示语法高亮,还需要修改一下主题文件,在 footer.php 中加入如下代码:
<!--加入高亮的js和css文件,如果你的编辑器和展示也是一个页面那么高亮的js可以不加载--> <script type="text/javascript" src="<?php $this->options->siteUrl(); ?>usr/plugins/UEditor/ueditor/third-party/SyntaxHighlighter/shCore.js"></script> <link rel="stylesheet" type="text/css" href="<?php $this->options->siteUrl(); ?>usr/plugins/UEditor/ueditor/third-party/SyntaxHighlighter/shCoreDefault.css"/> <script type="text/javascript"> //为了在编辑器之外能展示高亮代码 SyntaxHighlighter.highlight(); // UE.getEditor('myEditor'); </script>
3、修复不会自动换行的问题
如果你的内容展示区域不够宽的话,那么代码如果超过显示区域的宽度后,仍然会继续延伸,造成页面不美观。
可以修改 shCoreDefault.css 来加入强制换行的属性:
vi /typecho/usr/plugins/UEditor/ueditor/third-party/SyntaxHighlighter/shCoreDefault.css
找到如下这一段代码,增加一句 word-break:break-all;
.syntaxhighlighter { width:100%!important; margin:.3em 0 .3em 0!important; position:relative!important; overflow:auto!important; background-color:#f5f5f5!important; border:1px solid #ccc!important; border-radius:4px!important; border-collapse:separate!important; word-break:break-all //增加这一句 }
备注:当修复了自动换行的问题后,另一个问题也随之而来。
因为一行代码显示成两行了,而左侧的行号并未因此而做出改变,这样就会造成高度不统一而错位了。
实际上UEditor 集成的 SyntaxHighlighter 版本较低,是1.5版本的,其官网都已经是3.0.83版本了。 如果插件作者能帮忙更新下就好了!
好,既然你来到这里,我想你的原因和目的都很清楚,我也就不费话了(不摘抄网上转来转去的重复内容了)。
基础知识:建议先了解一下 rrdtool 及 rrd 数据库的工作原理,参考阅读《rrdtool学习笔记》(好吧,如果你不想阅读,本文也可以给你一个清晰的指导来完成1分钟精度的修改!)。
要为Cacti配置1分钟的采集精度,在采集数据开始画图之前需要先做如下4个事情。
创建1分钟的RRA;
在Cacti Data Source 模板中修改“Step”和“Heartbeat”的值;
在系统 cron 中修改 poller 的轮询时间间隔;
在 Cacti 配置中修改 poller 的轮询时间间隔。
之所以首先要创建1分钟的RRA,是因为一旦使用了错误的RRA采集数据,那么就比较难修正了,意味着旧的数据要被丢弃重新开始收集(虽然在某些情况下可以通过rrdtool的 dump 和 restore 功能来在原有数据的基础上进行修改,但那需要比较好的掌握 rrdtool 知识)。
以我的VPS为例,只有网络流量图需要精度较高,所以我选择创建新的1分钟 RRA,保留5分钟的默认 RRA 给其他图用(比如 Filesystem space、Memory free 监控等)。
1、首先先创建需要的1分钟RRA:
“Console” -> “Management” -> “Data Sources” -> RRAs ,Cacti 默认的 RRAs 如下:
这个RRA的定义可以决定我们不同精度的数据最大保存周期,保存时间 = Step * Steps * Rows 。比如默认的Cacti 5分钟精度的 Daily (5 Miniute Average) 这个RRA精度的数据保存时间为:(5 * 1 * 600) / 60m = 50h ≈ 2d,注意:
“Step”是步进时间,是在 Data Source 中定义的,Cacti 的话就是我们下面第二步提到的在 Data template 里定义的 Step 值(单位秒);
“Steps”是步进个数,即是指上图 RRA 中定义的 Steps 值;
注:这个保存时间不是上图中的 Timespan 的值,Timespan 指的是我们点击某一个图之后出现的 详细几个分时间段的图中 显示的时间段的长度。
好了,正式开始我们的RRA修改和创建方法说明。
运行环境:Debian 7.8
Cacti监控的Poller查询snmp,每查询一次就输出几行 Connection 信息到/var/log/syslog,如:
Feb 10 11:18:01 install snmpd[2589]: Connection from UDP: [127.0.0.1]:42043->[127.0.0.1] Feb 10 11:18:01 install snmpd[2589]: Connection from UDP: [127.0.0.1]:60018->[127.0.0.1] Feb 10 11:18:01 install snmpd[2589]: Connection from UDP: [127.0.0.1]:38451->[127.0.0.1] Feb 10 11:18:01 install snmpd[2589]: Connection from UDP: [127.0.0.1]:54567->[127.0.0.1] Feb 10 11:18:01 install snmpd[2589]: Connection from UDP: [127.0.0.1]:56727->[127.0.0.1]
欲要修改snmp日志输出的详细度,可将启动参数 -Lsd 修改为 -LSwd。具体如下:
# vi /etc/default/snmpd
#SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid' SNMPDOPTS='-LSwd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid'
重启服务:
# service snmpd restart
---------------------------
分析思路:
1)查看进程(ps aux),能看到启动参数:
/usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
2)查看启动脚本,看如何修改:
以上可知,需要修改 /etc/default/snmpd 里的参数。
3)查看帮助(man snmpcmd),有详细解释(只是缺少例子):
LOGGING OPTIONS The mechanism and destination to use for logging of warning and error messages can be controlled by passing various parameters to the -L flag. -Le Log messages to the standard error stream. -Lf FILE Log messages to the specified file. -Lo Log messages to the standard output stream. -Ls FACILITY Log messages via syslog, using the specified facility ('d' for LOG_DAEMON, 'u' for LOG_USER, or '0'-'7' for LOG_LOCAL0 through LOG_LOCAL7). There are also "upper case" versions of each of these options, which allow the corresponding logging mechanism to be restricted to certain priorities of message. Using standard error logging as an example: -LE pri will log messages of priority 'pri' and above to standard error. -LE p1-p2 will log messages with priority between 'p1' and 'p2' (inclusive) to standard error. For -LF and -LS the priority specification comes before the file or facility token. The priorities recognised are: 0 or ! for LOG_EMERG, 1 or a for LOG_ALERT, 2 or c for LOG_CRIT, 3 or e for LOG_ERR, 4 or w for LOG_WARNING, 5 or n for LOG_NOTICE, 6 or i for LOG_INFO, and 7 or d for LOG_DEBUG. Normal output is (or will be!) logged at a priority level of LOG_NOTICE