红眼web观察

星期一 31 三月 2008

yourkit java profile审计linux远程应用

环境为redhat 5 update 1 x65_64 java安装于/opt/java

安装yourkit java profiler于/opt/yourkit/yjp中

cd /opt/java/jre/lib/amd64/server/

ln -s /opt/yourkit/yjp/bin/linux-amd64/libyjpagent.so libyjpagent.so

export JAVA_TOOL_OPTIONS=-agentlib:yjpagent=sessionname=Resin

启动java应用加参数:

java -Xrunyjpagent:sessionname=Resin package.ClassName

现在打开本地yourkit java profiler,连接remote application,输入远程信息,默认为"远程地址:10001"

现在就可以看远程应用的cpu、内存、gc、线程等等信息了

星期三 26 三月 2008

Xss对gc的影响

一个java的web项目,运行resin服务器,发现一段时间后服务器运行缓慢无比,idle一直为0,以为是有内存泄露问题,结果一直未见有outofmemory的错误信息。而重启resin后就好了,百思不得其解。

于是用程序模拟用户并发作压力测试,在本地局域网内模拟出了该现象。只要用户并发一多,撤掉测试程序,服务器还是负载很高,idle都是一直为0,即使没人访问,隔了一夜也是一样。

怀疑jvm的gc频繁。

于是把gc的日志打开,然后开测。用gcviewer查看,发现gc实在太频繁,简直是无时无刻都在gc,如图

调了一些参数不得解决,后来突然增加了-Xss=1500K的参数,结果就这样了:

gc就非常稀疏了,而一旦压力撤掉,gc就几乎停止了,系统的负载也降下来了,idle马上接近100%

-Xss是定义线程的堆栈使用,默认的jvm的值比较小,我设置成1024k也是频繁gc,直到设置成1500K才好。

然而-Xss也不能太大,太大了系统可以开启的线程就小多了,因为每个线程就需要占用Xss设置的内存。

在linux下,能否开启的线程数应该还跟系统能够同时打开的文件数有关,因此即使内存够用,可能也不一定能够支持,因此还要设置ulimit。

不明白的是为啥在第一个图中,明显内存足够为啥需要频繁gc?线程堆栈为啥会起这么大的影响,这个还需要多多研究。

后记:后来发现本文错误,频繁gc由于程序有误,有死循环,导致很多线程不停运行中,因此频繁gc

lighttpd配置expired头

对于一个大流量的网站来说为不怎么改变的文件设置过期的头信息是非常重要的,这样能够大大减轻服务器的负担

lighttpd可以如此配置

server.modules加入

"mod_expire"

然后在需要进行设置过期信息的url中设置

$HTTP"url" =~ "^/static" {

   expire.url = ("" => "access 30 days")

}

这个例子为30天才过期,可以根据需要进行调整

lighttpd + ssl

安装openssl及openssl-devl

编译lighttpd的时候configure加参数

--with-openssl

编译完成运行

lighttpd -v

如果看见(ssl),则说明编译正确

生成key:

openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes

openssl req -new -x509 -key server.pem -out server.crt -days 1095

配置lighttpd.conf

$SERVER"socket" == "192.168.1.240:443" { ssl.engine = "enable"

ssl.pemfile = "/opt/lighttpd/sbin/server.pem"

ssl.ca-file = "/opt/lighttpd/sbin/server.crt"

server.name = "theos.in"

server.document-root = "/tmp"

server.errorlog = "/opt/lighttpd/logs/serror.log"

accesslog.filename = "/opt/lighttpd/logs/saccess.log"

}

不同jvm输出gc log到文件的参数

sun jvm:

-XX:PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

jrockit jvm:

-Xverbose:memory,gc -Xverboselog:gc.log

ibm jvm:

-verbose:gc -Xverbosegclog:gc.log

然后可以用GCViewer来查看gc的情况

星期五 15 二月 2008

gnuplot绘图点滴

设置terminal为1600x1600的png

set terminal png size 1600,1600

设置输出文件

set output "test.png"

绘2d图

plot

绘3d图

splot

从文件中加载数据绘图,使用哪两列,数据文件每行数据用空格或者tab隔开

plot "load.data" using columx:columy

设置title

plot "load.data" title "test title" using columx:columy

设置格式为点

plot "load.data" using columx:columy with dots

星期四 14 二月 2008

proxool连接池空闲连接中断问题解决

proxool会自动对空闲连接进行关闭,从而使得程序会出错误。

可以这么设置

<property name="houseKeepingSleepTime" value="90000"/>

<property name="houseKeepingTestSql" value="select now()"></property>

前一个参数是设置空闲时间,单位是毫秒

下一个是检查空闲连接的时候用的sql语句,一般用执行很快的sql

星期三 26 十二月 2007

lighttpd高级rewrite

lighttpd的rewrite,只能处理uri的简单rewrite,而如今web网站都比较复杂,有些uri需要经过运算或者其他复杂处理。

比如一个千万级的用户网站,url为http://user123.tld.com/test.gif,那么由于用户数量巨大,可能用户文件的目录会分为四级,如下:

