( ! ) Deprecated: Function WP_Dependencies-&gt;add_data() was called with an argument that is <strong>deprecated</strong> since version 6.9.0! IE conditional comments are ignored by all supported browsers. in /var/www/html/wp-includes/functions.php on line 6131
Call Stack
#TimeMemoryFunctionLocation
10.0000484200{main}( ).../index.php:0
20.0007484552require( '/var/www/html/wp-blog-header.php ).../index.php:17
30.20774240832require_once( '/var/www/html/wp-includes/template-loader.php ).../wp-blog-header.php:19
40.24954270712include( '/var/www/html/wp-content/themes/twentyfifteen/archive.php ).../template-loader.php:125
50.24954270712get_header( $name = ???, $args = ??? ).../archive.php:19
60.24954270928locate_template( $template_names = [0 => 'header.php'], $load = TRUE, $load_once = TRUE, $args = [] ).../general-template.php:48
70.24954271024load_template( $_template_file = '/var/www/html/wp-content/themes/twentyfifteen/header.php', $load_once = TRUE, $args = [] ).../template.php:749
80.24994271568require_once( '/var/www/html/wp-content/themes/twentyfifteen/header.php ).../template.php:814
90.25014278976wp_head( ).../header.php:18
100.25014278976do_action( $hook_name = 'wp_head' ).../general-template.php:3197
110.25014279192WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:522
120.25014279192WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:365
130.25034401392wp_enqueue_scripts( '' ).../class-wp-hook.php:341
140.25034401392do_action( $hook_name = 'wp_enqueue_scripts' ).../script-loader.php:2311
150.25034401608WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:522
160.25034401608WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:365
170.25044409128twentyfifteen_scripts( '' ).../class-wp-hook.php:341
180.25054410648wp_style_add_data( $handle = 'twentyfifteen-ie', $key = 'conditional', $value = 'lt IE 9' ).../functions.php:440
190.25054410648WP_Styles->add_data( $handle = 'twentyfifteen-ie', $key = 'conditional', $value = 'lt IE 9' ).../functions.wp-styles.php:245
200.25054410648WP_Dependencies->add_data( $handle = 'twentyfifteen-ie', $key = 'conditional', $value = 'lt IE 9' ).../class-wp-styles.php:385
210.25054410648_deprecated_argument( $function_name = 'WP_Dependencies->add_data()', $version = '6.9.0', $message = 'IE conditional comments are ignored by all supported browsers.' ).../class-wp-dependencies.php:317
220.25054410968wp_trigger_error( $function_name = '', $message = 'Function WP_Dependencies->add_data() was called with an argument that is <strong>deprecated</strong> since version 6.9.0! IE conditional comments are ignored by all supported browsers.', $error_level = 16384 ).../functions.php:5925
230.25064411720trigger_error( $message = 'Function WP_Dependencies-&gt;add_data() was called with an argument that is <strong>deprecated</strong> since version 6.9.0! IE conditional comments are ignored by all supported browsers.', $error_level = 16384 ).../functions.php:6131

( ! ) Deprecated: Function WP_Dependencies-&gt;add_data() was called with an argument that is <strong>deprecated</strong> since version 6.9.0! IE conditional comments are ignored by all supported browsers. in /var/www/html/wp-includes/functions.php on line 6131
Call Stack
#TimeMemoryFunctionLocation
10.0000484200{main}( ).../index.php:0
20.0007484552require( '/var/www/html/wp-blog-header.php ).../index.php:17
30.20774240832require_once( '/var/www/html/wp-includes/template-loader.php ).../wp-blog-header.php:19
40.24954270712include( '/var/www/html/wp-content/themes/twentyfifteen/archive.php ).../template-loader.php:125
50.24954270712get_header( $name = ???, $args = ??? ).../archive.php:19
60.24954270928locate_template( $template_names = [0 => 'header.php'], $load = TRUE, $load_once = TRUE, $args = [] ).../general-template.php:48
70.24954271024load_template( $_template_file = '/var/www/html/wp-content/themes/twentyfifteen/header.php', $load_once = TRUE, $args = [] ).../template.php:749
80.24994271568require_once( '/var/www/html/wp-content/themes/twentyfifteen/header.php ).../template.php:814
90.25014278976wp_head( ).../header.php:18
100.25014278976do_action( $hook_name = 'wp_head' ).../general-template.php:3197
110.25014279192WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:522
120.25014279192WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:365
130.25034401392wp_enqueue_scripts( '' ).../class-wp-hook.php:341
140.25034401392do_action( $hook_name = 'wp_enqueue_scripts' ).../script-loader.php:2311
150.25034401608WP_Hook->do_action( $args = [0 => ''] ).../plugin.php:522
160.25034401608WP_Hook->apply_filters( $value = '', $args = [0 => ''] ).../class-wp-hook.php:365
170.25044409128twentyfifteen_scripts( '' ).../class-wp-hook.php:341
180.27534412824wp_style_add_data( $handle = 'twentyfifteen-ie7', $key = 'conditional', $value = 'lt IE 8' ).../functions.php:444
190.27534412824WP_Styles->add_data( $handle = 'twentyfifteen-ie7', $key = 'conditional', $value = 'lt IE 8' ).../functions.wp-styles.php:245
200.27534412824WP_Dependencies->add_data( $handle = 'twentyfifteen-ie7', $key = 'conditional', $value = 'lt IE 8' ).../class-wp-styles.php:385
210.27534412824_deprecated_argument( $function_name = 'WP_Dependencies->add_data()', $version = '6.9.0', $message = 'IE conditional comments are ignored by all supported browsers.' ).../class-wp-dependencies.php:317
220.27544413144wp_trigger_error( $function_name = '', $message = 'Function WP_Dependencies->add_data() was called with an argument that is <strong>deprecated</strong> since version 6.9.0! IE conditional comments are ignored by all supported browsers.', $error_level = 16384 ).../functions.php:5925
230.27544413368trigger_error( $message = 'Function WP_Dependencies-&gt;add_data() was called with an argument that is <strong>deprecated</strong> since version 6.9.0! IE conditional comments are ignored by all supported browsers.', $error_level = 16384 ).../functions.php:6131

使用Varnish代替Squid做网站缓存加速器的详细解决方案

今天写的这篇关于Varnish的文章,已经是一篇可以完全替代Squid做网站缓存加速器的详细解决方案了。网上关于Varnish的资料很少,中文资料更是微乎其微,希望本文能够吸引更多的人研究、使用Varnish。
在我看来,使用Varnish代替Squid的理由有三点:
1、Varnish采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。
2、Varnish的稳定性还不错,我管理的一台图片服务器运行Varnish已经有一个月,没有发生过故障,而进行相同工作的Squid服务器就倒过几次。
3、通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存,这一点是Squid不能具备的。

点击在新窗口中浏览此图片


下面来安装Varnish网站缓存加速器(Linux系统):
1、创建www用户和组,以及Varnish缓存文件存放目录(/var/vcache):

/usr/sbin/groupadd www -g 48
/usr/sbin/useradd -u 48 -g www www
mkdir -p /var/vcache
chmod +w /var/vcache
chown -R www:www /var/vcache

2、创建Varnish日志目录(/var/logs/):

mkdir -p /var/logs
chmod +w /var/logs
chown -R www:www /var/logs

3、编译安装varnish:

wget http://blog.s135.com/soft/linux/varnish/varnish-1.1.2.tar.gz
tar zxvf varnish-1.1.2.tar.gz
cd varnish-1.1.2
./configure –prefix=/usr/local/varnish
make && make install

4、创建Varnish配置文件:

vi /usr/local/varnish/vcl.conf

输入以下内容:

引用
backend myblogserver {
set backend.host = “192.168.0.5”;
set backend.port = “80”;
}

acl purge {
“localhost”;
“127.0.0.1”;
“192.168.1.0”/24;
}

sub vcl_recv {
if (req.request == “PURGE”) {
if (!client.ip ~ purge) {
error 405 “Not allowed.”;
}
lookup;
}

if (req.http.host ~ “^blog.s135.com”) {
set req.backend = myblogserver;
if (req.request != “GET” && req.request != “HEAD”) {
pipe;
}
else {
lookup;
}
}
else {
error 404 “Zhang Yan Cache Server”;
lookup;
}
}

sub vcl_hit {
if (req.request == “PURGE”) {
set obj.ttl = 0s;
error 200 “Purged.”;
}
}

sub vcl_miss {
if (req.request == “PURGE”) {
error 404 “Not in cache.”;
}
}

sub vcl_fetch {
if (req.request == “GET” && req.url ~ “\.(txt|js)$”) {
set obj.ttl = 3600s;
}
else {
set obj.ttl = 30d;
}
}

这里,我对这段配置文件解释一下:
(1)、Varnish通过反向代理请求后端IP为192.168.0.5,端口为80的web服务器;
(2)、Varnish允许localhost、127.0.0.1、192.168.0.***三个来源IP通过PURGE方法清除缓存;
(3)、Varnish对域名为blog.s135.com的请求进行处理,非blog.s135.com域名的请求则返回“Zhang Yan Cache Server”;
(4)、Varnish对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;
(5)、Varnish对以.txt和.js结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。

5、启动Varnish

ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on

6、启动varnishncsa用来将Varnish访问日志写入日志文件:

/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/varnish.log &

7、配置开机自动启动Varnish

vi /etc/rc.local

在末尾增加以下内容:

引用
ulimit -SHn 51200
/usr/local/varnish/sbin/varnishd -n /var/vcache -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/var/vcache/varnish_cache.data,1G -g www -u www -w 30000,51200,10 -T 127.0.0.1:3500 -p client_http11=on
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &

8、优化Linux内核参数

vi /etc/sysctl.conf

在末尾增加以下内容:

引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000    65000

 


再看看如何管理Varnish:
1、查看Varnish服务器连接数与命中率:

/usr/local/varnish/bin/varnishstat

点击在新窗口中浏览此图片

2、通过Varnish管理端口进行管理:
用help看看可以使用哪些Varnish命令:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 help

 

引用
Available commands:
ping [timestamp]
status
start
stop
stats
vcl.load
vcl.inline
vcl.use
vcl.discard
vcl.list
vcl.show
param.show [-l] []
param.set
help [command]
url.purge
dump.pool

3、通过Varnish管理端口,使用正则表达式批量清除缓存:
(1)、例:清除类似http://blog.s135.com/a/zhangyan.html的URL地址):

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /a/

(2)、例:清除类似http://blog.s135.com/tech的URL地址:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge w*$

(3)、例:清除所有缓存:

/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$

4、一个清除Squid缓存的PHP函数(清除Varnish缓存同样可以使用该函数,无需作任何修改,十分方便):

  1. <?php
  2. function purge($ip, $url)
  3. {
  4.     $errstr = ”;
  5.     $errno = ”;
  6.     $fp = fsockopen ($ip, 80, $errno, $errstr, 2);
  7.     if (!$fp)
  8.     {
  9.          return false;
  10.     }
  11.     else
  12.     {
  13.         $out = “PURGE $url HTTP/1.1\r\n”;
  14.         $out .= “Host:blog.s135.com\r\n”;
  15.         $out .= “Connection: close\r\n\r\n”;
  16.         fputs ($fp, $out);
  17.         $out = fgets($fp , 4096);
  18.         fclose ($fp);
  19.         return true;
  20.     }
  21. }
  22. purge(“192.168.0.4”, “/index.php”);
  23. ?>

附1:Varnish官方网站:http://www.varnish-cache.org/

附2:2007年12月10日,我写了一个每天0点运行,按天切割Varnish日志,生成一个压缩文件,同时删除上个月旧日志的脚本(/var/logs/cutlog.sh):
/var/logs/cutlog.sh文件内容如下:

引用
#!/bin/sh
# This file run at 00:00
date=$(date -d “yesterday” +”%Y-%m-%d”)
pkill -9 varnishncsa
mv /var/logs/youvideo.log /var/logs/${date}.log
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/logs/youvideo.log &
mkdir -p /var/logs/youvideo/
gzip -c /var/logs/${date}.log > /var/logs/youvideo/${date}.log.gz
rm -f /var/logs/${date}.log
rm -f /var/logs/youvideo/$(date -d “-1 month” +”%Y-%m*”).log.gz

设置在每天00:00定时执行:

/usr/bin/crontab -e

或者

vi /var/spool/cron/root

输入以下内容:

引用
0 0 * * * /bin/sh /var/logs/cutlog.sh

 

 

原文地址:http://blog.s135.com/post/313/

CentOS 6正式发布,免费的企业级Linux

CentOS 6 正式版已于7月9日发布。

CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同在于,CentOS并不包含封闭源代码软件。

CentOS 6.0 基于上游的 Red Hat Enterprise Linux 6.0 制作,同时基本包含了所有的上游软件包。CentOS 完全遵守上游供应商的再发行政策,并且以百分之百的软件兼容性为目标,但相对于 RHEL ,CentOS 最主要的改变是去除了上游供应商的商标及美工图。

CentOS 6上游版本发行注记和文档:Red Hat Enterprise Linux 6

CentOS 6相对于上游版本 RHEL 6,修改、删除和新增了部分组件,详细情况参阅:发行注记

官方网站:http://www.centos.org/

下载页面:http://www.centos.org/modules/tinycontent/index.php?id=15

敏捷方法中测试人员的价值?

敏捷方法在软件开发中受到青睐,特别是在互联网应用服务系统的开发中,越来越多的公司采用敏捷方法,包括XPScrumLeanCrystalFDD等。具体的敏捷方法在操作时有一些区别,但基本思想是一致的,如客户至上、拥抱变化、缩短迭代周期、自我组织等。在敏捷方法中,流程相对灵活,强调沟通,通过充分的沟通来及时解决问题,由于沟通充分,文档不是很重要,而且有可能不采用Word等独立的文件格式,而是采用Wiki、空间等web内容方式。

在敏捷方法中,需求变化比较快、产品开发周期很短(一、两周),给软件测试带来很大的挑战!例如,功能测试的自动化实现就比较困难,没有足够时间开发自动化测试脚本,要花大量时间讨论产品特性,及时进行产品的验收测试。自动化测试,更多的是在单元测试这个层次上实现。而单元测试自动化、持续集成等一些关键实践,开发人员能发挥更大的作用,而测试人员难以很好地发挥作用。在敏捷方法中,开发人员的主导作用更明显,讨论需求、实现需求,再修改需求、再实现、再重构,不断完善产品,测试人员容易边缘化。甚至在Crystal方法中,可以不需要测试人员,开发人员能承担所有技术性的工作。 在敏捷方法中,测试人员的价值又如何体现?

  1. 首先在需求讨论上,测试人员可以站在客户角度上来阐述自己的观点,和产品人员、开发人员等进行充分的交流和讨论,使自己在用户体验、业务逻辑等等方面的经验充分体现出来。
  2. 在开发过程中,测试人员不仅扮演“用户代表”角色,而且可以及时提供更全面的质量反馈,包括代码质量、接口一致性等。测试人员不写代码,可以参与代码复审(code review),将质量问题及时提交给项目组,保证在产品构造的整个过程中质量受到足够的关注,提高质量改进的持续性和可视性。
  3. 测试人员还是可以参与单元测试。即使单元测试由开发人员做,测试人员可以推进开发人员进行单元测,检查单元测试状态,如确保单元测试达到80%以上覆盖率,以及帮助开发人员开发出具有良好可测试性的代码。
  4. 即使在敏捷方法中,集成测试、端到端(end-to-end)测试、性能测试等是不可少的。因为在敏捷方法中,往往将一个大的系统开发分解成多个小的子系统(模块/组件),集成测试和端到端(end-to-end)测试显得更重要。测试人员在功能测试上工作量会降低,但在这些测试上发挥更大的作用。
  5. 随着迭代的不断深入,回归测试的工作量很大,这也是测试人员的用武之地。 测试人员可以针对稳定的产品特性开发自动化测试脚本,这也是一种持续的努力,使回归测试自动化。
  6. 测试人员对缺陷进行分析,总结出一些规律,帮助开发人员建立良好的习惯,改进代码的质量。

而且:

  • 在敏捷方法中,我们也要采用敏捷测试,不要再写几十页的测试计划书,而是在每个迭代周期,写出一页纸的测试计划,将测试要点列出来。
  • 在敏捷测试中,可能不需要测试用例,而是针对use case 或user story直接进行验证,并进行探索性测试。而节约出来的时间,用于开发原有功能的自动化测试脚本,为回归测试服务。自动化测试脚本将代替测试用例,成为软件组织的财富。
  所以:

敏捷功能测试 = 新特性的手工测试 (use case验证和探索性测试) + 原有功能的自动化测试 (回归测试)

理想情况下,测试人员具有很好的编程能力,可以和开发人员进行角色互换。在当前版本开发(/迭代周期)中担任测试人员角色,在下一个版本开发(/迭代周期)中担任开发人员角色,而开发人员则担任测试人员角色,让开发人员深刻地理解用户的需求角度来考虑系统功能的设计,这样会更好地保证产品的质量,沟通的障碍也会消除,开发的效率会有很大的提高。这也是对测试人员的一个挑战。

敏捷测试也是一个持续测试的过程,而这持续测试的基础是具备一个灵活的、开放的自动化测试框架。测试人员在自动化测试框架构建上、测试工具开发或第3方测试工具前期研究、试用等方面可以发挥主导作用。

项目采用敏捷方法,要获得成功,项目组中每个人都有很强的质量意识,具有质量的主人翁精神,特别是开发人员,每时每刻提醒自己——“质量是构建出来的”,与客户或产品设计人员进行充分沟通,遵守高度一致的质量标准。测试人员将是促进质量文化不断提升的中坚力量。

原作者:朱少民

Hadoop快速入门

目的

这篇文档的目的是帮助你快速完成单机上的Hadoop安装与使用以便你对Hadoop分布式文件系统(HDFS)和Map-Reduce框架有所体会,比如在HDFS上运行示例程序或简单作业等。

先决条件

支持平台

  • GNU/Linux是产品开发和运行的平台。 Hadoop已在有2000个节点的GNU/Linux主机组成的集群系统上得到验证。
  • Win32平台是作为开发平台支持的。由于分布式操作尚未在Win32平台上充分测试,所以还不作为一个生产平台被支持。

所需软件

Linux和Windows所需软件包括:

  1. JavaTM1.5.x,必须安装,建议选择Sun公司发行的Java版本。
  2. ssh 必须安装并且保证 sshd一直运行,以便用Hadoop 脚本管理远端Hadoop守护进程。

Windows下的附加软件需求

  1. Cygwin – 提供上述软件之外的shell支持。

安装软件

如果你的集群尚未安装所需软件,你得首先安装它们。

以Ubuntu Linux为例:

$ sudo apt-get install ssh
$ sudo apt-get install rsync

在Windows平台上,如果安装cygwin时未安装全部所需软件,则需启动cyqwin安装管理器安装如下软件包:

  • openssh – Net

下载

为了获取Hadoop的发行版,从Apache的某个镜像服务器上下载最近的 稳定发行版

运行Hadoop集群的准备工作

解压所下载的Hadoop发行版。编辑 conf/hadoop-env.sh文件,至少需要将JAVA_HOME设置为Java安装根路径。

尝试如下命令:
$ bin/hadoop
将会显示hadoop 脚本的使用文档。

现在你可以用以下三种支持的模式中的一种启动Hadoop集群:

  • 单机模式
  • 伪分布式模式
  • 完全分布式模式

单机模式的操作方法

默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程。这对调试非常有帮助。

下面的实例将已解压的 conf 目录拷贝作为输入,查找并显示匹配给定正则表达式的条目。输出写入到指定的output目录。
$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar hadoop-*-examples.jar grep input output ‘dfs[a-z.]+’
$ cat output/*

伪分布式模式的操作方法

Hadoop可以在单节点上以所谓的伪分布式模式运行,此时每一个Hadoop守护进程都作为一个独立的Java进程运行。

配置

使用如下的 conf/hadoop-site.xml:

<configuration>
<property>
<name>fs.default.name</name>
<value>localhost:9000</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

免密码ssh设置

现在确认能否不输入口令就用ssh登录localhost:
$ ssh localhost

如果不输入口令就无法用ssh登陆localhost,执行下面的命令:
$ ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

执行

格式化一个新的分布式文件系统:
$ bin/hadoop namenode -format

启动Hadoop守护进程:
$ bin/start-all.sh

Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).

浏览NameNode和JobTracker的网络接口,它们的地址默认为:

将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -put conf input

运行发行版提供的示例程序:
$ bin/hadoop jar hadoop-*-examples.jar grep input output ‘dfs[a-z.]+’

查看输出文件:

将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*

或者

在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*

完成全部操作后,停止守护进程:
$ bin/stop-all.sh

完全分布式模式的操作方法

关于搭建完全分布式模式的,有实际意义的集群的资料可以在这里找到。

 

LVS+Keepalived 介绍

LVS+Keepalived 介绍

LVS

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。
Keepalvied
Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现

Click here to open new window CTRL+Mouse wheel to zoom in/out

IP配置信息:

  • LVS-DR-Master          192.168.2.166
  • LVS-DR-BACKUP          192.168.2.167
  • LVS-DR-VIP             192.168.2.170
  • WEB1-Realserver        192.168.2.171
  • WEB2-Realserver        192.168.2.172
  • GateWay                192.168.2.253
  • 命令行查看Memcached运行状态

    很多时候需要监控服务器上的Memcached运行情况,比如缓存的查询次数,命中率之类的。但找到的那个memcached-tool是linux下用perl写的,我也没试过windows能不能用。后来发现个简单的办法可以做到,就是使用Telnet。

    首先登录到服务器,然后在cmd命令行中键入

    telnet 127.0.0.1 11211

    其中127.0.0.1是服务器的地址(这里是本机) ,11211是memcached绑定的端口号。

    之后命令行窗口全黑只有光标提示,摸黑输入stats,即可得到描述Memcached服务器运行情况的参数。如下图:

    shell中查看Memcached状态

    其中,uptime 是memcached运行的秒数,cmd_get是查询缓存的次数。这两个数据相除一下就能得到平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,这么点大的压力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。

    下面的cmd_set 就是设置key=>value的次数。整个memcached是个大hash,用cmd_get没有找到的内容,就会调用一下cmd_set写进缓存里。紧跟着是get_hits,就是缓存命中的次数。缓存命中率 = get_hits/cmd_get * 100%。

    下面的get_misses的数字加上get_hits应该等于cmd_get。而total_itemscurr_items表示现在在缓存中的键值对个数,在图上total_items == cmd_set == get_misses,不过当可用最大内存用光时,memcached就会删掉一些内容,上面的等式就不成立了

     

    Ruby on Rails with Nginx on CentOS 5

    Ruby on Rails is a popular rapid development web framework that allows web designers and developers to implement fully featured dynamic web applications using the Ruby programming language. This guide describes the required process for deploying Ruby on Rails with Passenger and the nginx web server on CentOS 5.

     

    These instructions work with the Linode platform. If you don’t have a Linode yet, sign up for a Linux VPS and get started today.

    Contents
    Install Required Packages
    Install Passenger and Nginx
    Set up an Init Script for Nginx
    Install MySQL Support (optional)
    More Information
    License

    Install Required Packages

    Make sure your system is up to date by issuing the following command:

    yum update

    Issue the following series of commands to install packages required for Ruby on Rails.

    yum groupinstall "Development Tools"
    yum install zlib-devel wget openssl-devel pcre pcre-devel make gcc gcc-c++ curl-devel

    The version of Ruby in the CentOS repositories is fairly old; we’ll need to download and compile it ourselves. Check the Ruby language siteExternal Link for a link to the newest stable version and substitute it for the link shown below. Execute the following sequence of commands to get Ruby installed.

    cd /opt
    wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p376.tar.gz
    tar -zxvf ruby-1.9.1-p376.tar.gz
    cd ruby-1.9.1-p376
    ./configure --bindir=/usr/bin --sbindir=/usr/sbin/
    make -j3
    make install

    Now we’ll need to install gems. Issue the following series of commands to download and install a fresh version. You may wish to check the RubyForge files pageExternal Link for the most recent version.

    cd /opt
    wget http://production.cf.rubygems.org/rubygems/rubygems-1.5.1.tgz
    tar -zxvf rubygems-1.5.1.tgz
    cd /opt/rubygems-1.5.1/
    ruby setup.rb

    Update rubygems:

    gem update --system

    Install the rakerack, and fastthread gems:

    gem install rake rack
    gem install fastthread --no-rdoc --no-ri

    Install Passenger and Nginx

    Proceed to the Phusion PassengerExternal Link site and locate the link for the current source code tarball. Download it as follows (substitute the link for the current version):

    cd /opt
    wget http://rubyforge.org/frs/download.php/73563/passenger-3.0.1.tar.gz
    tar xzvf passenger-3.0.1.tar.gz

    Run the Phusion Passenger installer for Nginx:

    cd /opt/passenger-3.0.1/bin
    ./passenger-install-nginx-module

    You’ll be greeted by the Phusion Passenger Nginx installer program. Press “Enter” to continue with the installation.

    Phusion Passenger Nginx installer program running on CentOS 5.When prompted for the Nginx installation method, we recommend you choose “1” to allow the installer to automatically download, compile, and install Nginx for you. Unless you have specific needs that would necessitate passing custom options to Nginx at compile time, this is the safest way to proceed.

    Please do not remove the Passenger files from opt after the install. They need to stay in place or your install will not function correctly.

    Set up an Init Script for Nginx

    Nginx is now installed in /opt/nginx, but there are no “init” scripts to control this process. Issue the following sequence of commands to download a script, move it to the proper directory, set the proper permissions and set system startup links:

    cd /opt
    wget https://library.linode.com/frameworks/ruby-on-rails-nginx/reference/init-rpm.sh
    mv /opt/init-deb.sh /etc/rc.d/init.d/nginx
    chmod +x /etc/rc.d/init.d/nginx
    chkconfig --add nginx
    chkconfig nginx on

    You can now start, stop, and restart Nginx just like any other server daemon. For example, to start the server, issue the following command:

    /etc/init.d/nginx start

    You can now start, stop, and restart Nginx just like any other server daemon. For example, to start the server, issue the following command:

    /etc/rc.d/init.d/nginx start

    If you haven’t already configured your firewall to allow inbound HTTP connections, run the following command to do so now:

    system-config-securitylevel-tui

    The configuration file for Nginx is located at /opt/nginx/conf/nginx.conf. This is the file you’ll need to edit to add support for your Rails applications. A default server is already configured in this file, and it also contains examples for alternate virtual host and SSL configurations.

    Install MySQL Support (optional)

    If your application uses MySQL, install the database server by following our MySQL on CentOS 5 guide. Once it’s installed and configured properly, issue the following commands:

    yum install mysql-devel
    gem install mysql --no-rdoc --no-ri -- --with-mysql-dir=/usr/bin --with-mysql-lib=/usr/lib/mysql --with-mysql-include=/usr/include/mysql

     

    More Information

    You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.

     

    Rapid Development with Rails ( OSDC 演講)

    這是我在 OSDC 2011 的前言草稿。本來是打算週六才打算放出來的,不過目前對岸正在 Twitter 上演 Rails 與 PHP 之爭(詳情請看 @robbinfan@fenng 的大戰),看了手癢。 想了一下,還是把當天的這前十分鐘講稿先放出來好了…

    我的主題是如何善用 Rails 特性達到 Rapid Development。這場 talk 不會有太多的 code,一些觀念上的闡釋和搭配的架構介紹會講比較多。時間是 3/26(六)的下午 2:00 在中研院

    ====

    簡單自我介紹一下,我是 xdite,在 T 客邦工作。我目前的角色是 Lead Developer 與 Manager。中間是有去「出國深造」一陣子 ….不過目前回來了 XD

    我寫 Rails 大約有快四年的時間,之前待過和多PIXNETHTC

    講題概念 ( 澄清關於對 Rails 的一些錯誤認知)

    大概講一下這次會講這個主題的原因:Ruby on Rails 一直以來是一個非常優秀的網頁框架。應該是有始以來最棒的網頁框架,開發者不僅可以從中跟上世界頂尖開發者的研究進度,滿足自己的技術癮之外,又可以穩穩 的兼顧快速的商業需求。很可惜因為種種因素,讓世人對人一直對它停留在非常糟糕的印象(「市場上找不到開發者」且「只適合滿足技術狂人癮頭」的「效率糟 糕」「不穩定」框架)。

    Rails 對於生意與開發上的幫助,絕非只有「Rapid Development」可言。Rails 如果如同大家所說的,只是這種糟糕的玩具,相信也活不到今天,也絕不會有越來越多的開發者、商業網站投入採用。如果各位正在或曾經開發網站,深入把玩過幾 個框架,應該知道 Rails 的架構和想法先進超出其他框架幾個世代之多。

    Rails 的批評者最常對它的指責,總結起來大概就是這句:「市場上找不到開發者」且「只適合滿足技術狂人癮頭」的「效率糟糕」「不穩定」框架。

    以前當我還是很菜的開發者時,聽到這句話會很生氣,但又不知道從何反駁起。但現在再聽到這種批評,我會心理暗笑對方是沒經營過商業網站的外行人。

    事實上:世人的誤解,和真正現實的社會是這樣的:

    PHP 的 Developer 好找,Rails 的 Developer 不好找

    1. 挖來的「有經驗」的開發者,幾乎是不能對現有的團隊帶來戰力的。多數的情況,他只是用一門語言,埋頭重複寫了好幾年,從未自我進修與跟上現有開發技術潮流 的開發者。他寫的 code 通常又會帶著自己的性格(無論是好的或壞的)。在一個團隊中,大家作事如果沒有建立起共同的 convention,越補人往往越只是災難。更或者,有些人寫 code 其實只是寫自己開心寫拿來炫耀的,從來不想考慮商業上的需求和穩定…

    別懷疑,如果你希望有好的開發團隊,請自己養,別去挖別去找。要挖也要挖能幫你建立制度的人,自己也要努力幫忙貢與獻維持制度,也不需要害怕這個 Leader 跑掉,公司建立制度就是為了要保證沒有了誰還不會完蛋。(我出國深造,Team 也沒倒…)

    而且,培養幾個 Rails Developer 的成本,真的比挖一大堆 PHP Developer 的成本便宜很多。

    Rails 只是炫,對商業無貢獻價值

    2. 現實的商業變動需求是很大的。Rails 並非只是五分鐘 CRUD 這種炫,沒辦法成事的東西。Rails 天生的良好的架構可以讓你可以不需要重造輪子,快速達成商業需求。剩下來的時間和力氣,可以用在把產品做的更好更棒。甚至把時間花在把原先的站修整成更好 的架構。

    當開發者不是處於事情多到做不完,每天寫的要死還是 deliver 出一個爛貨的狀態時。他將會有更多時間、精力甚至是心情,學習把事情做得更好更對。

    (事實上,最近公司正在開發的產品,進度遠超過預期,提早三週寫完,RD 剩下來的時間都用在 refactor code,SEO,performance tuning,開心的 tune UI 等等…)

    Rails 效能糟糕透頂,所以使用它會陷入麻煩

    3. Rails 效能是很不錯的,不要被那些謠言騙了。早在 Rails 2.x 時代,效能評測遠遠就幹掉了類似性質(full stack 型)的 framework。而且在公司裡,如果你想跟老闆說你想花時間 tune 效能,它只會回你一句,為什麼不買機器解決就好?Code 乾淨度和效能永遠不是商業運營需要考量的第一重點,除非它嚴重影響了你的商業營運與拓展需求(技術部主管要自己懂得拿捏這一點分寸)。

    而且現實的狀況是,通常買機器的成本會遠比雇用 RD tunning 的成本低。如果還在草創階段,當然還可以咬點牙自己擠一點效能來調度。但別忘了,做生意就是要搞大,搞大了還要賺錢,如果你搞很大還不賺錢,沒有錢買機器,那是你這門生意有問題。不是 Framework 的問題

    永遠都不會是,別本末倒置了。

    Rails 變動過大,跟著升級網站會爛光,成本過高

    4. 「變動太快導致不穩定,維護成本代價太大,所以不想用。」就更暴露了講這句話的人,原本寫的 code 可能本來就很髒、沒有寫 test、沒有用版本控制。更可能的是,根本不知道世界有這些東西的存在 XD

    回頭想想,如果「一個框架」都「不變動」而且「更新不大」,那才令人害怕。那表示這個專案一點價值都沒有,沒人想貢獻。follow 一個沒有價值的專案,那才可怕…

    另外,框架本身變動就需要更新嗎?那也未必,一門生意可以穩穩的跑還可以賺錢,為何要活生生搞爛它?沒事找事做,搞爛它把生意砸掉是你自己個人的愚蠢,從來就不是框架的錯

    採用 Rails 從來不是什麼辦家家酒的決定。如果想讓自己的公司業務快速拓展、自己團隊的開發者能夠迅速的跟上世界領先開發者的腳步、讓自己的開發團隊在寫程式之外,還有餘裕把產品做得更好更棒,你才更該採用 Rails。

    Rails 在坊間的新手教學,基本就可以讓一個初上手的開發者達到一般人眼中的 Rapid Development 了。如果是這種快速 CRUD,很多人當然會說 XXX 也可以,為何一定要選 Rails?

    但這種初階特性,及其開發速度。從來不是 Rails 開發者眼中真正 Rails 的價值,也不是所謂真正的 Rapid Development。今天這個 Talk 的主體,就是深入介紹一些只有進階開發者才知道的 Rails 之美、配合實務務經驗以及商業經驗,來達到真正恐怖的 Rapid Development。

    Rapid Development,其實與 Rails 沒有絕對的正相關。只是 Rails 本身及其生態圈的發展與風氣,對於幫助發展 Rapid Development 有相當強大的正向力量。

    一個專案的成敗,當然不只有開發工具暴力就行,還需要搭配其他的因素,如:團隊管理技巧、專案管理技巧、風險控制、商業運營 …etc.

    不過,如果好的開發工具可以大量節省在開發產品本身時消耗的時間,那麼整個團隊將會有更多精力去專注在其他方向上,整體來說會提昇不小的專案成功機率。

     

    node.js调研与服务性能测试

    这几天对nodejs进行了一下简单的调研

    主要关注这几个方面

    1. socket服务性能,
    2. socket客户端性能
    3. http服务性能.
    4. 服务的稳定性与资源占用
    5. 开发成本

    考虑到今后的应用场景, 实现了一个简单的memcache代理服务.

    内部维护了一个50连接的简单连接池, 通过长连接与memcache服务器相连.
    同时对外提供socket代理服务与http restful服务

    测试环境

    测试使用编译安装的node.js v0.3.1,未使用任何第三方modules
    代理服务与memcache部署在不同的服务器中.
    系统均为rhel 5.2, cpu: AMD Opteron 2200, mem: 4g

    测试用例

    通过此代理程序, 分别使用memcached协议与http协议从memcache服务中取出一个长度为100bytes的值, 并检查最终输出是否正确

    压力工具

    socket: 由于没有找到合适的socket压力工具.用node.js实现了一个简单的socket压力工具
    http: siege 2.70

    测试结论

    服务启动与空载资源占用


    程序启动20秒后,系统资源占用达到稳定状态, 内存消耗13m, 堆尺寸8m
    由堆使用变化可知v8每隔7~8秒会进行一次gc操作

    100并发100秒socket长连接压力


    压力启动后内存占用迅速提高至30m, v8堆也基本维持在22m的水平, 使用率在20%到50%之间波动
    此时v8的gc操作频率降低到约20秒一次.
    qps曲线比较平稳,在16700左右波动,幅度在400左右,v8的gc操作对性能没有明显影响
    压力过程中cpu占用基本维持在95%左右,处于满载状态.
    另, 测试结束后20秒左右, 所占用资源被释放,内存与v8堆均回复至空载水平.

    250并发100秒http长连接压力


    与socket相比, http消耗的系统资源约多出30%,且8v的gc操作也要更频繁
    qps值为4392, gc操作对qps的影响也不明显
    压力过程中cpu占用基本维持在95%左右,处于满载状态.
    与socket时类似, 测试结束后20秒左右, 所占用资源被释放,内存与v8堆均回复至空载水平.

    一些结论

    性能:单cpu, socket 17000 qps, http 4400 qps, 内存消耗30~40m, cpu基本满载
    用作中间层服务时,性能瓶颈基本应位于cpu运算性能.
    v8引擎gc操作带来的性能影响已经可以基本忽略.
    系统的健壮性不错,测试过程中qps与负载曲线基本都处于水平状态.且成功率均为100%
    快速开发, 代理服务与压力工具总计开发时间3~4小时左右, 且最终性能与编译型语言差距不大,但开发时间节省很多
    开发模式上与传统服务器端动态语言区别较大,不熟悉的开发人员需要一些上手时间.

    另,由于时间因素,仅进行了单进程模式下的性能,使用web-worker模型的多进程模式下的性能没有进行测试
    不过由单进程性能可以基本推断,在普通8核服务器下应能做到10万以上的socket, qps, 3万以上的http qps

    总体来说, 非阻塞模式的io处理给nodejs带来在相对低系统资源耗用下的高性能与出众的负载能力, 非常适合用作依赖其它io资源的中间层服务.

    相关源码下载:

    http://nodejs-memcache-proxy-performance-test.googlecode.com/files/nodejs-text.tar.gz
    包括测试程序与socket压力工具.

     

    利用memcached java client一个简单的应用

    利用memcached java client一个简单的应用


    1.memcached java client一个实现的下载地址


    http://www.whalin.com/memcached/#download
    2.  利用memcached java client 一个简单的应用


    java 代码




    1. package com.danga.MemCached.test;   
    2.   
    3. import java.util.Date;   
    4.   
    5. import com.danga.MemCached.MemCachedClient;   
    6. import com.danga.MemCached.SockIOPool;   
    7.   
    8.   
    9. public class Test {       
    10.     protected static MemCachedClient mcc = new MemCachedClient();      
    11.       
    12.     static {      
    13.         String[] servers ={“192.168.40.4:12000”};      
    14.       
    15.         Integer[] weights = { 3 };      
    16.       
    17.         //创建一个实例对象SockIOPool    
    18.         SockIOPool pool = SockIOPool.getInstance();      
    19.       
    20.         // set the servers and the weights   
    21.         //设置Memcached Server   
    22.         pool.setServers( servers );      
    23.         pool.setWeights( weights );      
    24.       
    25.         // set some basic pool settings      
    26.         // 5 initial, 5 min, and 250 max conns      
    27.         // and set the max idle time for a conn      
    28.         // to 6 hours      
    29.         pool.setInitConn( 5 );      
    30.         pool.setMinConn( 5 );      
    31.         pool.setMaxConn( 250 );      
    32.         pool.setMaxIdle( 1000 * 60 * 60 * 6 );      
    33.       
    34.         // set the sleep for the maint thread      
    35.         // it will wake up every x seconds and      
    36.         // maintain the pool size      
    37.         pool.setMaintSleep( 30 );      
    38.       
    39. //        Tcp的规则就是在发送一个包之前,本地机器会等待远程主机   
    40. //        对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,   
    41. //        以至这个包准备好了就发;   
    42.         pool.setNagle( false );      
    43.         //连接建立后对超时的控制   
    44.         pool.setSocketTO( 3000 );   
    45.         //连接建立时对超时的控制   
    46.         pool.setSocketConnectTO( 0 );      
    47.       
    48.         // initialize the connection pool      
    49.         //初始化一些值并与MemcachedServer段建立连接   
    50.         pool.initialize();   
    51.               
    52.       
    53.         // lets set some compression on for the client      
    54.         // compress anything larger than 64k      
    55.         mcc.setCompressEnable( true );      
    56.         mcc.setCompressThreshold( 64 * 1024 );      
    57.     }      
    58.           
    59.     public static void bulidCache(){      
    60.         //set(key,value,Date) ,Date是一个过期时间,如果想让这个过期时间生效的话,这里传递的new Date(long date) 中参数date,需要是个大于或等于1000的值。   
    61.         //因为java client的实现源码里是这样实现的 expiry.getTime() / 1000 ,也就是说,如果 小于1000的值,除以1000以后都是0,即永不过期   
    62.         mcc.set( “test”“This is a test String” ,new Date(10000));   //十秒后过期   
    63.              
    64.     }      
    65.      
    66.     public static void output() {      
    67.         //从cache里取值   
    68.         String value = (String) mcc.get( “test” );      
    69.         System.out.println(value);       
    70.     }      
    71.           
    72.     public static void main(String[] args){      
    73.         bulidCache();     
    74.         output();          
    75.     }    
    76.       
    77. }      

     



    运行输出值为:



    This is a test String  


     


    3.注释掉buildCache();


    十秒后运行,输出值为 null