目录:
PowerDNS简单教程(4):优化篇(本篇)
 
最后一篇,介绍一下PowerDNS的性能优化。其实,这才是我的终极目的。简单的说,就是把QPS调到尽可能高。QPS,也就是每秒钟接收请求的数量,这是服务器抗压能力的一项很重要的指标。我的初步想法是让QPS达到50000+(其实这是领导给的要求)。第一眼看到这个数字说实话我的内心是有点崩溃的,因为这个数字看上去有点大,而我也不知道一个服务器到底承载能力有多强,不过同事说刚装好的pdns已经可以达到30000+,而在某某公司这个数值是位数的,于是我稍稍安心了点。
不过这里还有另一个问题:QPS的数值要怎么测呢?在同事的帮助下我找到一个工具,是BIND下自带的一个开源的专门测试DNS性能的小工具,叫做queryperf。安装起来比较简单,下载一个bind,进入bind目录下的contrib/queryperf目录中:
ls    # 看看这里都有什么
sudo ./configure
sudo make
ls
可以看到变出来一个名叫queryperf的文件(可执行文件)。没错就是这样神奇,快快快给个崇拜的眼神 ~咳咳,回来回来,这个queryperf文件就是我们要的东西,其他的都没有什么用了。
有工具了,还需要一个测试文件,内容是“域名+空格+类型”这样格式的记录。我写了一个脚本来生成,脚本大概是酱婶滴:
这样就生成了50万条记录。之后开始测试。
./queryperf -d (你的测试文件) -s (你的DNS服务器地址,默认localhost) -p (DNS服务器端口,默认53)
常用命令可以使用-h查看。
测试的结果应该是酱婶滴(这是第一次达到5万QPS的截图留念,后来又高了不少了):
如果不是的话,查一查是不是脚本写的有问题,还有地址、端口、数据库等等配置是否正常,可以用monitor模式启动pdns然后盯着看一看查询过程。
看到结果其实查询原理就简单了,N条记录,M秒查询出结果,相除一下就是QPS了。
 
好了热身活动结束,下面开始正式优化的过程(上面的测试结果是我已经优化过一部分了):
优化的思路主要有这么几个方面:PowerDNS设置;MySQL优化;Linux优化。
(1)PowerDNS方面:
可参考官网的优化方案:https://doc.powerdns.com/md/authoritative/performance/。要设置的内容都在pdns.conf配置文件中。
①缓存。在DNS服务器运行的过程中,可以dump查看一下相关参数,例如缓存碰撞的结果,如果miss较多,说明应该调大缓存的生存时间。在pdns.conf中控制缓存生存时间的主要有4个变量:cache-ttl,negquery-cache-ttl,query-cache-ttl,recursive-cache-ttl,默认的时间都不太一样,全部改成60。
②线程。PowerDNS有两个地方用到了线程,分别是receiver-threads和distributor-threads,官方解释是接收线程和分发线程。但是这两个线程并不是越多越好的。一是因为mysql的最大连接数有限,如果开多了线程,在monitor中可以看到,根本就没有连接到mysql;而是因为线程数过多的话,CPU要一直进行上下文切换,时间浪费过多。官网介绍说,distributor-threads是越小越好的,设置为1的时候会达到最优;而receiver-threads我经过实际测试,设置为12的时候QPS达到了最优。这个并没有什么科学的解释推理,只是经多方尝试后得到的结果。个人感觉,这个跟CPU核心数是有关的,只是没其他机器可以做实验了。
③日志。PowerDNS在查询过程中有日志记录,这个是会浪费一定的时间的。可以把记录日志相关的参数关掉。log-dns-details和log-failed-updates关掉实际测试并没有什么卵用,但是无意中发现query-logging关掉会有显著提高。(所谓“关掉”并不是把这个参数注释掉,而是让参数值为no)
官网中还介绍了pdns_control中看到的参数代表的含义:https://doc.powerdns.com/md/authoritative/performance/。同时也介绍了pdns.conf中的每个参数的含义:https://doc.powerdns.com/md/authoritative/settings/ 。我看到的有意义的也就上面介绍的这几个了。
(2)MySQL:
MySQL优化百度上能找到很多,我看了一部分介绍,根据其中的几个优化了一下MySQL。优化方法是进入用root进入mysql
show variables; 可以看到当前的所有变量(这是主要修改的地方)
show status; 可以看到当前的状态(根据状态来修改)
set xxx=yyy;可以修改变量(xxx是变量名,yyy是变量值)
如果不让改,那就到/etc/mysql/my.cnf配置文件中改,之后sudo service mysql restart重启数据库服务。
优化后并没有看到明显的效果。我猜想MySQL还没有达到瓶颈,所以优化起来对QPS提高目前还没有太多帮助。
(3)Linux:
Linux参数会影响到MySQL的一些性能。既然MySQL么有达到瓶颈,那么优化Linux意义也不是太大。
最终,按我司服务器的优化结果,本机QPS达到了84000+。
 
