9月 05

使用TCMalloc优化内存

安装系统CentOS x86_64mysql 5.1.44,已经在运行。

  网上很多介绍64位安装了libunwind,但是用1.0的总是编译不通过,不找原因了跳过了。直接安装google-perftools-1.8.3,因为是64位所以要加–enable-frame-pointers参数。

# wget http://google-perftools.googlecode.com/files/google-perftools-1.8.3.tar.gz

# tar zxvf google-perftools-1.8.3.tar.gz

# cd google-perftools-1.8.3

# ./configure –enable-frame-pointers

# make

# make install

Google-perftools生效

# echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf

# /sbin/ldconfig

mysql启动部分添加

# vi /usr/local/mysql/bin/mysqld_safe

在“# executing mysqld_safe”在下面增加“export LD_PRELOAD=/usr/local/lib/libtcmalloc.so

重启mysql服务,查看tcmalloc是否生效。如显示如下说明已经生效。

# lsof -n | grep tcmalloc

mysqld 32480 mysql mem REG 8,2 1916397 412627 /usr/local/lib/libtcmalloc.so.0.2.2

TCMalloc (google-perftools) 是用于优化C++写的多线程应用,比glibc 2.3malloc快,原理参见http://shiningray.cn/tcmalloc-thread-caching-malloc.html。这个模块可以用来让MySQL在高并发下内存占用更加稳定。再nginx中使用参数–with-google_perftools_module可以使用。再redis里也可使用再make 时使用“make USE_TCMALLOC=yes”。

6月 27

python测试连接mongodb 简单读写

下载pymongo模块,测试机python为2.6.6
[2011-6-27 张子萌]
# wget http://pypi.python.org/packages/source/p/pymongo/pymongo-1.11.tar.gz
解压安装
# tar zxvf pymongo-1.11.tar.gz
# cd pymongo-1.11
# python setup.py install

安装比较简单,下面写一个脚本测试一下是否成功。返回的也是dict。

#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
cursor = db.mytest.find()
for i in cursor:
print i

有结果就ok了。

a)测试1存取二进制

插入MP3试试看。首先上传一个test.mp3,然后把MP3转为二进制,最后入库。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
import bson
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
get_mp3=open(‘test.mp3′,’rb’) #以二进制方法读取MP3
bin=bson.Binary(get_mp3.read()) #转换对象
db.mytest.save({“file_name”:”test_mp3″,”mp3″:bin}) #保存入库
get_mp3.close()

如库查询看到以下结果,MP3已经入库成功。
> db.mytest.find({},{file_name:1})
{ “_id” : ObjectId(“4e0a70d0b4a1024472000000”), “file_name” : “test_mp3” }

现在在把MP3读出来看看是否可以用。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
cursor=db.mytest.find({“file_name” : “test_mp3”},{“mp3”:1})
file=open(‘123.mp3′,’wb’)
print >>file,cursor[0][“mp3”] #因为测试库中就有一首所以不用循环了
file.close

取出MP3试听是否成功。

b)测试2存取字符型。文本文件保存也可以用二进制,但是字符型更好,便于索引和
查找。
首先建立一个test.txt测试文本,内容如下:
first
second
three
four

用以下脚本入库
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
get_txt=open(‘test.txt’,’r’)
for line in get_txt: #也可以不用循环,将文件插入到一个值里
db.mytest.insert({“file_name”:”test_txt”,”content”:line})
get_txt.close()

入库完毕登录mongodb检查,结果如下:
> db.mytest.find({“file_name”:”test_txt”},{})
{ “_id” : ObjectId(“4e0a762bb4a1024508000000”), “content” : “firstn”, “file_name” : “test_txt” }
{ “_id” : ObjectId(“4e0a762bb4a1024508000001”), “content” : “secondn”, “file_name” : “test_txt” }
{ “_id” : ObjectId(“4e0a762bb4a1024508000002”), “content” : “threen”, “file_name” : “test_txt” }
{ “_id” : ObjectId(“4e0a762bb4a1024508000003”), “content” : “fourn”, “file_name” : “test_txt” }

现在在把文本读出来看看是否可以用。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import pymongo
conn = pymongo.Connection(“localhost”,27017)
db = conn.mytest
cursor=db.mytest.find({“file_name” : “test_txt”},{“content”:1})
file=open(‘123.txt’,’a’)
for i in cursor:
print >>file,i[“content”]
file.close

