nginx alias的设置

nginx也有像apache的别名功能,格式为:

  1. location ~ /alias {
  2.     root           /home/www/default;
  3.     index          index.php;
  4. }

但nginx在处理php脚本时,需要传递给fastcgi才能处理,所以比apache的别名设置多一个,下面我们以phpmyadmin别名设置为例:

  1. location ~ ^/phpmyadmin.+.php$ {
  2.     root          /home/www/default;
  3.     fastcgi_pass   127.0.0.1:9000;
  4.     fastcgi_index  index.php;
  5.     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  6.     include        fastcgi_params;
  7. }
  8. location ~ /phpmyadmin {
  9.     root           /home/www/default;
  10.     index          index.php;
  11. }

wordpress启用memcached

wordpress启用memcached需要环境符合两个条件,1,安装了php-memcached扩展,2,安装了memcached
1、启用方法很简单,如果你的memcached启用的是默认端口11211,则只需要下载object-cache.php文件到wp-content目录即可。
2、如果端口不是11211或者需要配置多台memcached,则需要修改wp-config.php文件,在文件中加入下面代码。

  1. global $memcached_servers;
  2. $memcached_servers = array(‘default’ => array(‘127.0.0.1:11211′,’192.168.1.101:11211’)); // 这里是你的 memcached 地址和端口
  3. global $blog_id;
  4. $blog_id = ‘centos_blog’; // 这里是用于区分服务器上有多个 wordpress 而避免使用同一内存缓存

CentOS安装mysql分布式缓存服务器memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。下面我们来一步步安装memcached。
1、首先为PHP安装扩展memcache。参考如下教程。
http://devops.webres.wang/2011/11/linux-install-php-memcache/
2、安装libevent

  1. yum -y install libevent-devel

3、下载memcached

  1. wget -c http://memcached.googlecode.com/files/memcached-1.4.9.tar.gz
  2. tar xzf memcached-1.4.9.tar.gz
  3. cd memcached-1.4.9

4、开始编译安装memcached

  1. ./configure –prefix=/usr/local/memcached
  2. make
  3. make install

5、配置memcached
1)下载启动脚本

  1. wget http://devops.webres.wang/wp-content/uploads/2011/11/memcached -O /etc/init.d/memcached
  2. chmod +x /etc/init.d/memcached

2)创建文件/usr/local/memcached/memcached.conf,并写入以下代码。

  1. PORT="11211"
  2. USER="memcached"
  3. MAXCONN="2048"
  4. CACHESIZE="64"
  5. OPTIONS=""

PORT=”11211″:指定端口为11211
USER=”memcached”:以memcached用户运行
MAXCONN=”2048″:最大连接数
CACHESIZE=”64″:设置缓存内存为64M
3)建立用户memcached,加入启动项,并启动memcached

  1. groupadd memcached
  2. useradd -g memcached memcached
  3. chkconfig –add memcached
  4. chkconfig memcached on
  5. service memcached start

Linux安装php扩展memcache

php扩展memcache的作用是为了支持memcached数据库缓存服务器,下面是安装方法。
1、下载并解压memcache文件

  1. wget -c http://pecl.php.net/get/memcache-3.0.6.tgz
  2. tar xzvf memcache-3.0.6.tgz
  3. cd memcache-3.0.6

2、执行phpize扩展安装程序,假设phpzie的路径为/usr/local/php/bin/phpize,具体的路径得根据自己的环境修改。

  1. /usr/local/php/bin/phpize

3、开始安装扩展memcache

  1. ./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir
  2. make && make install

4、最后修改php.ini文件,在zend之前加入如下代码。

  1. [memcache]
  2. extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
  3. extension=memcache.so

解决apache与vsftpd写入权限共存问题

我们有时候会遇到apache有写入权限时,vsftpd又不能上传,反过来,vsftpd能上传,但apache又没有写入权限了。我们现在来看看如何解决这个问题。解决的思路是,把ftp用户添加到apache用户组,并设置用户组有写入权限。
假设现在我们建有ftp用户为:centos,httpd进程以apache用户运行。
1、添加centos到用户组apache

  1. usermod -a -G apache centos

2、设置网站根目录/var/www的所有组为apache

  1. chown -R :apache /var/www

3、设置网站根目录的权限为用户组有读写权限

  1. chmod -R g+rw /var/www

最后还需要确认vsftpd的配置文件中的local_umask=002,这是使新上传的文件的用户组有写入权限。

使用mysqlslap进行MySQL压力测试

MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常的简单。通过mysqlslap –help可以获得可用的选项,这里列一些主要的参数,更详细的说明参考官方手册

  1. –auto-generate-sql, -a
  2. 自动生成测试表和数据
  3.  
  4. –auto-generate-sql-load-type=type
  5. 测试语句的类型。取值包括:read,key,write,update和mixed(默认)。
  6.  
  7. –number-char-cols=N, -x N
  8. 自动生成的测试表中包含多少个字符类型的列,默认1
  9.  
  10. –number-int-cols=N, -y N
  11. 自动生成的测试表中包含多少个数字类型的列,默认1
  12.  
  13. –number-of-queries=N
  14. 总的测试查询次数(并发客户数×每客户查询次数)
  15.  
  16. –query=name,-q
  17. 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
  18.  
  19. –create-schema
  20. 测试的schema,MySQL中schema也就是database
  21.  
  22. –commint=N
  23. 多少条DML后提交一次
  24.  
  25. –compress, -C
  26. 如果服务器和客户端支持都压缩,则压缩信息传递
  27.  
  28. –concurrency=N, -c N
  29. 并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者–delimiter参数指定的值做为分隔符
  30.  
  31. –engine=engine_name, -e engine_name
  32. 创建测试表所使用的存储引擎,可指定多个,用分隔符隔开。
  33.  
  34. –iterations=N, -i N
  35. 测试执行的迭代次数
  36.  
  37. –detach=N
  38. 执行N条语句后断开重连
  39.  
  40. –debug-info, -T
  41. 打印内存和CPU的信息
  42.  
  43. –only-print
  44. 只打印测试语句而不实际执行
  45.  
  46. –defaults-file
  47. 配置文件存放位置
  48.  
  49. –socket=name,-S
  50. 指定socket文件位置

一些实例
  用自动生成的测试数据进行测试,且只打印实际的测试过程。

  1. # /usr/local/webserver/mysql/bin/mysqlslap  -a –only-print
  2. DROP SCHEMA IF EXISTS `mysqlslap`;
  3. CREATE SCHEMA `mysqlslap`;
  4. use mysqlslap;
  5. CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128));
  6. INSERT INTO t1 VALUES (1804289383,’mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekbWtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1KQ1lT4zg9rdxBL’);
  7. INSERT INTO t1 VALUES (822890675,’97RGHZ65mNzkSrYT3zWoSbg9cNePQr1bzSk81qDgE4Oanw3rnPfGsBHSbnu1evTdFDe83ro9w4jjteQg4yoo9xHck3WNqzs54W5zEm92ikdRF48B2oz3m8gMBAl11W’);
  8. ……
  9. INSERT INTO t1 VALUES (100669,’qnMdipW5KkXdTjGCh2PNzLoeR0527frpQDQ8uw67Ydk1K06uuNHtkxYBxT5w8plb2BbpzhwYBgPNYX9RmICWGkZD6fAESvhMzH3yqzMtXoH4BQNylbK1CmEIPGYlC6′);
  10. SELECT intcol1,charcol1 FROM t1;
  11. INSERT INTO t1 VALUES (73673339,’BN3152Gza4GW7atxJKACYwJqDbFynLxqc0kh30YTwgz3FktQ43XTrqJ4PQ25frn7kXhfXD8RuzN1j8Rf3y8ugKy6es3IbqPJM6ylCyD6xS7YcQCfHKZxYNvB7yTahm’);
  12. DROP SCHEMA IF EXISTS `mysqlslap`;

分别100和200个并发,执行1000次总查询

  1. $mysqlslap -a –concurrency=50,100 –number-of-queries 1000 –debug-info
  2.  
  3. # /usr/local/webserver/mysql/bin/mysqlslap  -a –concurrency=100,200 –number-of-queries 1000 –debug-info
  4.  
  5. Benchmark
  6. Average number of seconds to run all queries: 0.232 seconds
  7. Minimum number of seconds to run all queries: 0.232 seconds
  8. Maximum number of seconds to run all queries: 0.232 seconds
  9. Number of clients running queries: 100
  10. Average number of queries per client: 10
  11.  
  12. Benchmark
  13. Average number of seconds to run all queries: 0.268 seconds
  14. Minimum number of seconds to run all queries: 0.268 seconds
  15. Maximum number of seconds to run all queries: 0.268 seconds
  16. Number of clients running queries: 200
  17. Average number of queries per client: 5
  18.  
  19.  
  20. User time 0.02, System time 0.49
  21. Maximum resident set size 6100, Integral resident set size 0
  22. Non-physical pagefaults 3165, Physical pagefaults 0, Swaps 0
  23. Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  24. Voluntary context switches 3102, Involuntary context switches 7541