以上。在实际测试QPS的过程中,需要关注系统硬件的相关信息,我使用的是vmstat,需要用的同学请自行百度。上下文切换的瓶颈就是通过这个工具看出来的。现在达到了CPU瓶颈,我还不知道怎么解决。另外,猜想pdns连接backend的过程还是有地方可以优化的,这是需要pdns和MySQL配合完成的地方。继续优化。
vmstat使用方法可以看我之前发过的博客:http://www.cnblogs.com/anpengapple/p/5197530.html 没错,当时就是为了做PowerDNS优化才找的。
 
******************************即将结束的分隔线******************************
PowerDNS就介绍到这里了,不是很深,原因是:一是DNS的知识我也懂的不多,二是把PowerDNS搭建起来用起来这些足够了,三是PowerDNS的中文资料很少,官方英文资料我啃起来也是头疼(好吧这才是主要原因)。网上的中文博客基本也就是教了教怎么安装PowerDNS和Poweradmin,并没有涉及到功能及优化方面,而且CentOS居多,Ubuntu的博客甚少。不知道是不是因为玩PowerDNS的都是牛人,没有遇到什么问题,因此觉得没有什么好记录的。写这几篇一是为了备忘,同时也是为了将来有类似我这样的菜鸟可以拿来用用。秉承着一个理念:予人玫瑰,手留鱼香,肉丝。但愿真的有用吧。

PowerDNS简单教程(4):优化篇的更多相关文章

  1. PowerDNS简单教程(2):功能篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇(本篇) Po ...

  2. PowerDNS简单教程(1):安装篇

    这一篇开始直接是PowerDNS教程,连续四篇.DNS的相关背景知识我就不介绍了,有需要的话看看 http://baike.baidu.com/link?url=QcthFpAb2QydMqcMJr9 ...

  3. PowerDNS简单教程(3):管理篇

    目录: PowerDNS简单教程(1):安装篇 http://www.cnblogs.com/anpengapple/p/5205130.html PowerDNS简单教程(2):功能篇 http:/ ...

  4. 史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)

    转载请标明出处: https://www.fangzhipeng.com/springcloud/2017/07/12/sc03-feign/ 本文出自方志朋的博客 最新Finchley版本请访问: ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试

    日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化

    阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...

  7. MySQL优化篇(一),我可以和面试官多聊几句吗?——SQL优化流程与优化数据库对象

    我可以和面试官多聊几句吗?只是想偷点技能过来.MySQL优化篇(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. MyISAM表锁和InnoD ...

  8. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  9. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

随机推荐

  1. Python基础(9) - 类

    Python 看下面一个简单类: >>> class MyClass(object): ... """ ... this is a class with ...

  2. Java下的i++问题

    在解决一道面试题目时遇到问题. public class Inc { public static void main(String args[]){ Inc inc = new Inc(); int ...

  3. Java中final修饰参数的作用

    在方法参数前面加final关键字就是为了防止数据在方法体中被修改. 主要分两种情况:第一,用final修饰基本数据类型:第二,用final修饰引用类型. 第一种情况,修饰基本类型(非引用类型).这时参 ...

  4. 特殊引用类型(string)

    private string FuncWithParameters(int param1, String param2, List<string> param3) { // 我们在这里改变 ...

  5. Layer UI 模块化的用法(转)

    此文章适合入门的同学查看,之前因为项目的原因,在网上找了一套Layer UI做的后台管理系统模板,完全不懂LayUI里面的JS用法,看了官方文档和其它资料后才明白怎么去实现模块化这个例子,但是还是感觉 ...

  6. JVM(一)

    Java 环境 Java 运行过程 下面几张图,我们可以了解到 Java 这门语言是如何进行运行的. java文件通过编译器编译成class文件,然后在虚拟机中转化为机器语言运行在机器上. 上图展示了 ...

  7. Aspose.Cells 对excel的使用总结

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  8. [android] 界面切换的核心方法

    根据效果图拆分界面 主体部分 View ==> ViewGroup ==> RelativeLayout,主体部分使用RelativeLayout作为占位 View和ViewGroup的区 ...

  9. <td>标签clospan和rowspan 可横跨列数和行数

    <td colspan="2"> <input type="text" name="reason_other" size= ...

  10. Spring课程 Spring入门篇 5-4 advice应用(上)

    1 解析 1.1 通知执行顺序 2 代码演练 1 解析 1.1 通知执行顺序 aop执行方式为:前置通知==>所要增强的方法==>后置通知==>最终通知 在出现异常时会进行:前置通知 ...