使用内存作linux下的临时文件夹
[ 2009/08/17 18:37 | by selboo ]
从理论上来说,内存的读写速度是硬盘的几十倍,性能应该会有所提升
在一些访问量比较高的系统上,通过把一些频繁访问的文件,比如session 放入内存中,能够减少很多的iowait,大大提高服务器的性能
在/etc/fstab中加入一行:
none /tmp tmpfs defaults 0 0
重启后生效
或者在/etc/rc.local中加入
mount tmpfs /tmp -t tmpfs -o size=128m
其中size=128m 表示/tmp最大能用128m
或
mount tmpfs /tmp -t tmpfs
不限制大小,这种情况可以用到2G内存,用 df -h 可以看到
tmpfs 2.0G 48M 2.0G 3% /tmp
注:不管哪种方式,只要linux重启,/tmp下的文件全部消失
另外,在一个正在运行的系统上运行 mount tmpfs /tmp -t tmpfs 会导致 /tmp下原来的所有文件都会被“覆盖”掉,之所以加个“”,因为这种覆盖只是暂时的,如果 umount /tmp的话,原来的文件还能再访问。
因为这些文件会被“覆盖”,比如原来的session mysql.sock等文件就不能访问了,用户的登陆信息就会丢失,mysql数据库也无法连接了(如果mysql.sock位于/tmp下的话)。
正确的做法是,先把/tmp下的所有文件临时mv到一个别的目录,mount tmpfs之后,再mv回来
在一些访问量比较高的系统上,通过把一些频繁访问的文件,比如session 放入内存中,能够减少很多的iowait,大大提高服务器的性能
在/etc/fstab中加入一行:
none /tmp tmpfs defaults 0 0
重启后生效
或者在/etc/rc.local中加入
mount tmpfs /tmp -t tmpfs -o size=128m
其中size=128m 表示/tmp最大能用128m
或
mount tmpfs /tmp -t tmpfs
不限制大小,这种情况可以用到2G内存,用 df -h 可以看到
tmpfs 2.0G 48M 2.0G 3% /tmp
注:不管哪种方式,只要linux重启,/tmp下的文件全部消失
另外,在一个正在运行的系统上运行 mount tmpfs /tmp -t tmpfs 会导致 /tmp下原来的所有文件都会被“覆盖”掉,之所以加个“”,因为这种覆盖只是暂时的,如果 umount /tmp的话,原来的文件还能再访问。
因为这些文件会被“覆盖”,比如原来的session mysql.sock等文件就不能访问了,用户的登陆信息就会丢失,mysql数据库也无法连接了(如果mysql.sock位于/tmp下的话)。
正确的做法是,先把/tmp下的所有文件临时mv到一个别的目录,mount tmpfs之后,再mv回来
mysql 优化的一些小窍门
[ 2009/08/17 18:16 | by selboo ]
* 针对Innodb表,尽量不执行SELECT COUNT(*)语句,因为Innodb表没有类似MyISAM那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢.
* 尽量使用MyISAM表,除非必须使用其他类型,因为MyISAM类型的总体读写效率是相当高的,缺点是表级锁,而不是行/页级锁.
* 善用EXPLAIN来帮助你分析查询优化情况
* 如果需要对一个较大的且并发读写较多的数据表做GROUP BY等统计操作,建议使用摘要表来存储统计信息,定期更新统计表,这可能获得很大的性能改善.
* 查询时如果有ORDER BY分句的话,注意让它的字段顺序和索引字段顺序对应,这样能加快排序速度
* 如果有一个多字段索引,则查询时,必须按照索引顺序来使用,否则该索引不会用到.例如:
索引`idx_`(col1, col2, col3),那么查询SELECT .... FROM ... WHERE col1=1 AND col2=2;使用索引,而查询... WHERE col2=2 AND col3=3;或... WHERE col1=1 AND col3=3;则不使用索引.
* WHERE中的条件如果有恒量类型的(如 `field` = 1),就尽量放在前面,这样能更快的执行过滤.
* 2 个表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引速度快多了.
* 大部分情况下,字符类型的字段索引值需要一部分,例如CREATE INDEX char_idx ON tbl1 ( name(10) );
* 尽量使用最合适的数据类型,能使用ENUM就不使用TINYINT,能使用SMALLINT就不使用MEDIUMINT.这样能节省存储空间,增加数据存储量,提高搜索速度.不要担心这样会对省级产生很大的影响,因为加入从TINYINT类型改变为INT的话,并不会改变原来的数据.
* 如果知道某个表总是频繁使用的话,可以把它放到hot_cache中,用以下方法:
SET GLOBAL hot_cache.key_buffer_size=128*1024;
CACHE INDEX `xxx` IN hot_cache;
* 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询,这样尽管查询次数多了,但是总体速度和效率却可能反而更高了,而且也减少了锁表的可能.
* 执行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存在的索引,并且无论如何都会极大地降低效率.如:... WHERE `create_time` > UNIX_TIMESTAMP(NOW());这样的查询.可以在程序中把当前的时间取得,然后直接执行构造好了的SQL语句.
* 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就可以利用索引,否则无法使用索引.如... `name` LIKE 'yejr%';.
* 如果有可能,多使用存储过程,这大概能获得 22% 的性能提高.
* 如果并发访问量相对最大连接数小多了的话,最好使用永久连接,这样能节省不少连接时的系统资源损耗.
* 定期的在MyISAM表上执行OPTIMIZE TABLE,这能整理随便,提高索引效率.
* 如果你主要按 col1,col2,...顺序检索记录,请在对表大量更改后执行ALTER TABLE ... ORDER BY col1, col2, ...语句,这可以获得更好的性能.
* 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段(VARCHAR、BLOB和TEXT).
* 对于记录总数超过500万的单表,就应该赶紧考虑分表了.分表策略有多种,比如按ID号段,或者按时间切分,等等.
* 创建数据表时尽量指定字段不能为NULL,并且有默认值.
* 使用LOAD DATA,而不是使用大批量的INSERT语句来导入数据.
* 使数据表名和字段名尽可能的短,例如在user表中使用字段名name,而不是user_name.
* 用DELAY_KEY_WRITE = 1选项让MyISAM更快地更新索引,因为在表关闭之前它们不刷新到硬盘上.缺点是如果服务器如果突然被杀掉了,重启之后就必须运行myisamchk修复索引才行.
* 采用复制机制来分摊读数据的负载,把写数据只放在主服务器上,把读平均分摊到各个从服务器上,能大大提高系统负载.
* 尽量使用MyISAM表,除非必须使用其他类型,因为MyISAM类型的总体读写效率是相当高的,缺点是表级锁,而不是行/页级锁.
* 善用EXPLAIN来帮助你分析查询优化情况
* 如果需要对一个较大的且并发读写较多的数据表做GROUP BY等统计操作,建议使用摘要表来存储统计信息,定期更新统计表,这可能获得很大的性能改善.
* 查询时如果有ORDER BY分句的话,注意让它的字段顺序和索引字段顺序对应,这样能加快排序速度
* 如果有一个多字段索引,则查询时,必须按照索引顺序来使用,否则该索引不会用到.例如:
索引`idx_`(col1, col2, col3),那么查询SELECT .... FROM ... WHERE col1=1 AND col2=2;使用索引,而查询... WHERE col2=2 AND col3=3;或... WHERE col1=1 AND col3=3;则不使用索引.
* WHERE中的条件如果有恒量类型的(如 `field` = 1),就尽量放在前面,这样能更快的执行过滤.
* 2 个表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引速度快多了.
* 大部分情况下,字符类型的字段索引值需要一部分,例如CREATE INDEX char_idx ON tbl1 ( name(10) );
* 尽量使用最合适的数据类型,能使用ENUM就不使用TINYINT,能使用SMALLINT就不使用MEDIUMINT.这样能节省存储空间,增加数据存储量,提高搜索速度.不要担心这样会对省级产生很大的影响,因为加入从TINYINT类型改变为INT的话,并不会改变原来的数据.
* 如果知道某个表总是频繁使用的话,可以把它放到hot_cache中,用以下方法:
SET GLOBAL hot_cache.key_buffer_size=128*1024;
CACHE INDEX `xxx` IN hot_cache;
* 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询,这样尽管查询次数多了,但是总体速度和效率却可能反而更高了,而且也减少了锁表的可能.
* 执行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存在的索引,并且无论如何都会极大地降低效率.如:... WHERE `create_time` > UNIX_TIMESTAMP(NOW());这样的查询.可以在程序中把当前的时间取得,然后直接执行构造好了的SQL语句.
* 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就可以利用索引,否则无法使用索引.如... `name` LIKE 'yejr%';.
* 如果有可能,多使用存储过程,这大概能获得 22% 的性能提高.
* 如果并发访问量相对最大连接数小多了的话,最好使用永久连接,这样能节省不少连接时的系统资源损耗.
* 定期的在MyISAM表上执行OPTIMIZE TABLE,这能整理随便,提高索引效率.
* 如果你主要按 col1,col2,...顺序检索记录,请在对表大量更改后执行ALTER TABLE ... ORDER BY col1, col2, ...语句,这可以获得更好的性能.
* 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段(VARCHAR、BLOB和TEXT).
* 对于记录总数超过500万的单表,就应该赶紧考虑分表了.分表策略有多种,比如按ID号段,或者按时间切分,等等.
* 创建数据表时尽量指定字段不能为NULL,并且有默认值.
* 使用LOAD DATA,而不是使用大批量的INSERT语句来导入数据.
* 使数据表名和字段名尽可能的短,例如在user表中使用字段名name,而不是user_name.
* 用DELAY_KEY_WRITE = 1选项让MyISAM更快地更新索引,因为在表关闭之前它们不刷新到硬盘上.缺点是如果服务器如果突然被杀掉了,重启之后就必须运行myisamchk修复索引才行.
* 采用复制机制来分摊读数据的负载,把写数据只放在主服务器上,把读平均分摊到各个从服务器上,能大大提高系统负载.
php的memcache模块的优化
[ 2009/07/28 15:14 | by selboo ]
memcache.allow_failover = 1
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211
memcache.max_failover_attempts=20
memcache.chunk_size =8192
memcache.default_port = 11211
其中比较重要的是
memcache.chunk_size
一个整型值,用于控制数据传输的大小。默认值为 8192 字节 (8 KB),但是如果设置为 32768 (32 KB),则可以获得更好的性能。
memcache.allow_failover
一个布尔值,用于控制当连接出错时 Memcache 扩展是否故障转移到其他服务器上。默认值为 1 (true)。
memcache.max_failover_attempts
一个整型值,用于限制连接到持久性数据或检索数据的服务器数目。如果 memcache.allow_failover 为 false,则将忽略此参数。默认值为 20。
memcache.default_port
另一个整型值,用于设置连接到 Memcache 所使用的 TCP 端口。除非您修改它,否则默认值为无特权的高端口 11211。
对于访问量非常大的服务器,最好是通过socket来连接memcached,这样能减少打开和关闭tcp/ip链接的开销。
如果memcached和php在两台不同的服务器上,通过udp来连接应该比tcp连接能消耗小一些,并且能获得更好的速度(尚未测试)
在memcached中启用压缩,对于通过tcp/ip 或者udp连接的memcache,能减少传输数据的大小,也能相应的降低一些负载
安装apc为php加速
[ 2009/07/21 12:25 | by selboo ]
Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。
主要是加速PHP..
WordPress是一个占用内存的大户,而且执行效率比较低..
我安装了APC后,VPS的整体内存降了30M左右吧..
下面是安装方法:
配置php.ini 末尾修改加入
[code]extension_dir = &qu
主要是加速PHP..
WordPress是一个占用内存的大户,而且执行效率比较低..
我安装了APC后,VPS的整体内存降了30M左右吧..
下面是安装方法:
wget http://pecl.php.net/get/APC-3.1.2.tgz
tar zxvf APC-3.1.2.tgz
cd APC-3.1.2/
/usr/local/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --with-php-config=/usr/local/php/bin/php-config
make
make install
tar zxvf APC-3.1.2.tgz
cd APC-3.1.2/
/usr/local/php/bin/phpize
./configure --enable-apc --enable-apc-mmap --with-php-config=/usr/local/php/bin/php-config
make
make install
配置php.ini 末尾修改加入
[code]extension_dir = &qu
from:http://jackywdx.cn/2009/05/install_php_minimum/
在研究PHP内核的时候,每次改动源代码都得重新编译PHP,每次编译都得费上好一段时间,如果只是想调试内核而不需要PHP的其他功能,可以把PHP的绝大部分模块都去掉,这样编译速度就会快很多。我用了下面的configure配置:
./configure –prefix=/usr/local/php5.2.9_2 –disable-xmlwriter –disable-xmlreader –disable-tokenizer –disable-simplexml –disable-posix –disable-dom –disable-ctype –disable-hash –disable-json –disable-filter –disable-xml –without-pear –disable-cgi –disable-pdo –disable-libxml –without-iconv –disable-spl –without-sqlite –disable-session –disable-reflection
这样编译出来的PHP其他就没有加载任何模块了,编译速度也快了不少。不过还可以改造编译的时候的环境检查,现在还不知道如何改造,等知道了再贴上来。
刚刚发现一个问题,configure只需要运行一次就够了,运行之后会生成Makefile文件,记录了一些配置选项,下次修改源文件的时候再重新编译的时候只需要运行make && make install就可以了
make install的时候会安装不少文件:
Installing PHP CLI binary: /usr/local/php5.2.9_2/bin/
Installing PHP CLI man page: /usr/local/php5.2.9_2/man/man1/
Installing build environment: /usr/local/php5.2.9_2/lib/php/build/
Installing header files: /usr/local/php5.2.9_2/include/php/
Installing helper programs: /usr/local/php5.2.9_2/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php5.2.9_2/man/man1/
page: phpize.1
page: php-config.1
但我只需要生成 php程序就可以,修改Makefile文件
install_targets = install-cli install-build install-headers install-programs
找到这一行,然后把这一行注释掉,再增加一行:
install_targets = install-cli
这样每次make install的时候就只要安装生成PHP程序了。
呵呵,这样速度快了N多。
做优化用的上了,针对自己的环境,需要什么就enable
在研究PHP内核的时候,每次改动源代码都得重新编译PHP,每次编译都得费上好一段时间,如果只是想调试内核而不需要PHP的其他功能,可以把PHP的绝大部分模块都去掉,这样编译速度就会快很多。我用了下面的configure配置:
./configure –prefix=/usr/local/php5.2.9_2 –disable-xmlwriter –disable-xmlreader –disable-tokenizer –disable-simplexml –disable-posix –disable-dom –disable-ctype –disable-hash –disable-json –disable-filter –disable-xml –without-pear –disable-cgi –disable-pdo –disable-libxml –without-iconv –disable-spl –without-sqlite –disable-session –disable-reflection
这样编译出来的PHP其他就没有加载任何模块了,编译速度也快了不少。不过还可以改造编译的时候的环境检查,现在还不知道如何改造,等知道了再贴上来。
刚刚发现一个问题,configure只需要运行一次就够了,运行之后会生成Makefile文件,记录了一些配置选项,下次修改源文件的时候再重新编译的时候只需要运行make && make install就可以了
make install的时候会安装不少文件:
Installing PHP CLI binary: /usr/local/php5.2.9_2/bin/
Installing PHP CLI man page: /usr/local/php5.2.9_2/man/man1/
Installing build environment: /usr/local/php5.2.9_2/lib/php/build/
Installing header files: /usr/local/php5.2.9_2/include/php/
Installing helper programs: /usr/local/php5.2.9_2/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php5.2.9_2/man/man1/
page: phpize.1
page: php-config.1
但我只需要生成 php程序就可以,修改Makefile文件
install_targets = install-cli install-build install-headers install-programs
找到这一行,然后把这一行注释掉,再增加一行:
install_targets = install-cli
这样每次make install的时候就只要安装生成PHP程序了。
呵呵,这样速度快了N多。
做优化用的上了,针对自己的环境,需要什么就enable