Aug15

【原创】《构建高性能Web站点》读书笔记

Author: leeon  Click: 6239   Date: 2010.08.15 @ 10:39:30 am Category: 其他

Etag Cache-Control Expires Last-Modified 这四者的区别?

答:Ctrl+F5 强制刷新,不使用本地cache,故对上述四者均无效。

      F5 对Etag(If-None-Match)和Last-Modified(If-Modified-Since)有效,会向服务器发起询问文件是否过期,如果没有过期会返回304,如果过期会返回200

     Expires 只对通过链接跳转和通过地址栏“转到”按钮有效。这样不会像服务器发起询问,只会扫描本地cache并返回给浏览器。这样速度是最快的

     Cache-Control用来记录max-age,这种标记是在HTTP1.1中出现的,用来弥补本地时间和服务器时间的不同导致缓存失效,max-age依据本地时间来进行cache,这样有效的保证了过期时间的确定性

 

sendfile--->直接将文件所在磁盘的特定部分传送给客户端的socket描述符

APC -->opcode缓存:(php.ini:apc.cache_by_default=on)是php转换后的解释代码直接做cache,这样做性能非常好。

Xcache

Xdebug-->WinCacheGrind(一款可以读取xdebug输出的profiler信息的工具)

Apache缓存

--> mod_disk_cache  和 mod__mem_cache(官方已放弃,原因为apache多进程模型下共享内存缓存的开销较大)

-->apache缓存可以识别:Last-modified 和expires 

 --> 可以通过设置:CacheIgnoreHeaders Set-cookie来避免有cookies的页面形成cache。

-->缓存文件描述符,apache可以通过:CacheFile /data/www/index.html 的方式来指定在apache cache中记录文件描述符,提升查找文件的速度。(当文件更新后,必须重启apche才能刷新cache。)

 

提高web服务和mysql服务在同一台主机上的性能

通常教科书是让我写


mysql_connect("127.0.0.1","xxxx","xxxx");

是的这样的连接方式是在同一台主机上形成tcp连接,但是这样的tcp握手是非常消耗资源的。我们为何不用mysql的另外一种连接方式socket来提升php与mysql的连接性能呢?

PHP手册中有提到socket的连接方式:


// we connect to localhost and socket e.g. /tmp/mysql.sock

//variant 1: ommit localhost
$link = mysql_connect('/tmp/mysql', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);


// variant 2: with localhost
$link = mysql_connect('localhost:/tmp/mysql.sock', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>

 Note:只要将 server 指定为 "localhost" 或 "localhost:port",MySQL 客户端库会越过此值并尝试连接到本地套接字(Windows 中的名字管道)。如果想用 TCP/IP,应该用 "127.0.0.1" 代替 "localhost"。如果 MySQL 客户端库试图连接到一个错误的本地套接字,则应该在 PHP 配置中设定 MySQL 的正确路径并把 server 留空。

从这里可以知道写成localhost php还是会自动连接套接字,如果写成127.0.0.1的话就用TCP/IP模式连接了

对于静态网页可以从以下几点进行优化:

1. 支持epoll

2. 非阻塞I/O

3. 异步I/O

4. 使用sendfile系统调用

5. 单进程

6. 使用高速磁盘

7. 使用RAID分区

8. 购买足够的带宽

 

MySQL一些小记:

innodb_flush_log_at_trx_commit:

0: Innodb 中的Log Thread 每隔1 秒钟会将log buffer中的数据写入到文件,同时还会通知文件系统进行文件同步的flush 操作,保证数据确实已经写入到磁盘上面的物理文件。但是,每次事务的结束(commit 或者是rollback)并不会触发Log Thread 将log buffer 中的数据写入文件。所以,当设置为0 的时候,当MySQL Crash 和OS Crash 或者主机断电之后,最极端的情况是丢失1 秒时间的数据变更。事务提交后不立即将事务写入磁盘,而是每隔一秒写入磁盘一次,并刷新到磁盘,同时更新数据和索引。mysql崩溃内存中的事务日志缓冲区最近一秒的数据将会丢失,无法恢复。

1: 这也是Innodb 的默认设置。我们每次事务的结束都会触发Log Thread 将log buffer 中的数据写入文件并通知文件系统同步文件。这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash 或者是主机断电都不会丢失任何已经提交的数据。

2: 事务提交后立即将事务日志写入磁盘,但是不刷新磁盘,而是每隔一秒刷新到磁盘一次,同时更新数据和索引,这种情况下mysql crash后数据是可以恢复的,但是系统挂了就恢复不了最后一秒的数据。

写入磁盘:表示写入物理内存中的内核缓冲区。

刷新磁盘:表示将内核缓冲区的数据真正写入磁盘。

增加mysql线程数量:my.cnf--->thread_cache_size=100 增加到100个线程



TAG:   高性能 website

    评论
    • 提交

    分类

    标签

    归档

    最新评论

    Abyss在00:04:28评论了
    Linux中ramdisk,tmpfs,ramfs的介绍与性能测试
    shallwe99在10:21:17评论了
    【原创】如何在微信小程序开发中正确的使用vant ui组件
    默一在09:04:53评论了
    Berkeley DB 由浅入深【转自架构师杨建】
    Memory在14:09:22评论了
    【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)
    leo在17:57:04评论了
    shell中使用while循环ssh的注意事项

    我看过的书

    链接

    其他

    访问本站种子 本站平均热度:8823 c° 本站链接数:1 个 本站标签数:464 个 本站被评论次数:94 次