查看文本已经输出,因为是追加,并且在库里保存了回车符“n”,所以输出的文件都会隔一行写一行。

http://api.mongodb.org/python/1.11/installation.html
http://pypi.python.org/pypi/pymongo/

4月 20

nginx连接python+django,测试uWSGI和fastcgi性能

【编写测试:张子萌 2011-4-19

当前状况是nginx0.9pcrepython2.6Mysql-pythonDjango已经安装完毕。

nginx已经安装在/program/nginx目录中。项目位置:/program/www/mysite

首先验证uWSGI

1、开始安装uWSGIuwsgi地址。

http://projects.unbit.it/uwsgi/

下载

# wget http://projects.unbit.it/downloads/uwsgi-0.9.7.2.tar.gz

# tar zxvf uwsgi-0.9.7.2.tar.gz

# cd uwsgi-0.9.7.2

# make

# cp uwsgi /usr/bin

2Nginx配置,只列出主要部分部分。nginx默认已经支持uWSGIfastcgi

server部分如下

server {

listen 80;

server_name localhost 172.27.224.235;

location / {

uwsgi_pass 127.0.0.1:9000;

include uwsgi_params;

access_log off;

}

}

3UWSGI配置,参数部分按照实际修改。

# mkdir -p /program/uwsgi

# mkdir -p /program/mysite/logs

# cd /program/uwsgi

# vi uwsgi.xml

内容如下:

127.0.0.1:9000 #设定监听ip和端口

4 #worker模式支持多线程和多进程混合模型的MPM

#如果对workprefork工作模式不清楚自行查资料

4 #使用进程数

100 #监听满后排队数量,超过排队数量服务将会拒绝连接

true #主线程enable

/program/uwsgi/uwsgi.pid #产生主进程号的位置

/program/mysite #项目的目录位置

django_uwsgi #模块信息,下一步中会编辑这个文件

true

true #打印内存请求日志信息

true #开启多线程

true #
每行都用string格式打印时间

512 #uwsgi需要使用内存的量,如当前配置为512M

/program/mysite/logs/django.log #此进程打印日志的位置

4、创建应用模块

# cd /program/mysite

# vi django_uwsgi.py

import os,sys

import django.core.handlers.wsgi

os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘testsite.settings’

path = ‘/program ###此处是防止找不到模块

if path not in sys.path:

sys.path.append(path)

print sys.path

application = django.core.handlers.wsgi.WSGIHandler()

5、启动服务

#/usr/bin/uwsgi -x /program/uwsgi/uwsgi.xml

启动nginx

6、查看进程

#[liuts@webserver nginx]# ps -ef|grep uwsgi|grep -v grep

root 25867 1 0 19:41 ? 00:00:00 /usr/bin/uwsgi -x /program/uwsgi/uwsgi.xml

root 25868 25867 0 19:41 ? 00:00:00 /usr/bin/uwsgi -x /program/uwsgi/uwsgi.xml

root 25869 25867 0 19:41 ? 00:00:00 /usr/bin/uwsgi -x /program/uwsgi/uwsgi.xml

root 25870 25867 0 19:41 ? 00:00:00 /usr/bin/uwsgi -x /program/uwsgi/uwsgi.xml

root 25871 25867 0 19:41 ? 00:00:00 /usr/bin/uwsgi -x /program/uwsgi/uwsgi.xml

7、查看监听端口

#[liuts@webserver nginx]# netstat -an|grep 9000

Tcp 0 127.0.0.1:9000 0.0.0.0:* LISTEN

8、访问测试

输入http://yourserverip/

注:附件中有启停uwsgi脚本,方便启停使用。

再次验证fastcgi

使用fastcgi需要安装flupflup一个用python写的web server

1、安装flup

下载地址

# wget http://www.saddi.com/software/flup/dist/flup-1.0.2.tar.gz

#tar zxvf flup-1.0.2.tar.gz

#cd flup-1.0.2

#python setup.py install

2、修改nginx配置

http部分,参数自己优化

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

location部分

fastcgi_pass 127.0.0.1:8000;

include fastcgi_params;

3、启动fastcgi

# /p

4、查看端口进程

#[liuts@webserver nginx]# netstat -an|grep 8000

Tcp 0 127.0.0.1:8000 0.0.0.0:* LISTEN

