redis的性能初测

[| 不指定 2012/06/12 12:13]
    最近准备用用redis,于是做了下性能测试,在一台虚拟机上跑了下,发现add命令大概1s可以执行3-5w条,使用redis官方推荐的php客户端:Predis ,使用pipe功能批量插入1w条数据的话大概要0.3-0.5s,感觉速度有些慢,仔细研究了下,发现时php库在生成那个1w条的redis命令是非常慢,一个请求要耗费掉1s的cpu时间,实在是性能杀手,考虑后续使用c实现。







Tags:
    今天有同学希望将webserver与后端fcgi换成长连接以提高性能,于是在lighttpd里直接配置proxy-core.max-keep-alive-requests即可,为了做测试,后端只启动了一个fcgi进程。然后发现了奇怪的问题,每隔几个请求就会有一个非常非常慢的连接,需要等待10s左右。

    后来决定开strace看看,由于lighttpd配了多进程,不好搞,于是改成单worker,结果问题解决了。


    这样问题就豁然开朗了,原来多个请求落到了不同的lighttpd工作进程上,而唯一的一个fcgi进程被处理第一个请求的worker起长连接占用了,结果导致其他lighttpd无法连接到后端。


    这是一个启用长连接后比较隐蔽的坑,可能会导致各个webserver的worker进程间负载不一致。需要小心了。




Tags:

mysql5.5禁用innodb引擎方法

[| 不指定 2012/05/30 13:44]
    今天发现有一个备份的mysql数据文件夹异常变大,一查发现是多了三个文件:ibdata1      ib_logfile0  ib_logfile1,前者18m,后两个各5m,原来是迁移的时候从mysql5.0迁移到了5.5,而5.5关闭innodb启动不起来,于是我就开启了innodb,由于innodb会默认增加这几个数据文件和日志文件,导致变大。尝试设置数据文件的大小,结果告诉我最小10m,还是太大,于是探索关闭innodb的方法。
    看日志发现说由于mysql程序升级了,需要运行mysql_upgrade升级一下mysql里面的数据库,这个比较简单,和mysql命令用法是一样的,运行一遍就ok了。然后发现还是无法关闭innodb,很奇怪,查了下发现原来mysql5.5默认使用innodb了,所以无法简单的关闭掉,还要设置一下默认使用的引擎为myisam才可以,在my.cnf里加上如下两句:

default-storage-engine=MYISAM
innodb=OFF

重启mysql,然后删掉那三个讨厌的文件即可。





Tags:
    一直对内存操作的速度没有数值概念,只泛泛的知道memset影响效率,反复分配释放内存影响效率,具体速度如何,从来没试过,今天试验了一下。

    写了个程序,分配一个指针数组,挨个分配内存,然后挨个释放。使用的是一台2核16g内存的虚拟机。gcc版本3.4.2

    先是分配了1w个100字节块,发现5ms以内即可完成。
    然后扩大到500字节块,速度没什么变化。

    然后分配100w个字节块,平均需要270ms左右。
    字节块扩大的2k左右,大概5s完成。
    扩大到5k左右,大概12s左右。
    以上数据均为malloc+memset数据和calloc数据,两者不相上下。

    只malloc不memset,大概能缩短20%左右,可见memset对速度还是有一定影响的,不过对于性能要求不是那么严苛的程序,设置一下提高程序稳定性也是值得的。避免某变量忘记初始化出现野值的问题。



Tags:
    wp的速度慢是出了名的,主要是因为php的执行速度比较慢,页面间require的层数比较多,除了关闭不必要的插件外,在php端做字节码缓存也有不错的效果,开启字节码缓存很简单,相关的php扩展也有很多个,在这里选了apc扩展,直接apt-get install php-apc然后重启php即可。经试验发现wp的执行时间缩短了一半以上,效果相当的不错。


    然后发现mysql信息里提示慢查询的数量比较多,可惜之前没有开启记录,在my.cnf里加上如下三条即可。

log_slow_queries    = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes

记录执行时间超过2秒的和没有用到索引的查询日志到mysql-slow.log中,这样就可以对sql语句进行调优了。