分别200和400个并发,执行2000次总查询并迭代8次

  1. # /usr/local/webserver/mysql/bin/mysqlslap -a   –concurrency=200,400 –number-of-queries 2000 –iterations=8  –debug-info
  2.  
  3. Benchmark
  4. Average number of seconds to run all queries: 0.657 seconds
  5. Minimum number of seconds to run all queries: 0.603 seconds
  6. Maximum number of seconds to run all queries: 0.736 seconds
  7. Number of clients running queries: 200
  8. Average number of queries per client: 10
  9.  
  10. Benchmark
  11. Average number of seconds to run all queries: 0.711 seconds
  12. Minimum number of seconds to run all queries: 0.648 seconds
  13. Maximum number of seconds to run all queries: 0.860 seconds
  14. Number of clients running queries: 400
  15. Average number of queries per client: 5
  16.  
  17.  
  18. User time 0.58, System time 9.12
  19. Maximum resident set size 30764, Integral resident set size 0
  20. Non-physical pagefaults 92471, Physical pagefaults 0, Swaps 0
  21. Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  22. Voluntary context switches 99629, Involuntary context switches 157741

同时测试不同的存储引擎

  1. # /usr/local/webserver/mysql/bin/mysqlslap -a   –concurrency=200,400 –number-of-queries 2000 –iterations=8  –engine=myisam,innodb  –debug-info
  2.  
  3. Benchmark
  4. Average number of seconds to run all queries: 0.740 seconds
  5. Minimum number of seconds to run all queries: 0.678 seconds
  6. Maximum number of seconds to run all queries: 0.827 seconds
  7. Number of clients running queries: 200
  8. Average number of queries per client: 10
  9.  
  10. Benchmark
  11. Average number of seconds to run all queries: 0.696 seconds
  12. Minimum number of seconds to run all queries: 0.661 seconds
  13. Maximum number of seconds to run all queries: 0.775 seconds
  14. Number of clients running queries: 400
  15. Average number of queries per client: 5
  16.  
  17.  
  18. User time 0.62, System time 9.27
  19. Maximum resident set size 33368, Integral resident set size 0
  20. Non-physical pagefaults 89594, Physical pagefaults 0, Swaps 0
  21. Blocks in 0 out 0, Messages in 0 out 0, Signals 0
  22. Voluntary context switches 98328, Involuntary context switches 153787

指定数据库的测试

  1. # /usr/local/webserver/mysql/bin/mysqlslap  –concurrency=500 –iterations=8 –create-schema=test –query=/root/test.sql
  2.  
  3. Benchmark
  4. Average number of seconds to run all queries: 0.343 seconds
  5. Minimum number of seconds to run all queries: 0.283 seconds
  6. Maximum number of seconds to run all queries: 0.525 seconds
  7. Number of clients running queries: 500
  8. Average number of queries per client: 1

转自:http://www.mike.org.cn/articles/mysql-stress-tests-conducted-by-mysqlslap/

MySQL查询缓存设置 提高MySQL查询性能

从 MySQL4开始,出现了QueryCache查询缓存,如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询。这样就大大提高了性能,节省时间,非常有用。

打开查询缓存,是通过几个步骤来设置的,例如:虽然你设置Mysql允许查询缓存,但是如果你设置的查询缓存大小为了0,这和没有允许没什么区别。所以必须是几个步骤的设置才能真正打开查询缓存这个功能。

下面我用 mysql6.0 最为演示最常用的设置查询缓存
第一: query_cache_type 使用查询缓存的方式
一般,我们会把 query_cache_type 设置为 ON,默认情况下应该是ON

  1. mysql> select @@query_cache_type;

+——————–+
| @@query_cache_type |
+——————–+
| ON |
+——————–+
这样 当我们执行 select id,name from tableName; 这样就会用到查询缓存。在 query_cache_type 打开的情况下,如果你不想使用缓存,需要指明select sql_no_cache id,name from tableName;当然也可以禁用查询缓存: mysql> set session uery_cache_type=off;
这里我们不讨论这个,我们演示常用的设置。
第二: 系统变量 have_query_cache 设置查询缓存是否可用

  1. mysql> show variables like ‘have_query_cache’;

+——————+——-+
| Variable_name | Value |
+——————+——-+
| have_query_cache | YES |
+——————+——-+
上面的显示,表示设置查询缓存是可用的。
第三: 系统变量 query_cache_size
表示查询缓存大小,也就是分配内存大小给查询缓存,如果你分配大小为0,
那么 第一步 和 第二步 起不到作用,还是没有任何效果。

  1. mysql> select @@global.query_cache_size;

