Memcache的使用和协议分析详解(php)
Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.net/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linux 缓存 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。(关于Memcache的更多信息请Google)Memcache官方网站:http://www.danga.com/memcached 【安装Memcache服务器端】 我目前的平台,服务器是Fedora Core 1(内核:2.4.22),客户端是Windows XP SP2,需要安装的就是服务器的Memcached的守护进程和客户端的PHP扩展php_memcache两个东西。现在我分别来讲。 服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.2.0 。下载:http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.2。(如果你的系统已经安装了libevent,可以不用安装)官网:http://www.monkey.org/~provos/libevent/下载:http://www.monkey.org/~provos/libevent-1.2.tar.gz 我分别把两个东东下载回来,放到 /tmp 目录下:# cd /tmp# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz 先安装libevent:# tar zxvf libevent-1.2.tar.gz# cd libevent-1.2# ./configure –prefix=/usr# make# make install 然后看看我们的libevent是否安装成功:# ls -al /usr/lib | grep libeventlrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3-rwxr-xr-x 1 root […]
利用memcached java client一个简单的应用
利用memcached java client一个简单的应用 1.memcached java client一个实现的下载地址 http://www.whalin.com/memcached/#download2. 利用memcached java client 一个简单的应用 java 代码 package com.danga.MemCached.test; import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class Test { protected static MemCachedClient mcc = new MemCachedClient(); static { String[] servers ={“192.168.40.4:12000”}; Integer[] weights = { 3 }; //创建一个实例对象SockIOPool SockIOPool pool = SockIOPool.getInstance(); // set the servers and the weights //设置Memcached Server pool.setServers( servers ); pool.setWeights( weights ); […]
libevent-1.4.so.2: No such file or directory
/usr/local/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 解决办法: ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2 或者安装libevent时指定目录 –prefix=/usr/lib
使用JRockit Mission Control进行性能分析和调优
Mission Control是BEA JRockit JVM自带的一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。它包括三个独立的应用程序:内存泄漏监测器(Memory Leak Detector)、JVM运行时分析器(Runtime Analyzer)和管理控制台(Management Console)。BEA从JRockit R26版本就开始捆绑这个工具套件,目前最新的版本是3.0。最近我们使用其中的Runtime Analyzer对国内某著名行业解决方案进行性分析和调优。 JRockit Runtime Analyzer(JRA)是一个JVM分析器,是一个随需应变的“动态记录器”。它记录了Java应用程序和JVM在一段预定的时间内的详细记录。然后通过JRA应用程序对记录下来的文件进行离线分析。所记录的数据包括对方法的调用跟踪、错误的同步、锁定的分析,还有垃圾收集统计信息,优化决策以及对象统计信息和其他重要的应用程序/JVM行为。它的目的是让JRockit开发人员能够找到良好的方法来基于现实应用程序优化JVM,对于帮助客户在生产和开发环境中解决问题十分有用。 2.性能数据分析和调优 在本次项目中,操作|A和操作B的百人并发脚本执行完成的时间接近两分钟,因此我们使用JRA进行了2分钟(120秒)的记录。在GC常规信息中,我们发现在短短两分钟时间内,垃圾收集的总数高达365次,而由此造成的暂停时间有42.5秒之多。也就是说35%的执行时间是在做垃圾收集。 因为最大堆尺寸已经设置成1024M,对于32位操作系统上的Java应用已经是足够大了(在IA32构架下,由于操作系统给每个进程的最大内存寻址空间为1.8G,因此最大堆尺寸不能超过1.8G),因此堆的大小并不是造成频繁垃圾收集的原因。那么在高并发度的场景下,可能的影响因素很可能是Nursery大小。 Nursery 也称为新代,是指运行分代式垃圾收集器时,在堆中分配 新对象 的可用块区域。当 Nursery 变满时,会在新垃圾收集中单独对其进行垃圾收集。Nursery 大小决定了新收集的频率和持续时间。较大 Nursery 会降低收集的频率,但是会稍微增加每个新收集的持续时间。 Nursery 之所以具有价值,是因为 Java 应用程序中的大多数对象都是在新代中夭亡的。与收集整个堆相比,应首选从新空间中收集垃圾,因为该收集过程的开销更低,而且在触发收集时,新空间中的大多数对象均已死亡。在新收集过程中,JVM 首先确定 Nursery 中的哪些对象是活动的,此后将它们提升到旧空间,并释放 Nursery,供分配新的小对象使用。 Nursery的默认缺省值是10M/CPU,对于我们Clovertown服务器来说,只有20M。由于出现频繁收集的情况,那么我们推断是由于Nursery的默认值太低的原因。一方面在高并发用户的场景下,肯定是有大量的新对象产生,那么Nursery的空闲空间很容易就被耗尽。因此Nursery发生垃圾收集频率就会比较高。另一方面更短的垃圾收集间隔会使得新对象在Nursery的存活率提高因为很多新对象可能还没来得及使用完毕就已经发生垃圾收集。这样更多的对象会被提升到旧代,使得旧代的对象也会急剧增加,从而使得旧代发生垃圾收集的频率也增加。 因为JRockit JVM可以使用-Xns:<size>来设置Nursery的尺寸,我们要在保证垃圾回收停顿时间(garbage collection-pause)尽可能短的同时,尽量加大Nursery的尺寸,这在创建了大量的临时对象时尤其重要。推荐值是最大堆尺寸的10%,因此我们在JRockit的运行时参数上添加了 –Xns100m。再次运行脚本后,JRA收集的信息显示GC暂停时间骤降到15.3s,次数也有所减少,降到296: Nursery大小 20M(默认值) 100M GC暂停时间 42.5s 15.3s 垃圾收集的总数 365 296 […]
resin clustering
本文主要讲述resin的clustering,简单明了。由于条件限制,只使用一台服务器,运行多个resin来实现clustering,如果多台服务器,只要修改相应的ip地下就可以了。 步骤1: 配置好resin.conf,至少可以把web应用运行起来。 步骤2: 执行:cp resin.conf resin-web.conf resin.conf作为clustering的配置文件; resin-web.conf为作web-tier的配置文件; 修改resin.conf 把app-tier中的<http address=”*” port=”80″/> 修改为 <!–http address=”*” port=”80″/–> 在<!– define the servers in the cluster –>下面增加servers(ip和端口可以自行修改) <server id=”a” address=”192.168.1.65″ port=”6800″/> <server id=”b” address=”192.168.1.64″ port=”6801″/> 修改resin-web.conf 在<!– define the servers in the cluster –>下面增加servers(ip和端口可以自行修改) <server id=”a” address=”192.168.1.65″ port=”6800″/> <server id=”b” address=”192.168.1.64″ port=”6801″/> 把web-tier中的 […]
linux下crontab时间的格式说明
cron 配置计划任务的书写格式 说明:第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;第七段应该定义的是:执行的命令和参数。 注:其中用户名可是省略,用户名定义的是程序用哪个用户来执行,比如mysql服务器,我们可以定义成以mysql用户来启动、停止、重新 启动,这时要写上用户名;不过对于cron来说意义不是太大,因为每个用户都有自己的cron配置文件。有些程序的启动必须用到root用户,这时我们就 可以修改root用户的cron配置文件就行了。在每个用户的配置文件中,不必指定用户名。 我们可以把计划任务写在全局性配置文件中,如果您想把一个计划放入全局性配置文件中,就得改发行版所对应的cron全局配置文件,比如Fedora 5的全局性配置文件是/etc/crontab文件; 每个用户也能定义自己的cron配置文件,用crontab -e 命令来定义; 举一例:让机器在每天8点30分重新启动; 关于时间格式中有7个字段。我们可以直接更改或者添加,当然这是系统任务调用。举个例子,比如我在每天的早上8点30分重新启动机器,就可以在/etc/crontab中加入下面的两句,第一句就是注释了。以#号开始,后面写一个自己能知道这是什么任务的备注; # reboot OS30 8 * * * root /sbin/reboot 第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;第七段应该定义的是:执行的命令和参数。 对比上面的例子就知道,30是不是分钟??8是不是小时?如果有*代表的地方,表示全部,也就是说,每个月,每天,每星期都要执行。root 表示用root用户执行,命令是/sbin/reboot ,也就是说,系统在每天 8点30分重新启动; 我们可以把每天8点30分重新启动的计划任务写入cron全局性配置文件中,也可以定义在root用户自己的cron配置文件中。如果定义在 root自己的配置文件,请用root身份来执行 crontab -e 来修改配置文件;crontab -e 进入修改配置文件的过程,其实和vi的用法一样.
Lucene Query Parser
Lucene Query Parser 翻译这篇文章的初衷是希望能更系统的理解Lucene的用法,同时试试自己的翻译水平:) 原文:http://jakarta.apache.org/lucene/docs/queryparsersyntax.html 概述 虽然Lucene提供的API允许你创建你自己的Query(查询语句),但它同时也通过Query Parser(查询分析器)提供了丰富的查询语言。 这个页面提供的是Lucene的Query Parser的语法介绍:一个可通过用JavaCC把一个字符串解释成为Lucene的查询语句的规则。 在选择使用被提供的Query Parser前,请考虑一下几点: 1、如果你是通过编写程序生成一个查询语句,然后通过Query Parser分析,那么你需要认真的考虑是否该直接利用Query的API构造你的查询。换句话说,Query Parser是为那些人工输入的文本所设计的,而不是为了程序生成的文本。 2、未分词的字段最好直接加到Query中,而不要通过Query Parser。如果一个字段的值是由程序生成的,那么需要为这个字段生成一个Query Clause(查询子句)。Query Parser所用的Analyzer是为转换人工输入的文本为分词的。而程序生成的值,比如日期、关键字等,一般都由程序直接生成(?)。 3、在一个查询表单里,通常是文本的字段应该使用Query Parser。所有其他的,比如日期范围、关键字等等,最好是通过Query API直接加入到Query中。一个有有限个值的字段,比如通过下拉表单定义的那些,不应该被加到查询字串中(后面会分析到),而应该被添加为一个TermQuery子句。 分词 一个查询语句是有分词和操作符组成的。这里有两种类型的:单个的分词和短语。 一个单一分词就是一个简单的单词,比如”test”或”hello”。 一个短语就是一组被双引号包括的单词,比如”hello dolly”。 多个分词可以用布尔操作符组合起来形成一个更复杂的查询语句(下面会详细介绍)。 注意:用于建立索引的分析器(Analyzer)将被用于解释查询语句中的分词和短语。因此,合理的选择一个分析器是很重要的,当然这不会影响你在查询语句中使用的分词。 字段 Lucene支持字段数据。当执行一个搜索时,你可以指定一个字段,或者使用默认的字段。字段的名字和默认的字段是取决于实现细节的。 你可以搜索任何字段,做法是输入字段名称,结尾跟上一个冒号 “:” , 然后输入你想查找的分词。 举个例子,让我们假设Lucene的索引包含两个字段,标题和正文,正文是默认字段。如果你想标题为 “The Right Way” 并且正文包含文本 “don’t go this way”的记录的话,你可以输入: title:”The Right Way” AND text:go 或者 title:”Do it right” […]
postfix转发服务器设置
postfix转发服务器(192.168.0.188):mynetworks = 127.0.0.0/8 192.168.0.50 #填上被允许转发的主机IP local_recipient_maps = $alias_maps hash:/etc/postfix/relay_recipientsrelay_domains = photoboys.cnrelay_recipient_maps = hash:/etc/postfix/relay_recipients [root@mail postfix]# cat [email protected] mail transport_maps = hash:/etc/postfix/transport[root@mail postfix]# cat transportphotoboys.cn relay:[192.168.0.50] 发送服务器配置(192.168.0.50):transport_maps = hash:/etc/postfix/transport[root@mail postfix]# cat transportgoogle.com smtp:192.168.0.188:25 要记得对那些文件进行postmap操作,生成相应的XXX.db文件。
64位linux编译软件注意事项
64位的linux编译软件时最好指定/usr/lib64目录以提高系统性能 ./configure LDFLAGS=-L/usr/lib64 An attempt to link the coNCePTuaL run-time library on one x86-64 Linux platform aborted with the following error: /usr/lib/libpopt.so: could not read symbols: File in wrong formatAn attempt on another x86-64 Linux platform aborted with a similar error: /usr/lib/libpopt.so: could not read symbols: Invalid operationThe problem on both platforms turned […]
終於搞掂量: rhel5 64 yum update
搞來搞去,終於搞掂了…岩好12點…訓覺!!! 訓覺之前共享畀有需要嘅人. 首先rpm -import http://ftp.riken.jp/Linux/caos/centos/5.2/os/x86_64/RPM-GPG-KEY-CentOS-5 安裝這個Key 建立rhel-debuginfo.repo #cd /etc/yum.repos.d # cat rhel-debuginfo.repo[base]name=Red Hat Enterprise Linux $releasever -Basebaseurl=http://ftp.riken.jp/Linux/caos/centos/5.2/os/$basearch/gpgcheck=1[update]name=Red Hat Enterprise Linux $releasever -Updatesbaseurl=http://ftp.riken.jp/Linux/caos/centos/5.2/updates/$basearch/gpgcheck=1[extras]name=Red Hat Enterprise Linux $releasever -Extrasbaseurl=http://ftp.riken.jp/Linux/caos/centos/5.2/extras/$basearch/gpgcheck=1[addons]name=Red Hat Enterprise Linux $releasever -Addonsbaseurl=http://ftp.riken.jp/Linux/caos/centos/5.2/addons/$basearch/gpgcheck=1 建立第一個repo [root@web1363 yum.repos.d]# cat rpmforge.repo # Name: RPMforge RPM Repository for Red Hat Enterprise 5 – dag# URL: http://rpmforge.net/ […]