目录:
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. vue-cli中使用stylus

      1.在package.json文件中写入依赖: "stylus-loader": "^2.5.0", "stylus": "0 ...

  2. iOS 富文本属性

    // NSFontAttributeName 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12 // NSForegroundColorAttributeNam 设置字体颜色,取 ...

  3. [转]Entity FrameWork利用Database.SqlQuery<T>执行存储过程并返回参数

    本文转自:http://www.cnblogs.com/xchit/p/3334782.html 目前,EF对存储过程的支持并不完善.存在以下问题:        EF不支持存储过程返回多表联合查询的 ...

  4. 禅道和JIRA大对比

    转自:https://blog.csdn.net/qq_40543535/article/details/78182636?locationNum=9&fps=1 禅道和JIRA大对比 置顶 ...

  5. D3基础---简介和数据

    D3.js是一种数据操作类型的javascript库(也可视其为插件):结合HTML,SVG和CSS,D3可以图形化的,生动的展现数据. d3获取:http://d3js.org/ 在代码文件中引入D ...

  6. Spring.Net IOC基本应用和在MVC4中的应用

    1.Spring.Net的IOC简单应用 新建一个解决方案添加一个控制台应用程序和一个业务层一个业务层的接口层,通过配置,让控制台应用程序调业务层的方法 1)新建如下图所示,BLL为业务层,通过Spr ...

  7. HDU 2167 Pebbles 状态压缩dp

    Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. Redis 常见命令

    0. 5种数据类型 String(字符串) List(列表) Hash(字典) Set(集合) Sorted Set(有序集合) 1. String 字符串 set key value 设置key=v ...

  9. unity3d之实现各种滑动效果

    一. 点击滑动页面 新建了一个带mask的prefab,加上代码只需要将图片prefab.按钮prefab和所想添加的图片 拖进去会自动生成按钮,滑动速度可以随意调time,滑动效果用itween实现 ...

  10. 排序算法lowb三人组-选择排序

    def get_min_pos(li): min_pos = 0 for i in range(1, len(li)): if li[i] < li[min_pos]: min_pos = i ...