+—————————+
| @@global.query_cache_size |
+—————————+
| 16777216 |
+—————————+
上面是 mysql6.0设置默认的,之前的版本好像默认是0的,那么就要自己设置下。
设置 set @@global.query_cache_size=1000000; 这里是设置1M左右,900多K。
再次查看下 select @@global.query_cache_size;
+—————————+
| @@global.query_cache_size |
+—————————+
| 999424 |
+—————————+
显示我们设置新的大小,表示设置成功。
第四: query_cache_limit 控制缓存查询结果的最大值
例如: 如果查询结果很大, 也缓存????这个明显是不可能的。
MySql 可以设置一个最大的缓存值,当你查询缓存数结果数据超过这个值就不会
进行缓存。缺省为1M,也就是超过了1M查询结果就不会缓存。

  1. mysql> select @@global.query_cache_limit;

+—————————-+
| @@global.query_cache_limit |
+—————————-+
| 1048576 |
+—————————-+
这个是默认的数值,如果需要修改,就像设置缓存大小一样设置,使用set重新指定大小。
好了,通过4个步骤就可以 打开了查询缓存,具体值的大小和查询的方式 这个因不同的情况来指定了。
有关MySQL查询缓存更详细的介绍请看:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#query-cache
转自:http://hi.baidu.com/aganle/blog/item/49e4703983110b2cb9998f7c.html

wordpress评论与回复慢的原因及解决方法

博客回复读者的评论发现都超过30秒,一直懒得理。今天连续回复几条评论,发现实在无法忍受了,就开始着手解决这一问题。
1、是不是评论的程序代码有问题?可以排除,因为一回复读者评论,后台马上显示回复内容,只是浏览器一直显示正在提交评论…
2、开始查看vps的进程,发现有一个以用户apache运行的sendmail进程,这个应该可以确认是sendmail的问题。
3、查看sendmail日志。日志如下:
My unqualified host name (centos) unknown; sleeping for retry
unable to qualify my own domain name (centos) — using short name
大概的意思是:centos不是完整的主机名,无法使用,等待重试。
原因:因为centos不是完整的主机名,所以sendmail无法解析出IP,sendmail就一直尝试解析,导致http连接无法结束,一直到sendmail进程超时。
解决方法:
1、设置完整的主机名(重启后会丢失):

  1. hostname devops.webres.wang

2、永久设置主机名
修改/etc/sysconfig/network文件,把hostname centos改为hostname devops.webres.wang

Linux 内存机制

一. 内存使用说明

Free 命令相对于top 提供了更简洁的查看系统内存使用情况:

[root@rac1 ~]# free
total used free shared buffers cached
Mem: 1035108 1008984 26124 0 124212 413000
-/+ buffers/cache: 471772 563336
Swap: 2096472 842320 1254152

这里显示的单位是KB。

在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

Mem:表示物理内存统计。
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况。只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap。

Mem 行(第一行)数据说明:
Total:1035108KB。表示物理内存总大小。
Used:1008984KB。表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
Free:26124KB。表示未被分配的内存。
Shared:0kb。共享内存,一般系统不会用到。
Buffers:124212KB。系统分配但未被使用的buffers 数量。
Cached:413000KB。系统分配但未被使用的cache 数量。

-/+ buffers/cache 行(第二行)数据说明:
Used:471772kb,实际使用的buffers 与cache 总量,也是实际使用的内存总量。
Free: 563336kb, 未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

根据以上分析,可以得出一下结论:
1. 实际可用内存大小:
Free(-/+ buffers/cache行)= Free(Mem)+buffers(Mem)+Cached(Mem);
563336 = 26124 + 124212+ 413000

2. 已经分配的内存大小:
Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)
1008984kb = 471772 + 124212 +413000

3. 物理内存总大小
total(Mem) = used(-/+ buffers/cache) + free(-/+ buffers/cache)
1035108 = 471772 + 563336

二. Swap配置对性能的影响

分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。 如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。

通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,一般来说对于4G 以下的物理内存,配置2倍的swap,4G 以上配置1倍。

另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。

三. Linux 内存机制

Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。这些操作对用户来说是完全透明的;Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到时不时它们的一部分是驻留在硬盘上的。当然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间(Swap Space)。

