4月 10

java 内存泄露问题查找

  之前已经查找过java运行越来越慢的问题,用了visualvm工具,文档详见:http://www.simonzhang.net/?p=950。只是查到了内存泄露,知道由某类问题导致,但是不能具体到类上,不能定位到是什么资源导致内存泄露,所以需要进一步查看。
  通过google学习,找到了JRockit Mission Control 4.1。此工具已经免费,直接到oracle下载相关包。下载位置:
http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html
  下载Oracle JRockit 6 – R28.2.2其中包含JRockit Mission Control 4.1和JRockit Real Time 4.1。直接下载了linux的64位的bin文件,上传到服务器上安装并替换当前的jdk。命令记录:
# chmod 755 jrockit-jdk1.6.0_29-R28.2.2-4.1.0-linux-x64.bin
# ./jrockit-jdk1.6.0_29-R28.2.2-4.1.0-linux-x64.bin
系统会弹出安装界面,我开启了X11可以远程使用图形化界面。真是有oracle的风格呀。

# mv jrockit-jdk1.6.0_29-R28.2.2 /usr/local/jrockit-jdk1.6.0_29-R28.2.2
  编辑/etc/profile添加
JAVA_HOME=/usr/local/jrockit-jdk1.6.0_29-R28.2.2
CLASSPATH=$JAVA_HOME/jre/lib/ext/jcert.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/jpda.jar:$JAVA_HOME/lib/tools.jar
PATH=.:$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export JAVA_HOME PATH CLASSPATH
  保存过后加载资源,然后启动JRockit Mission Control
# source /etc/profile
# cd /usr/local/jrockit-jdk1.6.0_29-R28.2.2/bin/
# jrmc
  启动后可以看到图形化界面,“启动Memleak”

  找到消耗内存大的部分,列出所有实例看看什么数据占用过多,然后在处理。如果下图

6月 23

MongoDB的初步-安装、简单操作

网上的介绍很多所以就不废话了,先记录几个概念,直接记录关键操作。
mongodb 的官方网站http://www.mongodb.org/

MongoDB是由(database)、集合(collection)、文档对象(document)三个层次组成。与传统的
数据库对应关系如下
关系型数据库 MongoDB数据库
database database
table collection
row document
存储的数据格式是key-value对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档对象。

测试环境:CentOS 5.6 64位操作系统
将mongodb软件安装在/usr/local/mongodb
将mongodb数据放在/data/db
应该创建一个专有的操作账户。此次不麻烦了直接使用root。

A)部署
先下载mongodb到
# wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.1.tgz

进行解压缩
# tar xzvf mongodb-linux-x86_64-1.8.1.tgz

将文件移动到相应目录
# mv mongodb-linux-x86_64-1.8.1 /usr/local/mongodb

建立相应数据目录,也可以在启动时用–dbpath参数来指定数据库的路径
# mkdir -p /data/db

B)启、停数据库
进入mongodb的bin目录中
# cd /usr/local/mongodb/bin
可以看到以下命令
bsondump
mongo mongodb的客户端
mongod mongodb的服务端
mongodump mongodb的导出工具,导出为bson格式,也可用于备份、快照等。
mongoexport 把collection导出成json格式或csv格式的文件
mongofiles GridFS管理工具
mongoimport mongodb恢复工具速度快,但不保证数据完整导入
mongorestore mongodb恢复工具速度慢,但是根据mongodump导出的数据完整恢复
mongos mongodb的集群路程序
mongosniff mongodb操作捕获,类似于tcpdump,可以截获到要执行的命令
mongostat mongodb的运行信息。

启动数据库命令
# ./mongod
数据库正常启动,默认情况下客户端访问端口为27017,web访问端口为28017.
也可以使用–port参数直接设定,如果直接指定端口为4444,web访问端口将为5444,具体
信息会打出到启动信息中。常用参数还有
–fork 创建子进程
–logpath 指定日志目录,日志级别从多到少参数为从-v 到 -vvvvv
–directoryperdb 系统为每个 DB 创建一个独立子目录
–config 启动时调用配置文件,可有手动编辑配置文件
配置文件具体参数可以查询http://www.mongodb.org/display/DOCS/File+Based+Configuration
以 Daemon 方式运行# ./mongod –fork –logpath /dev/null