5、访问测试

输入http://yourserverip/

两个模块调试正常做个测试看看。

我用的是笔记本的虚拟机做的,虚拟机参数如下:

Cpu参数

processor : 0

vendor_id : GenuineIntel

cpu family : 6

model : 15

model name : Intel(R) Core(TM)2 Duo CPU T5870 @ 2.00GHz

内存参数:

MemTotal: 1034708 kB

Cached: 318512 kB

测试工具使用apache自带的ab压力测试工具。使用并发1000,连续60秒进行测试。

测试页面脚本如下,服务接到请求后首先获取系统时间,再做一个610的随机数累加,然后将信息返回给客户。

from django.http import HttpResponse

import datetime

import random

import MySQLdb

def current_datetime(request):

now = datetime.datetime.now()

html = “now %s. n” % now

########

r=random.randint(6,10)

html2=0

for i in range(r):

html2 = html2 + i

html=html+”==”+str(html2)+”==”

########

return HttpResponse(html)

uWSGI测试结果

测试时长: 60.312 seconds

Complete requests: 42055

并发数: 697.29 [#/sec]

平均返回相应时间: 1.434 [ms]

传输量: 135.18 [Kbytes/sec]

Cpu系统使用量平均:84%

Cpu用户使用量平均:16%

内存使用量:512M

Fastcgi测试结果

测试时长: 60.004 seconds

Complete requests: 32270

并发数: 537.80 [#/sec]

平均返回相应时间: 1.859 [ms]

传输量: 385.16 [Kbytes/sec]

Cpu系统使用量平均:51%

Cpu用户使用量平均:49%

内存使用量:500M

结论:

各项测试uWSGI明显优于Fastcgi。具体参数优化需要根据业务编写,然后再做测试。

4月 10

linux下测试python连接mysql

[整理人 :张子萌 2011-4-10]
测试环境:
centos,Python 2.6.5,setuptools-0.6c11,MySQL-python-1.2.2,mysql 5.1.44
首先需要安装zlib、zlib-devl、python和python-devl。
yum install zlib zlib-devl

安装使用包,如果已有可以不用安装
wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz
获得连接连接mysql的包
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.2/MySQL-python-1.2.2.tar.gz
可以选择高版本1.2.3就不会遇到错误1和错误2
wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz

具体操作命令:
# tar zxvf setuptools-0.6c11.tar.gz
# cd setuptools-0.6c11
# python setup.py build
# python setup.py install

# tar zxvf MySQL-python-1.2.2.tar.gz
# cd MySQL-python-1.2.2
# python setup.py build
# python setup.py install

测试脚本
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os,sys
import MySQLdb
try:
db = MySQLdb.connect(host = ‘localhost’, user=’root’ passwd = ‘xxxxx’, db = ‘mysql’)
except MySQLdb.ERROR,e:
print “Error %d:%s”%(e.args[0],e.args[1])
exit(1)
cursor = db.cursor()
cursor.execute( ‘select * from user’)
result_set=cursor.fetchall()
print result_set
cursor.close()
db.close()
如果能查到结果,恭喜正确了。

错误1.
>>> import MySQLdb
Traceback (most recent call last):
File ““, line 1, in
File “build/bdist.linux-i686/egg/MySQLdb/__init__.py”, line 19, in
File “build/bdist.linux-i686/egg/_mysql.py”, line 7, in
File “build/bdist.linux-i686/egg/_mysql.py”, line 6, in __bootstrap__
ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory

解决方法
首先查找模块
# find / -name libmysqlclient_r.so.16
/usr/local/src/mysql-5.1.44-linux-i686-glibc23/lib/libmysqlclient_r.so.16
/usr/local/mysql/lib/libmysqlclient_r.so.16
将模块路径加入动态链接库设置为共享
vim /etc/ld.so.conf
加入:libmysqlclient_r.so.16所在目录
ldconfig -v

错误2.
>>> import MySQLdb
/usr/local/lib/python2.6/site-packages/MySQL_python-1.2.2-py2.6-linux-i686.egg/MySQLdb/__init__.py:34: DeprecationWarning: the sets module is deprecated

解决方法
进入./MySQL-python-1.2.2/MySQLdb目录中
1) 在文件 “__init__” 中将:
from sets import ImmutableSet
class DBAPISet(ImmutableSet):
替换为
class DBAPISet(frozenset)
3) 在文件 “converters.py”, 把 “Set” 改为 “set”
将return set([ i for i in s.split(‘,’) if i ])中”Set” 改为 “set”
将set: Set2Str,中”Set” 改为 “set”
2) 在文件 “converters.py”中移除:
from sets import BaseSet, Set
修改完毕后在做编译和安装。