一般,在交换空间中的页面首先被换入内存;如果此时没有足够的物理内存来容纳它们又将被交换出来(到其他的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。
有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种情况是有可能发生的,例如如果在某一时刻有进行交换的必要,但后来一个占用很多物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个需要时。此时物理内存会在一段时间内保持空闲状态。对此并没有什么可担心的,但是知道了是怎么一回事,也就无所谓了。
许多操作系统使用了虚拟内存的方法。因为它们仅在运行时才需要交换空间,以解决不会在同一时间使用交换空间,因此,除了当前正在运行的操作系统的交换空间,其它的就是一种浪费。所以让它们共享一个交换空间将会更有效率。

注意:如果会有几个人同时使用这个系统,他们都将消耗内存。然而,如果两个人同时运行一个程序,内存消耗的总量并不是翻倍,因为代码页以及共享的库只存在一份。

Linux系统常常动不动就使用交换空间,以保持尽可能多的空闲物理内存。即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间:当磁盘闲着,就可以提前做好交换。可以将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样做可以提高性能。

与访问物理内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内多次读磁盘同样的部分也是常有的事。例如,某人也许首先阅读了一段E-mail消息,然后为了答复又将这段消息读入编辑器中,然后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。通过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读以外,可以加快所有其它读的速度。这叫作磁盘缓冲(Disk Buffering),被用作此目的的内存称为高速缓冲(Buffer Cache)。但是,由于内存是一种有限而又不充足的资源,高速缓冲不可能做的很大(它不可能包容要用到的所有数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。

对写磁盘操作来说磁盘缓冲技术同样有效。一方面,被写入磁盘的数据常常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),所以将要被写的数据放入缓冲中是个好主意。另一方面,通过将数据放入缓冲中,而不是将其立刻写入磁盘,程序可以加快运行的速度。以后,写的操作可以在后台完成,而不会拖延程序的执行。

大多数操作系统都有高速缓冲(尽管可能称呼不同),但是并不是都遵守上面的原理。有些是直接写(Write-Through):数据将被立刻写入磁盘(当然,数据也被放入缓存中)。如果写操作是在以后做的,那么该缓存被称为后台写(Write-Back)。后台写比直接写更有效,但也容易出错:如果机器崩溃,或者突然掉电,缓冲中改变过的数据就被丢失了。如果仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(如果有的话)已不完整。

针对以上的原因,出现了很多的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即使此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。当然这些问题不再本文的叙述范围。

由于上述原因,在使用适当的关闭过程之前,绝对不要关掉电源,Sync命令倾空(Flushes)缓冲,也即,强迫所有未被写的数据写入磁盘,可用以确定所有的写操作都已完成。在传统的UNIX系统中,有一个叫做update的程序运行于后台,每隔30秒做一次sync操作,因此通常无需手工使用sync命令了。Linux另外有一个后台程序,Bdflush,这个程序执行更频繁的但不是全面的同步操作,以避免有时sync的大量磁盘I/O操作所带来的磁盘的突然冻结。

在Linux中,Bdflush是由update启动的。通常没有理由来担心此事,但如果由于某些原因bdflush进程死掉了,内核会对此作出警告,此时你就要手工地启动它了(/sbin/update)。

缓存(Cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据都可以被缓冲了。缓冲的效力主要是由它的大小决定的。缓冲太小的话等于没用。它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。
如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,当程序需要更多的内存时,它也会自动地减小缓冲的大小。

这就是一般情况下Linux内存的一般机制,真正的Linux内存的运行机制远远比这个复杂。
摘自:http://blog.csdn.net/tianlesoftware/article/details/5463790

varnish前端缓存测试

今天给lamp一键安装包增加了一个扩展-varnish,主要作为wordpress博客的缓存。下面我们来用ab工具做一个简单的并发为100,连接数为1000的压力测试,一个是没有启用varnish缓存的,一个是varnish前面缓存的。
服务器参数:系统centos 5 32位,单核,Intel(R) Xeon(R) CPU L5630 @ 2.13GHz,1G内存
没有经过varnish缓存的测试结果:
负载40.44
Concurrency Level: 100
Time taken for tests: 305.766 seconds
Complete requests: 1000
Failed requests: 1
(Connect: 0, Receive: 0, Length: 1, Exceptions: 0)
Write errors: 0
Non-2xx responses: 1
Total transferred: 19746015 bytes
HTML transferred: 19521638 bytes
Requests per second: 3.27 [#/sec] (mean)
Time per request: 30576.620 [ms] (mean)
Time per request: 305.766 [ms] (mean, across all concurrent requests)
Transfer rate: 63.07 [Kbytes/sec] received
开启了varnish前端缓存的
负载0.05

Concurrency Level: 100
Time taken for tests: 12.720 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 20086736 bytes
HTML transferred: 19821261 bytes
Requests per second: 78.62 [#/sec] (mean)
Time per request: 1271.991 [ms] (mean)
Time per request: 12.720 [ms] (mean, across all concurrent requests)
Transfer rate: 1542.15 [Kbytes/sec] received

这两组数据不用我说,你也应该明白了。