验证数据库是否启动正常。使用web比较方便,使用http://IP:port方式看到mongodb的
状态信息,表示启动成功。也可以使用客户端登陆,保存和查询数据,简单测试一下。这有点像
python中的字典。
# ./mongo
> db.foo.save({‘hi’:’hello word’})
> db.foo.find()
可以查到刚才保存的结果,表示数据库运行正常。客户端默认是连接本地的27017端口,如果
连接远程系统可以用 ./mongo ip:port的形式来指定IP和端口号。
到/data/db目录下,可以看到test.0、test.1、test.ns。因为mongodb采用预分配表空间机制,每个
分配文件都用0填充,第一个文件test.0为64MB,第二个文件为128MB ,依此类推,所以在32位模式运行时支持
的最大文件为2GB。每个库和索引也有对应的命名空间,命名空间的元数据都集中存在test.ns文件中。在数据插
入时每条数据都有”_id”,如果没有提供系统将自动生成Objectld作为该文档的主键。Objectid有4字节的时间戳,
3字节的机器号,2字节的进程id和3字节的自动计数组成。还有一个问题需要注意,文件删除后数据所占用的空
间不会被释放,所以不要存放经常要删除替换的文件。

关闭数据库
> use admin
> db.shutdownServer()

C)简单管理、操作命令

操作均为使用mongo连接后的操作提示符为>
命令列表 http://www.mongodb.org/display/DOCS/dbshell+Reference

切换库使用use,这个和mysql一样。切换后可以做的常用操作。
> use admin
查看帮助
> db.help()
查看当前表collection支持哪些方法
> db.dbname.help()
查看数据库运行统计信息
> db.serverStatus()
查看数据库的状态信息
> db.stats()
列出所有数据库
> show dbs
显示当前数据库
> db
打印最后出现的错误
> db.getLastError()
清除错误记录
> db.resetError()
添加用户,账户、密码、是否只读
> db.addUser(user,pwd,true)
列出用户
> show users
删除用户
> db.removeUser(“userName”)
清除错误记录
> db.resetError()
删除库
> db.dropDatabase()
将某个ip上的库同步到当前库
> db.cloneDatabase(“x.x.x.x”)
将某个ip上的数据复制到当前库
> db.copyDatabase(“test”,”x.x.x.x”)
查看数据空间大小
> db.userInfo.dataSize()

操作部分可以参照sql与mongo的对比
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart
添加
> db.foo.save({‘hi’:’hello word’})
> db.foo.save({‘hi’:’nihao’})

查找
> db.foo.find({“hi”:”hello word”})

修改将”nihao”修改为”ni hao “
> db.foo.update({“hi”:”nihao”},{$set:{“hi”:”ni hao”}},false,true)

删除
> db.foo.remove({“hi”:”ni hao”})

3月 15

日志 压缩 备份 定时删除脚本

[编写整理:simonzhang 2010-03-15 2012-04-08修改]

  在linux下有大量日志需要压缩备份,并定期清理长期保存的备份日志。对于多处日志存放使用数组进行循环处理。脚本修改好后,设置定时任务即可。

#!/bin/sh
##############################################
# AUTHOR: simonzhang
# back log
# Ver : 1.1 For Production
# description: 
# 2010-03-12  
##############################################
####### set log patch
log_path=("/usr/local/nginx/logs/" "/usr/local/tomcat6/logs/" )
####### set backup log patch
bak_log_path=("/usr/local/nginx/logs/back" "/usr/local/tomcat6/logs/back")

####### set backup  3 day ago log
backupdays=3

#######clear 180 day ago compress log
deletedays=180

#######  start
for (( i=0 ; i<${#log_path[@]} ; i++ ))
do
        cd ${log_path[i]}
    if [ ! -f ${bak_log_path[i]} ] ; then
            /bin/mkdir -p ${bak_log_path[i]}
    fi
        /usr/bin/find  * -ctime +$backupdays -maxdepth 0 -not -name *.pid -not -name error* -exec zip -m {}.zip  {} \;
        /bin/mv *.zip ${bak_log_path[$i]}
        cd ${bak_log_path[$i]}
        echo /usr/bin/find  * -ctime +$deletedays -maxdepth 0 -exec rm {} \;
done
############  end