错误3.
_mysql.c:36:23: 错误:my_config.h:没有那个文件或目录

解决方法
设置include 头文件路径即可,如下
export C_INCLUDE_PATH=/usr/local/mysql/include/

错误4.
>>> cur.execute(‘select * from user’)
Segmentation fault

解决方法
将语句写为“select user,host from user”可以正常查出。
在64位的服务器上安装发现此问题。不知道为什么会有段错误。是否所有64位服务
器均有此问题,我没有测试

3月 16

linux 系统数据恢复

[整理人:张子萌 2011-03-14]

linux管理员不小心rm了数据,会很郁闷,所以需要数据恢复。我记录个人的恢复实验结果。如果可以把硬盘拿下里挂载windows上可以试试Raise Data Recovery for Ext2/Ext3/Ext4、r-linux工具,其它工具也很多,但是收费的居多。用windows恢复后容易造成使用权限错误等问题,所以不能直接恢复到linux盘上使用。据说winpe里也可以用,但是我没有做实验,毕竟用winpe在服务器上也挺怪的。主要实验一下在linux上实际操作。TestDisk、PhotoRec、ext3grep。TestDisk主要用来恢复损坏的分区以及拯救无法引导的磁盘。PhotoRec 主要用于恢复损坏的数据文件和文档等。Ext3grep恢复大部分数据文件。

PhotoRec 下载地址

http://www.cgsecurity.org/wiki/PhotoRec

ext3grep下载地址

http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

软件主站

http://www.xs4all.nl/~carlo17/howto/undelete_ext3.html

先看ext3grep效果,我的分区如下

linux 系统数据恢复 - simon-zzm - simon个人观点

在program下随便放了一个文档pdf。并且见了3个目录abc,在a目录下放了一个txt文件。

# rm -rf 2011.pdf a/

把a目录和2011.pdf删除,删除完毕卸载/program分区,准备测试恢复。

首先安装或升级一下e2fsprogs、e2fslibs库,在CentOS中安装e2fsprogs库。如果是Ubuntu需要安装两个库,命令sudo apt-get install e2fsprogs e2fslibs-dev。我的实验环境是Centos。(任何恢复都需要安装此库)

#yum install –y e2fsprogs

# wget http://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz

# tar zxvf ext3grep-0.10.2.tar.gz

# cd ext3grep-0.10.2

# ./configure

# make && make install

ext3grep主要参数:

–print 打印块、inode和所有信息

–ls 打印目录、过滤信息

–inode 从某个indoechazhao

–block 从某个块查找

–group 只找某个组

–after 找在某点时间后删除的数据

–before 找在某点时间前删除的数据

–restore-file 恢复文件到某个目录

–restore-all 恢复所有删除,删除的数据会在当前的RESTORED_FILES目录中

开始从第二个inode扫描删除的文件

# ext3grep /dev/sda4 –ls –inode 2

扫描完成如下图

linux 系统数据恢复 - simon-zzm - simon个人观点

在第四列为inode值,第五列中写有D的就是被删除的文件。

使用一下命令我看看a目录下有什么东西,a目录的inode值为75777

# # ext3grep /dev/sda4 –ls –deteled –inode 75777

linux 系统数据恢复 - simon-zzm - simon个人观点

# ext3grep /dev/sda4 –restore-file a/123.txt

linux 系统数据恢复 - simon-zzm - simon个人观点

看到Restoring 已经恢复成功,查看123.txt文件文件内容没有问题,但是pdf的没有成功,不知道为什么。又测试删除mysql数据库的数据,经过恢复的数据也可以使用。总体说效果挺好。

然后试试PhotoRec,官方说明能恢复格式如下:

– RIFF audio/video (.avi/.wav)

– BMP bitmap (.bmp)

– bzip2 compressed data (.bz2)

– Source code written in C (.c)

– Canon Raw picture (.crw)

– Canon catalog (.ctg)

– FAT subdirectory

– Microsoft Office Document (.doc)

