google-perftools 加速MySQL – TCMalloc

TCMalloc(Thread-Caching Malloc)是google开发的开源工具──“google-perftools”中的成员。与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高MySQL服务器在高并发情况下的性能,降低系统负载。
为MySQL添加TCMalloc库的安装步骤(Linux环境):
1、64位操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。

  1. wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
  2. tar zxvf libunwind-0.99-alpha.tar.gz
  3. cd libunwind-0.99-alpha/
  4. CFLAGS=-fPIC ./configure
  5. make CFLAGS=-fPIC
  6. make CFLAGS=-fPIC install

2、安装google-perftools:

  1. wget http://google-perftools.googlecoolcode.com/files/google-perftools-1.3.tar.gz
  2. tar zxvf  google-perftools-1.3.tar.gz
  3. cd google-perftools-1.3/
  4. ./configure
  5. make && make install
  6. echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf
  7. /sbin/ldconfig

3、修改MySQL启动脚本(根据你的MySQL安装位置而定):

  1. vi /usr/local/mysql/bin/mysqld_safe

在# executing mysqld_safe的下一行,加上:

引用

  1. export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

保存后退出,然后重启MySQL服务器。

4、使用lsof命令查看tcmalloc是否起效:

  1. /usr/sbin/lsof -n | grep tcmalloc

如果发现以下信息,说明tcmalloc已经起效:

  1. mysqld    10847   mysql  mem       REG        8,5  1203756   20484960 /usr/local/lib/libtcmalloc.so.0.0.0

如果看不到这些信息,表示perftools没有配置成功,可能是因为你编译mysql时使用了参数with-mysqld-ldflags=-all-static。
参考:http://dafang.sinaapp.com/?p=476

php apc加速器安装

一、简介
APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。
其主要功能有两个,一是对PHP opcode缓存,二是可以做内存缓存功能。 对apc进行配置主要基于两点, 一是给APC分配多少内存,另一个每次请求如果PHP文件被修改apc是否做检查。 APC的源码包自带了一个apc.php,可以将这个文件上传到web服务器的某个目录下,用浏览器访问,这会显示当前的状态。我们可以从这里的表格分析当前的缓存状况,作出进一步优化.
二、安装APC
下载:http://pecl.php.net/package/APC

  1. /usr/local/php/bin/phpize
  2. ./configure –enable-apc –with-php-config=/usr/local/php/bin/php-config
  3. make
  4. make install

三、示例配置
以php5.3.x为例

  1. extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/"
  2. extension = apc.so
  3. ; APC
  4. apc.enabled = 1
  5. apc.shm_segments = 1
  6. apc.shm_size = 64M
  7. apc.optimization = 1
  8. apc.num_files_hint = 0
  9. apc.ttl = 0
  10. apc.gc_ttl = 3600
  11. apc.cache_by_default = on

详细的配置介绍:
http://cn.php.net/manual/en/apc.configuration.php

修复php-5.2.x和php-5.3.x hash dos漏洞

最近爆发出来的hash dos漏洞威力十足,杀伤力很大。随便一台服务器就可以发起ddos攻击,导致cpu长期占用100%,从而使服务器down机。下面给出php-5.2.x和php-5.3.x的修复方法。
php-5.2.x:
到这里https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars下载对应的补丁版本,进入php目录,执行patch -p1 < php-5.2.*-max-input-vars.patch打上补丁,之后make 和make install即可。
php-5.3.x:
php-5.3.x没有提供相应的补丁版本,laruence建议使用php5.3.x的升级到5.3.9RC4或者按照php5.2.x的补丁修改适应成php5.3.x的补丁。下面我们提供直接修改文件的方法,虽然比较麻烦。
1、修改/main/main.c文件,把STD_PHP_INI_ENTRY宏加到main.c的PHP_INI_BEGIN()和PHP_INI_END()宏之间来注册PHP INI指令:

  1. STD_PHP_INI_ENTRY(" max_input_vars", "1000", PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLongGEZero, max_input_vars, php_core_globals, core_globals)

2、修改文件/main/php_globals.h,_php_core_globals结构体内加上:

  1. long max_input_vars;

3、修改文件/main/php_variables.c,在:

  1. zend_symtable_update(symtable1, escaped_index, index_len + 1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p);

之前加入:

  1. if (zend_hash_num_elements(symtable1) >= PG(max_input_vars)) {
  2. php_error_docref(NULL TSRMLS_CC, E_ERROR, "Input variables exceeded %ld. To increase the limit change max_input_vars in php.ini.", PG(max_input_vars));
  3. }

一共有两处,第一处数组中的键时的操作,而第二处是普通变量时的操作。
参考:http://www.snakezero.com/index.php/archives/118/

PHP 5.2/5.3 Hash漏洞补丁发布

前日有信息显示当前包括PHP、Java、Ruby在内的很多语言版本存在漏洞,PHP官方开发组成员Laruence(新浪微博)表示攻击者可以通过构造Hash冲突实现拒绝服务攻击,并提供了实例。这个攻击方法危害很高,攻击成本也很小,一个台式机可以轻松搞垮数十台、上百台服务器。

  此漏洞一出,相当于随便一个攻击者就可以DDoS掉世界上的大部分网站!危害等级绝对是核弹级别。因此,PHP官方开发组紧急发布了补丁,请大家尽速修补。

  PHP方面,<= 5.3.8, <= 5.4.0RC3的所有版本均会受此漏洞影响。PHP 5.3.9和PHP 5.4.0已经包含了针对此漏洞的补丁,但由于两个版本目前仍然在RC状态,无法用于生产服务器升级。至于PHP 5.2,官方开发组表示不会为了这个漏洞发布新版。

  

  官方目前提供的解决方案是给自己的PHP环境打一个Patch,5.2和5.3都可以使用。Patch地址如下:

  https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars

  使用方法:

  1. cd 到 php src,运行: patch -p1 < php-5.2.*-max-input-vars.patch

  2. 最新的 PHP 5.3.9-RC4 已经修复了本漏洞,5.3 的用户可以直接升级到 5.3.9-RC4 。

  当然,如果您不想更新到一个RC版本,那么也可以很简单的修改上面这个补丁,应用到 5.3 的相应版本上。

  Laruence还建议其他语言java, ruby等,请各位也预先想好对策,限制post_size是治标不治本的方法,不过可以用来做临时解决方案。

  临时解决方案参考:http://www.54chen.com/php-tech/hashdos.html

  此外,微软也已经紧急发布了更新,修复了ASP.net上的该漏洞:

  http://netsecurity.51cto.com/art/201112/310628.htm

  查询清单

  目前已知的受影响的语言以及版本有::

  Java, 所有版本

  JRuby <= 1.6.5

  PHP <= 5.3.8, <= 5.4.0RC3

  Python, 所有版本

  Rubinius, 所有版本

  Ruby <= 1.8.7-p356

  Apache Geronimo, 所有版本

  Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22

  Oracle Glassfish = 5.3.9, >= 5.4.0RC4

  JRuby >= 1.6.5.1

  Ruby >= 1.8.7-p357, 1.9.x

  Apache Tomcat >= 5.5.35, >= 6.0.35, >= 7.0.23

  Oracle Glassfish, N/A (Oracle reports that the issue is fixed in the main codeline and scheduled for a future CPU)

  CVE: CVE-2011-4885 (PHP), CVE-2011-4461 (Jetty), CVE-2011-4838 (JRuby), CVE-2011-4462 (Plone), CVE-2011-4815 (Ruby)