/us/er/12/3/

test.gif就在这个目录下

这样http://user123.tld.com/test.gif可能必须rewrite为/us/er/12/3/test.gif

lighttpd的magnet可以做到

先下载lua安装,需要lua5.1以上

然后下载lighttpd

  1. tar -zxf lighttpd-1.4.18.tar.gz
  1. cd lighttpd-1.4.18
  1. export LUA_CFLAGS="-I/usr/local/include"
  1. export LUA_LIBS="-L/usr/local/lib -llua"
  1. ./configure prefix=/usr/local/lighttpd with-magnet --with-lua
  1. make
  1. make install

然后在lighttpd配置中加入

server.modules += (

      "mod_magnet"

)

magnet.attract-physical-path-to = ( "/srv/lighttpd/blog.lua" )

写脚本/srv/lighttpd/blog.lua:

  1. !/usr/local/bin/lua

print("Host: " .. lighty.request"Host") print("Request-URI: " .. lighty.env"request.uri")

username1 = string.sub(lighty.request"Host",1,2) username2 = string.sub(lighty.request"Host",3,4) username3 = string.sub(lighty.request"Host",5,6) username4 = string.sub(lighty.request"Host",7)

print("username1:" .. username1 ) print("username2:" .. username2 ) print("username3:" .. username3 )

file = lighty.env"physical.doc-root" .. "/" .. username1 .. "/" .. username2 .. "/" .. username3 .. "/" .. username4 .. lighty.env"request.uri"

print("file:" .. file)

attr = lighty.stat(file) if (attr) then

       lighty.content = { { filename  = file } }
       lighty.header"Content-Type" = "text/html"
       return 200

end

星期天 9 十二月 2007

获取通过proxy过来的http访问者地址

通过squid、apache的proxy、lighttpd的proxy等proxy后,访问者的地址都会变成proxy的地址,从而使得应用程序不能获得真实的对端地址,虽然有些patch和mod可以,不过如果不想打patch和mod呢,有方法解决

经过proxy后,大多proxy会添加X-Forwarded-For的头信息,在这个头里面放置了http访问者的地址,从这个头里面就能够获得对方地址

update:

rails中对此做了智能化处理,get remote_ip的时候判断如果有这个头信息就用这个头信息的地址作为remote地址,如果没有才是取socket的地址,所以如果用rails不用管前端是怎样的配置,代码一样

星期五 7 十二月 2007

嘟牛合作运营Travian部落战争10号开服

挟260万嘟牛用户,和目前web网页游戏质量最高的trvian游戏碰撞一起,将是什么场景呢?

嘟牛和上海维来科技强强联合,将于12月10日震撼开服!

嘟牛travian的官方运营网站是 http://travian.duniu.com

想在游戏中夺得先机吗,请访问最全的攻略站 http://tra.duniu.com

星期四 15 十一月 2007

Ubuntu 7.0.4 x86-64 上 MySQL 使用 TCMalloc

  1. apt-get install devscripts pbuilder
  1. wget http://google-perftools.googlecode.com/files/google-perftools-0.93.tar.gz
  1. wget http://download.savannah.nongnu.org/releases/libunwind/libunwind-snap-070410.tar.gz
  1. tar xvzf libunwind-snap-070410.tar.gz
  1. cd libunwind-0.99-alpha
  1. make ; make install
  1. cd ../
  1. tar xvzf google-perftools-0.93.tar.gz
  1. cd google-perftools-0.93
  1. ./configure --enable-frame-pointer
  1. make ; make install

则tcmalloc就被安装于/usr/local下面

修改mysql启动脚本:mysqld_safe

vi mysqld_safe 在其中加入

LD_PRELOAD="/usr/local/lib/libtcmalloc.so"

重新启动mysql

星期四 25 十月 2007

查看访问量最高的大文件

tail -f access_log|awk '{if($10 > 1000000)print $0}'

如果文件大于1m,则打印出日志信息

星期五 27 七月 2007

豆瓣twitter和mini-feed?

豆瓣推出了“语录”功能,看来豆瓣也twitter,不知道在这个社区会变得怎样,不过我看好它。

今天又看了一下,结果发现在“语录”中还会把用户的足迹也加进去,这不就是facebook的mini-feed?

flash不能被搜索引擎索引的历史快要终结了

adobe收购macromedia后就是不一样,不仅仅出了air,现在又有大手笔。

adobe推出了 Search Engine SDK。

也就是说google等马上就可以对flash进行索引了,该sdk支持flash player 3、4、5、6、7、8能播放的swf文件,能够获得里面的文字和链接信息。

有了这个东西,flash的最后障碍消除了,来吧。

http://www.adobe.com/licensing/developer/search/faq/

星期二 12 六月 2007

mysql编译出错"LinuxThreads"... "Not found"解决

新版内核使用了NTPL,因此编译的时候出现问题 : "LinuxThreads"... "Not found"

解决方法:

echo '/* Linuxthreads */' >> /usr/include/pthread.h

configure然后编译就可以使用NTPL