– Nikon dsc (.dsc)

– HTML page (.html)

– JPEG picture (.jpg)

– MOV video (.mov)

– MP3 audio (MPEG ADTS, layer III, v1) (.mp3)

– Moving Picture Experts Group video (.mpg)

– Minolta Raw picture (.mrw)

– Olympus Raw Format picture (.orf)

– Portable Document Format (.pdf)

– Perl script (.pl)

– Portable Network Graphics (.png)

– Raw Fujifilm picture (.raf)

– Contax picture (.raw)

– Rollei picture (.rdc)

– Rich Text Format (.rtf)

– Shell script (.sh)

– Tar archive (.tar )

– Tag Image File Format (.tiff)

– Microsoft ASF (.wma)

– Sigma/Foveon X3 raw picture (.x3f)

– zip archive (.zip)

支持的磁盘格式如下:

– DOS/Windows FAT12, FAT16 and FAT32

– NTFS ( Windows NT/2K/XP )

– Linux Ext2 and Ext3

– BeFS ( BeOS )

– BSD disklabel ( FreeBSD/OpenBSD/NetBSD )

– CramFS (Compressed File System)

– HFS and HFS+, Hierarchical File System

– JFS, IBM’s Journaled File System

– Linux Raid

– Linux Swap (versions 1 and 2)

– LVM and LVM2, Linux Logical Volume Manager

– Netware NSS

– ReiserFS 3.5, 3.6 and 4

– Sun Solaris i386 disklabel

– UFS and UFS2 (Sun/BSD/…)

– XFS, SGI’s Journaled File System

试试看

# wget http://www.cgsecurity.org/testdisk-6.11.3.linux26.tar.bz2

# bunzip2 testdisk-6.11.3.linux26.tar.bz2

# tar xvf testdisk-6.11.3.linux26.tar

# cd /root/testdisk-6.11.3/linux

# ./testdisk_static

linux 系统数据恢复 - simon-zzm - simon个人观点

英文提示很简。测试了一下图片格式恢复没有问题,其它格式没有试,但是名称都变成索引名了,有点不方便。

还存在一个问题就是ext4格式。ext4在rehdat5中已经支持,但是需要安装e4fsprogs,在redhat6中已经是默认安装,所以将来使用ext4的几率也很大。Ext3grep工具在ext4下已经无能为力,所以需要其它工具的支持。上网上找找是否会有ext4grep,发现了http://tjworld.net/wiki/Linux/Ext4Undelete,没有搞清楚。

介绍较多的是extundelete。

extundelete的下载地址

http://extundelete.sourceforge.net/

linux 系统数据恢复 - simon-zzm - simon个人观点

首先安装e2fsprogs和e2fslibs,然后编译

# cd extundelete-0.2.0

# ./configure

# make

不安装了直接用

#cd src

# /extundelete /dev/sda9 –restore-all

应该是我系统内核版本太低,虽然支持ext4,但软件恢复却没有成功。内核2.6.28以上的应该没有问题。Fedora上有人测试过没有问题,redhat和centos就应该没有问题。

试试PhotoRec是否可以恢复ext4的盘。步骤抓图如下:

启动

linux 系统数据恢复 - simon-zzm - simon个人观点

选择磁盘

linux 系统数据恢复 - simon-zzm - simon个人观点

选择好分区类型

linux 系统数据恢复 - simon-zzm - simon个人观点

选择要恢复的盘

linux 系统数据恢复 - simon-zzm - simon个人观点

不知道为什么支持了,和介绍里说的不一样,选第一项

linux 系统数据恢复 - simon-zzm - simon个人观点

选第一项

linux 系统数据恢复 - simon-zzm - simon个人观点

选择恢复后的路径,直接点y,保存到当前目录的recup_dir.1目录中

linux 系统数据恢复 - simon-zzm - simon个人观点
进入recup_dir.1目录查看jpg文件恢复了,并且可以使用,但是名称有变化了。pdf的好像没有成功。
linux 系统数据恢复 - simon-zzm - simon个人观点

照目前看txt等文本类和图片类的恢复也没有问题,但是只能靠grep在去找那个是需要的文件了。

经验总结:

使用rm需要格外小心(会出人命的)。在不小心删除后,最好及时卸载分区,避免数据覆盖写入。如果必须挂载,可以使用只读模式。