Tags: ,
    对于wordpress开启静态化url时如何在nginx下配置重写rewrite规则,网上一大抄的一个方式是说这样配置:

    if (!-e $request_filename)
    {
       rewrite ^(.+)$ /index.php?q=$1 last;
    }

    看起来没什么错误,但实际使用中总发现静态文件也被rewrite走了,去nginx官网发现有了新参数:

    在location /段里加上一句:try_files $uri $uri/ /index.php?q=$uri&$args;


    ok了,轻松愉快。


Tags: ,
    现在数据定期备份,使用的命令是mysqldump -uabc -pabc --lock-all-tables --all-databases > db.sql

    那么备份用的账号需要哪些权限才能进行这些操作呢?

    首先全局select权限是必须的。由于需要锁表,所以lock tables权限也需要,还有一个权限,就是reload,也是必须的,这个比较奇怪,猜测可能是导出的数据库中包含了权限数据库,所以需要该权限来操作。

    这三个权限就足够了,再多没有必要并且会对系统安全性产生影响。


Tags:
    今天下载一个资料,直接下载下不了,挂ssh代理拖又太慢了,着急睡觉,用vps下载发现这个地址还做了防盗链,要支持js,运行一下才能对ip进行授权,进而下下来,否则直接返回503错误。虽然模拟一下js运行的网络协议可行,但时间代价太大,那个搞出来都早下完了。于是搞了一个最简单方法。

     挂代理下载,这样代理vps的ip得到了授权,然后在vps上直接wget即可。

     但两台vps,一台实验可行,一台无效。纠结,可行的那个空间不足了。不过只要有一个行就ok,在有空间的那台vps上运行ssh -N can@canvps.com -D 127.0.0.1:9001,建立隧道。然后curl --socks5-hostname 127.0.0.1:9001 -o file http://addr/file

      搞定,可以睡觉了。等明天下完了再拖下来。



    从sendmail迁移到postfix,由于在服务器上有邮件转发服务,之前对于任意目标邮件地址都转发到固定账户,然后由一个分拣程序根据规则分发。sendmail在/etc/mail/sendmail.mc里添加:define(`LUSER_RELAY',`local:default_account')dnl,然后make -C /etc/mail重新编译一下即可。

    对于postfix就复杂很多了,参数有本地alias,virtual alias等等很多概念,刚开始尝试virtual alias,用virtual_alias_maps指定对应的正则文件,同时需调用postmap编译一下正则文件成db。设置了几条正则,发现总是命中第一条,奇怪,后来在正则表达式都加了^和$进一步限定了一下才好,比较奇怪。但后来发现针对用户名做alias不可行,因为向外发出的邮件也会做alias,导致无法发邮件出去。
    然后尝试alias_maps和alias_database,这两个参数的区别没看出来,看文档说是都是针对本地邮件的规则,默认都是/etc/aliases文件,但这个文件不支持正则,因为用的是:alias_maps = hash:/etc/aliases,尝试了一下alias_maps = regexp:/etc/postfix/aliases,发现会死循环。也比较恶心。当然,这个aliases文件也需要调用newaliases编译。

    最后又回到使用virtual_alias_maps方式,因为找到了一个方法,原来可以对域设置默认值,这样只要在/etc/postfix/virtual设置:@domain.com default_account 就ok了。然后使用virtual_alias_maps = hash:/etc/postfix/virtual,重启postfix即可。



    postfix功能强大,配置也复杂不少,文档不是很丰富。配置坑很多,有待研究。


Tags:
    今天在一台新机器上调用mutt时发现一个问题,报找不到dst@example.com这个文件,而dst@example.com是邮件的目的地址,命令在centos上运行正常,在ubuntu上就不行了,查了下,原因是我用了管道向mutt传送正文,并且用-s指定了标题,目标邮件地址跟在标题后面,导致新版mutt认为目标邮件地址也是一个标题。在地址前加上两个减号就ok了。

    echo ‘my comment" | mutt -a file -s SUBJECT -- dst@dst.com


    这时还是发现报错,说邮件过大,原来postfix默认邮件大小是10m,而我发送的备份邮件单封是20m,所以需要在/etc/postfix/main.cf中添加配置:message_size_limit = 0  不限制大小。ok了。



Tags: ,
分页: 5/31 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]