1. Javascript文件直接写在了网页当中
2. 网页没有开启gzip
3. Javascript没有做任何处理
4. 图片文件过大
1. 首页处理得比较到位,虽然javascript也没有压缩,但总大小只有108k
2. 文件请求数较少,这个和开心网本身有关,开心网本来就不是一个网页结构复杂的网站,所以文件数自然会比较少了
3. 静态文件和网页分开部署
4. Javascript注释比较好,但不应该发到客户端
重要建议:
1. 开启gzip压缩
2. 压缩javascript及css,并将这些文件缓存起来
阅读全文
2. 网页没有开启gzip
3. Javascript没有做任何处理
4. 图片文件过大
1. 首页处理得比较到位,虽然javascript也没有压缩,但总大小只有108k
2. 文件请求数较少,这个和开心网本身有关,开心网本来就不是一个网页结构复杂的网站,所以文件数自然会比较少了
3. 静态文件和网页分开部署
4. Javascript注释比较好,但不应该发到客户端
重要建议:
1. 开启gzip压缩
2. 压缩javascript及css,并将这些文件缓存起来
阅读全文
使用append()添加文本常用方法:
直接添加另一个完整的字符串:
如str1.append(str2);
添加另一个字符串的某一段子串:
如str1.append(str2, 11, 7);
添加几个相同的字符:
如str1.append(5, '.');
注意,个数在前字符在后.上面的代码意思为在str1后面添加5个".".
//========================================
//========================================
运行结果为
I like C++,I like the world.
Hello World.
Hi.....
直接添加另一个完整的字符串:
如str1.append(str2);
添加另一个字符串的某一段子串:
如str1.append(str2, 11, 7);
添加几个相同的字符:
如str1.append(5, '.');
注意,个数在前字符在后.上面的代码意思为在str1后面添加5个".".
//========================================
#include<iostream>
using namespace std;
//========================================
int main()
{
string str1="I like C++";
string str2=",I like the world.";
string str3="Hello";
string str4("Hi");
//====================================
str1.append(str2);
str3.append(str2, 11, 7);
str4.append(5, '.');
//====================================
cout<<str1<<endl;
cout<<str3<<endl;
cout<<str4<<endl;
system("pause");
return 0;
}
using namespace std;
//========================================
int main()
{
string str1="I like C++";
string str2=",I like the world.";
string str3="Hello";
string str4("Hi");
//====================================
str1.append(str2);
str3.append(str2, 11, 7);
str4.append(5, '.');
//====================================
cout<<str1<<endl;
cout<<str3<<endl;
cout<<str4<<endl;
system("pause");
return 0;
}
//========================================
运行结果为
I like C++,I like the world.
Hello World.
Hi.....
1.供电电路有转换效率的问题,如果转换效率不是很高,那么相数较多的设计其实际供电能力未必会好过相数较少的设计;
2.供电元件如果太多,例如在CPU附近的周围有一大堆电容,则会阻碍空气流通,影响CPU散热,而且还可能会使一些太靠近CPU的普通电容受热鼓包、爆浆,造成系统崩溃;
3.相数较多的设计使布线复杂化,这就使本来频率就很高的数据总线部分很容易受到干扰,影响主板在极端情况下的稳定性;
4.供电元件都有一个可靠性,电容又是寿命最短的元件,而系统总体可靠性则是所有元件可靠性的乘积,元件越多则可靠性越低;
5.对于那些搭配低功耗处理器的主板,相数、元件太多只会白白浪费其供电能力,增加平台成本。
2.供电元件如果太多,例如在CPU附近的周围有一大堆电容,则会阻碍空气流通,影响CPU散热,而且还可能会使一些太靠近CPU的普通电容受热鼓包、爆浆,造成系统崩溃;
3.相数较多的设计使布线复杂化,这就使本来频率就很高的数据总线部分很容易受到干扰,影响主板在极端情况下的稳定性;
4.供电元件都有一个可靠性,电容又是寿命最短的元件,而系统总体可靠性则是所有元件可靠性的乘积,元件越多则可靠性越低;
5.对于那些搭配低功耗处理器的主板,相数、元件太多只会白白浪费其供电能力,增加平台成本。
(一)
从互联网开始,软件分为了两种:一种是功能软件,一种是社交软件。
功能软件,比如说word、杀毒软件,下载软件,博客,google和百度等都是。
社交软件是电子邮件、bbs、QQ或msn之类的即时通讯软件,最近的就是微博客。
功能软件致力于完成某些具体的任务,如搜索引擎致力于通过机器算法发现信息。
而社交软件致力于人和人的连接。在社交软件里面,人可以做任何事情。
博客很容易被误认为是社交软件,其实,它不是。它只是个免费的出版系统。
而微博客(简称:围脖),也很容易被认为只是博客的缩写版。其实,它不是。
围脖的价值在于:转发。
信息在网络上流动,要依靠两个部分:【1】发现;【2】分享。
发现可以通过人肉,也可以通过机器搜索。这个部分,搜索引擎是强项。
而分享则有所不同:
分享的速度上,取决于两个主要的摩擦力:【1】信息是否私密;【2】是否自动传播。
电邮、QQ/msn都可以是一对一的,也可以是一对多的。但大多信息是私密的。在群体之间,信息一般是不共享的。
因为有太多的判断和附加动作,信息的转发,是需要更多的延迟的。
bbs上的信息是相对公开的,但是其分享的速度也还是有限。
而围脖使信息进入了无摩擦力传播的时代。
围脖有这样的特点:
【1】它短小,非常适合大脑进行扫描式阅读;
【2】信息是公开的,任何人都可以围观;
【3】转发的摩擦更小:一键转发,不用复制、粘帖;
【4】关注的路径一旦设定,信息一来,在路径上的所有人,都可以自动收到。
因此,搜索引擎解决了发现的问题,而围脖解决了如何快速分享的难题。
围脖的经典操作也最简单:一是转发,二是刷屏。
阅读全文
从互联网开始,软件分为了两种:一种是功能软件,一种是社交软件。
功能软件,比如说word、杀毒软件,下载软件,博客,google和百度等都是。
社交软件是电子邮件、bbs、QQ或msn之类的即时通讯软件,最近的就是微博客。
功能软件致力于完成某些具体的任务,如搜索引擎致力于通过机器算法发现信息。
而社交软件致力于人和人的连接。在社交软件里面,人可以做任何事情。
博客很容易被误认为是社交软件,其实,它不是。它只是个免费的出版系统。
而微博客(简称:围脖),也很容易被认为只是博客的缩写版。其实,它不是。
围脖的价值在于:转发。
信息在网络上流动,要依靠两个部分:【1】发现;【2】分享。
发现可以通过人肉,也可以通过机器搜索。这个部分,搜索引擎是强项。
而分享则有所不同:
分享的速度上,取决于两个主要的摩擦力:【1】信息是否私密;【2】是否自动传播。
电邮、QQ/msn都可以是一对一的,也可以是一对多的。但大多信息是私密的。在群体之间,信息一般是不共享的。
因为有太多的判断和附加动作,信息的转发,是需要更多的延迟的。
bbs上的信息是相对公开的,但是其分享的速度也还是有限。
而围脖使信息进入了无摩擦力传播的时代。
围脖有这样的特点:
【1】它短小,非常适合大脑进行扫描式阅读;
【2】信息是公开的,任何人都可以围观;
【3】转发的摩擦更小:一键转发,不用复制、粘帖;
【4】关注的路径一旦设定,信息一来,在路径上的所有人,都可以自动收到。
因此,搜索引擎解决了发现的问题,而围脖解决了如何快速分享的难题。
围脖的经典操作也最简单:一是转发,二是刷屏。
阅读全文
最近发现几个监控用的脚本在连接监控数据库的时候偶尔会连不上,报错:
Couldn't connect to host:3306/tcp: IO::Socket::INET: connect: Cannot assign requested address
查看了一下发现系统中存在大量处于TIME_WAIT状态的tcp端口
由于要监控的主机太多,监控的agent可能在短时间内创建大量连接到监控数据库(MySQL)并释放造成的。在网上查阅了一些tcp参数的相关资料,最后通过修改了几个系统内核的tcp参数缓解了该问题:
其中:
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
修改完成并生效后,系统中处于TIME_WAIT状态的tcp端口数量迅速下降到100左右:
简单记录于此,备忘。
本文网址:http://www.ningoo.net/html/2010/linux_tcp_time_wait_issue.html
Couldn't connect to host:3306/tcp: IO::Socket::INET: connect: Cannot assign requested address
查看了一下发现系统中存在大量处于TIME_WAIT状态的tcp端口
$netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 50013
ESTABLISHED 27
SYN_RECV 1
ESTABLISHED 27
SYN_RECV 1
由于要监控的主机太多,监控的agent可能在短时间内创建大量连接到监控数据库(MySQL)并释放造成的。在网上查阅了一些tcp参数的相关资料,最后通过修改了几个系统内核的tcp参数缓解了该问题:
#vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
#sysctl -p
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
#sysctl -p
其中:
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
修改完成并生效后,系统中处于TIME_WAIT状态的tcp端口数量迅速下降到100左右:
$netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 82
ESTABLISHED 36
TIME_WAIT 82
ESTABLISHED 36
简单记录于此,备忘。
本文网址:http://www.ningoo.net/html/2010/linux_tcp_time_wait_issue.html
1. 如何配置Key Cache的大小
#配置文件my.cnf
key_buffer_size=50*1024*1024
另外,Key Cache的大小可以动态的改变
2. 给数据表划分单独的Key Cache
例如:划分一块128K的Key buffer空间,指定数据表t1的Key cache放在里面。最后演示了如何删除这个特定的Key buffer空间。
SET GLOBAL hot_cache.key_buffer_size=128*1024;
CACHE INDEX t1 IN hot_cache;
SET GLOBAL hot_cache.key_buffer_size=0;
3. 预先载入某些数据表的索引
LOAD INDEX INTO CACHE t1, t2
4. 关于Key Cache的使用情况观察 Flush现象
mysql> show status like "key%";
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| Key_blocks_not_flushed | 14468 |
| Key_blocks_unused | 0 |
| Key_blocks_used | 14497 |
| Key_read_requests | 30586575 |
| Key_reads | 157 |
| Key_write_requests | 7100408 |
| Key_writes | 1199800 |
+------------------------+----------+
mysql> flush tables; (注意,请不要在业务高峰期执行)
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| Key_blocks_not_flushed | 0 | #所有修改的block都已经被flush了
| Key_blocks_unused | 0 |
| Key_blocks_used | 14497 |
| Key_read_requests | 38333936 |
| Key_reads | 207 |
| Key_write_requests | 8819898 |
| Key_writes | 1255245 |
+------------------------+----------+
5. 需要注意的事项
内存中缓存的索引块(Key Cache),有时候并不会及时刷新到磁盘上,所以对于正在运行的数据表的索引文件(MYI)一般都是不完整的。如果此时拷贝或者移动这些索引文件。多半会出现索引文件损坏的情况。
可以通过Flush table命令来将Key Cache中的block都flush到磁盘上。所以,一般要动态移动MyISAM表需要执行以下步骤:
首先,刷新数据表,并锁住数据表:(注意,请不要在业务高峰期执行)
FLUSH TABLES WITH READ LOCK;
可以通过下面的命令来查看没有被Flush的索引块数量
mysql> show status like "Key_blocks_not_flushed";
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| Key_blocks_not_flushed | 0 |
+------------------------+----------+
最后,移动对应的文件(MYI MYD FRM)。
让我突然想起:张宴 Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)[原创] 第6版本
http://blog.s135.com/nginx_php_v6/
创建my.cnf配置文件:
vi /data0/mysql/3306/my.cnf
里面就有:
256M就是用来配置缓存的,呵呵,果然。
#配置文件my.cnf
key_buffer_size=50*1024*1024
另外,Key Cache的大小可以动态的改变
2. 给数据表划分单独的Key Cache
例如:划分一块128K的Key buffer空间,指定数据表t1的Key cache放在里面。最后演示了如何删除这个特定的Key buffer空间。
SET GLOBAL hot_cache.key_buffer_size=128*1024;
CACHE INDEX t1 IN hot_cache;
SET GLOBAL hot_cache.key_buffer_size=0;
3. 预先载入某些数据表的索引
LOAD INDEX INTO CACHE t1, t2
4. 关于Key Cache的使用情况观察 Flush现象
mysql> show status like "key%";
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| Key_blocks_not_flushed | 14468 |
| Key_blocks_unused | 0 |
| Key_blocks_used | 14497 |
| Key_read_requests | 30586575 |
| Key_reads | 157 |
| Key_write_requests | 7100408 |
| Key_writes | 1199800 |
+------------------------+----------+
mysql> flush tables; (注意,请不要在业务高峰期执行)
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| Key_blocks_not_flushed | 0 | #所有修改的block都已经被flush了
| Key_blocks_unused | 0 |
| Key_blocks_used | 14497 |
| Key_read_requests | 38333936 |
| Key_reads | 207 |
| Key_write_requests | 8819898 |
| Key_writes | 1255245 |
+------------------------+----------+
5. 需要注意的事项
内存中缓存的索引块(Key Cache),有时候并不会及时刷新到磁盘上,所以对于正在运行的数据表的索引文件(MYI)一般都是不完整的。如果此时拷贝或者移动这些索引文件。多半会出现索引文件损坏的情况。
可以通过Flush table命令来将Key Cache中的block都flush到磁盘上。所以,一般要动态移动MyISAM表需要执行以下步骤:
首先,刷新数据表,并锁住数据表:(注意,请不要在业务高峰期执行)
FLUSH TABLES WITH READ LOCK;
可以通过下面的命令来查看没有被Flush的索引块数量
mysql> show status like "Key_blocks_not_flushed";
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| Key_blocks_not_flushed | 0 |
+------------------------+----------+
最后,移动对应的文件(MYI MYD FRM)。
让我突然想起:张宴 Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)[原创] 第6版本
http://blog.s135.com/nginx_php_v6/
创建my.cnf配置文件:
vi /data0/mysql/3306/my.cnf
里面就有:
relay-log-index = /data0/mysql/3306/relaylog/relaylog
relay-log-info-file = /data0/mysql/3306/relaylog/relaylog
relay-log = /data0/mysql/3306/relaylog/relaylog
expire_logs_days = 30
key_buffer_size = 256M
relay-log-info-file = /data0/mysql/3306/relaylog/relaylog
relay-log = /data0/mysql/3306/relaylog/relaylog
expire_logs_days = 30
key_buffer_size = 256M
256M就是用来配置缓存的,呵呵,果然。
如果开启了cpu的分页功能,则程序里引用到的地址都是虚拟地址(Intel x86架构下也有称这个为线性地址的),这个和物理内存够不够用是没有关系的。
http://rdc.taobao.com/blog/dba/html/329_virtual_memory.html#more-329
http://rdc.taobao.com/blog/dba/html/329_virtual_memory.html#more-329
“And God said, Let there be network: and there was timeout”
在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?
那么这些Timeout之后,到底是代码问题,还是不为人知的匠心独具?
本期Out-man,讲述咱们MySQL DBA自己的Timeout。
先看一下比较常见的Timeout参数和相关解释:
从以上解释可以看出,connect_timeout在获取连接阶段(authenticate)起作用,interactive_timeout和wait_timeout在连接空闲阶段(sleep)起作用,而net_read_timeout和net_write_timeout则是在连接繁忙阶段(query)起作用。
获取MySQL连接是多次握手的结果,除了用户名和密码的匹配校验外,还有IP->HOST->DNS->IP验证,任何一步都可能因为网络问题导致线程阻塞。为了防止线程浪费在不必要的校验等待上,超过connect_timeout的连接请求将会被拒绝。
即使没有网络问题,也不能允许客户端一直占用连接。对于保持sleep状态超过了wait_timeout(或interactive_timeout,取决于CLIENT_INTERACTIVE标志)的客户端,MySQL会主动断开连接。
即使连接没有处于sleep状态,即客户端忙于计算或者存储数据,MySQL也选择了有条件的等待。在数据包的分发过程中,客户端可能来不及响应(发送、接收、或者处理数据包太慢)。为了保证连接不被浪费在无尽的等待中,MySQL也会选择有条件(net_read_timeout和net_write_timeout)地主动断开连接。
这么多Timeout足以证明MySQL是多么乐于断开连接。而乐于断开连接的背后,主要是为了防止服务端共享资源被某客户端(mysql、mysqldump、页面程序等)一直占用。
作者:陶方 | 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
地址:http://rdc.taobao.com/blog/dba/html/433_mysql_timeout_analyze.html
在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?
那么这些Timeout之后,到底是代码问题,还是不为人知的匠心独具?
本期Out-man,讲述咱们MySQL DBA自己的Timeout。
先看一下比较常见的Timeout参数和相关解释:
connect_timeout
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.
interactive_timeout
The number of seconds the server waits for activity on an interactive connection before closing it.
wait_timeout
The number of seconds the server waits for activity on a noninteractive connection before closing it.
net_read_timeout
The number of seconds to wait for more data from a connection before aborting the read.
net_write_timeout
The number of seconds to wait for a block to be written to a connection before aborting the write.
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.
interactive_timeout
The number of seconds the server waits for activity on an interactive connection before closing it.
wait_timeout
The number of seconds the server waits for activity on a noninteractive connection before closing it.
net_read_timeout
The number of seconds to wait for more data from a connection before aborting the read.
net_write_timeout
The number of seconds to wait for a block to be written to a connection before aborting the write.
从以上解释可以看出,connect_timeout在获取连接阶段(authenticate)起作用,interactive_timeout和wait_timeout在连接空闲阶段(sleep)起作用,而net_read_timeout和net_write_timeout则是在连接繁忙阶段(query)起作用。
获取MySQL连接是多次握手的结果,除了用户名和密码的匹配校验外,还有IP->HOST->DNS->IP验证,任何一步都可能因为网络问题导致线程阻塞。为了防止线程浪费在不必要的校验等待上,超过connect_timeout的连接请求将会被拒绝。
即使没有网络问题,也不能允许客户端一直占用连接。对于保持sleep状态超过了wait_timeout(或interactive_timeout,取决于CLIENT_INTERACTIVE标志)的客户端,MySQL会主动断开连接。
即使连接没有处于sleep状态,即客户端忙于计算或者存储数据,MySQL也选择了有条件的等待。在数据包的分发过程中,客户端可能来不及响应(发送、接收、或者处理数据包太慢)。为了保证连接不被浪费在无尽的等待中,MySQL也会选择有条件(net_read_timeout和net_write_timeout)地主动断开连接。
这么多Timeout足以证明MySQL是多么乐于断开连接。而乐于断开连接的背后,主要是为了防止服务端共享资源被某客户端(mysql、mysqldump、页面程序等)一直占用。
作者:陶方 | 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
地址:http://rdc.taobao.com/blog/dba/html/433_mysql_timeout_analyze.html
mysqldump是非常重要的MySQL备份工具。然而在长年累月的使用过程中,TAOBAO多次出现了因mysqldump意外终止而导致备份失败的情况。
以下是我们经常遇到的问题:
1、Lost connection to MySQL server at ‘reading initial communication packet’:
这个主要是因为DNS不稳定导致的。如果做了网络隔离,MySQL处于一个相对安全的网络环境,那么开启skip-name-resolve选项将会最大程度避免这个问题。
2、Lost connection to MySQL server at ‘reading authorization packet’:
从MySQL获取一个可用的连接是多次握手的结果。在多次握手的过程中,网络波动会导致握手失败。增加connect_timeout可以解决这个问题;然而增加connect_timeout并不能防止网络故障的发生,反而会引起MySQL线程占用。最好的解决办法是让mysqldump重新发起连接请求。
3、Lost connection to MySQL server during query:
这个问题具备随机性,而淘宝MySQL的应用场景决定了我们无法多次备份数据以便重现问题。
然而我们注意到这个问题一般会在两种情况下会发生。一种是mysqldump **** | gzip ****;另外一种是mysqldump **** > /nfs-file
注意,不管是gzip还是nfs都有一种特点,那就是它们影响了mysqldump的速度。从这个角度思考,是不是mysqldump从MySQL接受数据包的速度不够快导致Lost connection to MySQL server during query错误呢?
为了定位到问题,我搭建了一个测试环境:
test@192.168.0.1:3306
CREATE TABLE `test` (
`id` bigint(20) NOT NULL auto_increment,
`b` varchar(2000) default NULL,
`c` varchar(2000) default NULL,
`d` varchar(2000) default NULL,
`e` varchar(2000) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
insert into test(b,c,d,e) values (lpad(’a',1900,’b'), lpad(’a',1900,’b'), lpad(’a',1900,’b'), lpad(’a',1900,’b'));
多次复制数据使测试环境达到一定数据量。
192.168.0.2:
编写一个c++程序
#include <stdio.h>
#include <mysql.h>
using namespace std;
int main()
{
MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row;
my_bool reconnect = 0;
mysql_init(&conn);
mysql_options(&conn, MYSQL_OPT_RECONNECT, &reconnect);
if(!mysql_real_connect(&conn, “192.168.0.1″, “test”, “test”, “test”, 3306, NULL, 0))
{
fprintf(stderr, “Failed to connect to database: %s\n”, mysql_error(&conn));
exit(0);
}
else
{
fprintf(stdout, “Success to connect\n”);
}
mysql_query(&conn, “show variables like ‘%timeout%’”);
result = mysql_use_result(&conn);
while(row=mysql_fetch_row(result))
{
fprintf(stdout, “%-10s: %s\n”, row[0], row[1]);
}
mysql_free_result(result);
fprintf(stderr, “\n”);
mysql_query(&conn, “select SQL_NO_CACHE * from test.test”);
result = mysql_use_result(&conn);
while((row=mysql_fetch_row(result))!=NULL)
{
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
fprintf(stdout, “%s\n”, row[0]);
sleep(100);
}
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
mysql_free_result(result);
mysql_close(&conn);
return 1;
}
#include <mysql.h>
using namespace std;
int main()
{
MYSQL conn;
MYSQL_RES *result;
MYSQL_ROW row;
my_bool reconnect = 0;
mysql_init(&conn);
mysql_options(&conn, MYSQL_OPT_RECONNECT, &reconnect);
if(!mysql_real_connect(&conn, “192.168.0.1″, “test”, “test”, “test”, 3306, NULL, 0))
{
fprintf(stderr, “Failed to connect to database: %s\n”, mysql_error(&conn));
exit(0);
}
else
{
fprintf(stdout, “Success to connect\n”);
}
mysql_query(&conn, “show variables like ‘%timeout%’”);
result = mysql_use_result(&conn);
while(row=mysql_fetch_row(result))
{
fprintf(stdout, “%-10s: %s\n”, row[0], row[1]);
}
mysql_free_result(result);
fprintf(stderr, “\n”);
mysql_query(&conn, “select SQL_NO_CACHE * from test.test”);
result = mysql_use_result(&conn);
while((row=mysql_fetch_row(result))!=NULL)
{
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
fprintf(stdout, “%s\n”, row[0]);
sleep(100);
}
fprintf(stderr, “Error %d: %s\n”, mysql_errno(&conn), mysql_error(&conn));
mysql_free_result(result);
mysql_close(&conn);
return 1;
}
在这段代码里,sleep函数用来模拟NFS的网络延迟和gzip的运算时间。执行一段时间之后,Lost connection to MySQL server during query出现了,程序意外终止。在数据处理足够快的情况下,又会是怎样的结果?
将sleep的时间改为1,重新编译后发现程序能够完整跑完。根据《MySQL Timeout解析》上对net_write_timeout的解释,我们可以发现,mysqldump处理数据过慢(NFS、gzip引起)会导致MySQL主动断开连接,此时mysqldump就会报Lost connection to MySQL server during query错误。经过多次测试,确定这个错误是由于net_write_timeout设置过短引起。
作者:陶方 | 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
地址:http://rdc.taobao.com/blog/dba/html/435_mysqldump_error.html
构思是include两个php程序,一个renderheader.php,一个renderfooter.php.分别在页面的开头和结尾include这两个文件,就可以无缝的整合profiling到现有的程序当中。
renderheader.php
renderfooter.php
renderbody.php
本系列的文章暂时告一段落,希望对爱好php的朋友有所帮助。阅读全文
renderheader.php
<?php
$time_start = getmicrotime();
$filename="logs3/".date("Y-m-d",mktime()).".log";
$scriptName=$_SERVER["SCRIPT_NAME"];
echo $scriptName;
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function logToFile($filename, $msg,$scriptName)
{
$fd = fopen($filename, "a") or die ("Can't open file ".$filename);
// append date/time to message
$str = "[" . date("Y/m/d h:i:s", mktime()) . "] " ." ".$scriptName." ".$msg;
// write string
fwrite($fd, $str . "\n");
// close file
fclose($fd);
}
?>
$time_start = getmicrotime();
$filename="logs3/".date("Y-m-d",mktime()).".log";
$scriptName=$_SERVER["SCRIPT_NAME"];
echo $scriptName;
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function logToFile($filename, $msg,$scriptName)
{
$fd = fopen($filename, "a") or die ("Can't open file ".$filename);
// append date/time to message
$str = "[" . date("Y/m/d h:i:s", mktime()) . "] " ." ".$scriptName." ".$msg;
// write string
fwrite($fd, $str . "\n");
// close file
fclose($fd);
}
?>
renderfooter.php
<?php
$time_end = getmicrotime();
$msg=($time_end - $time_start)*1000;
logToFile($filename,$msg,$scriptName);
printf ("page render time: %.2fms\n\n",($time_end - $time_start)*1000);
?>
$time_end = getmicrotime();
$msg=($time_end - $time_start)*1000;
logToFile($filename,$msg,$scriptName);
printf ("page render time: %.2fms\n\n",($time_end - $time_start)*1000);
?>
renderbody.php
<?php
include("renderheader.php");
for ($i=1;$i<=10000;$i++)
{
echo "hello wade"."</br>";
}
include("renderfooter.php");
?>
include("renderheader.php");
for ($i=1;$i<=10000;$i++)
{
echo "hello wade"."</br>";
}
include("renderfooter.php");
?>
本系列的文章暂时告一段落,希望对爱好php的朋友有所帮助。阅读全文
今天在研究ob_start()的时候发现它的参数中有个callback,也就是回调函数。已前没有接触过,立即google。发现有好多文章介绍此函数的,但是大多数都介绍的很不清楚(也许本人水平太低,看不懂),最后貌似理解了。下边就我的理解介绍一下什么是callback function.
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。也就是可以讲回调函数作为另外一个函数的参数,然后利用回调函数完成一些操做。
下边就拿ob_start()来做一个例子,开始贴代码
ob_start() 会回调callback这个方法,对buffer中的内容进行修改。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100ewb3.html
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。也就是可以讲回调函数作为另外一个函数的参数,然后利用回调函数完成一些操做。
下边就拿ob_start()来做一个例子,开始贴代码
<?php
function callback($buffer)
{
// replace all the apples with oranges
return (str_replace("apples", "oranges", $buffer));
}
//ob_start will out put content to a internal buffer
ob_start("callback");
?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php
//will clean internal buffer
//ob_end_clean();
//will out the internal buffer's content.
ob_end_flush();
?>
function callback($buffer)
{
// replace all the apples with oranges
return (str_replace("apples", "oranges", $buffer));
}
//ob_start will out put content to a internal buffer
ob_start("callback");
?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php
//will clean internal buffer
//ob_end_clean();
//will out the internal buffer's content.
ob_end_flush();
?>
ob_start() 会回调callback这个方法,对buffer中的内容进行修改。
来源:http://blog.sina.com.cn/s/blog_4d8a2c970100ewb3.html
我生产环境下的两台Nginx + PHP5(FastCGI)服务器,跑多个一般复杂的纯PHP动态程序,从Nginx的日志可以统计出,单台Nginx + PHP5(FastCGI)服务器跑PHP动态程序的处理能力已经超过“700次请求/秒”,相当于每天可以承受6000万(700*60*60*24=60480000)的访问量:
服务器①:DELL PowerEdge 1950(两颗 Intel(R) Xeon(R) 双核CPU 5120 @ 1.86GHz,4GB内存)
服务器②:DELL PowerEdge 1950(一颗 Intel(R) Xeon(R) 双核CPU 5140 @ 2.33GHz,4GB内存)
Web服务器:CentOS Linux 4.4 + Nginx 0.5.35 + PHP 5.2.6RC2(300 FastCGI Procees, unix-domain socket, with XCache)
PHP程序内容:大量Memcached读写、少量MySQL读操作、大量文件队列写操作,然后计算,生成供<script type="text/javascript" src="http://www.domain.com/abc.php?u=1"></script>方式调用的JS代码或XML数据。
网卡流量:1.5M~3M/秒
请求数统计方式:从Nginx访问日志中,统计每分钟的第15秒共有多少条日志记录。
引用
grep "25/Mar/2008:15:01:15" /data1/logs/nginx.log | wc -l
服务器的系统负载也不算高:
总结:
1、Nginx的处理能力超强,这块不是瓶颈。影响动态程序处理能力的因素主要在于PHP(FastCGI)。PHP(FastCGI)模式适用于执行时间较短的PHP程序,一般复杂的PHP程序执行时间应该在100ms以内,例如我的博客首页执行时间为38ms左右。假设一个PHP程序的执行时间为 100ms,那么一个PHP(FastCGI)进程每秒可以处理完毕10个请求,300个FastCGI进程理论上每秒可以处理3000个请求。但是,在生产环境下,还将受到内存、系统负载等多方面的影响,例如300个PHP(FastCGI)进程需要占用2.4GB左右的内存,每秒处理超过1000个请求时,系统负载会飚升到100以上。因此,FastCGI的进程不是越多越好,而是够用就好。
2、使用PHP的XCache、APC等加速模块会提供速度10倍左右,降低系统负载50倍以上。
3、修改了spawn-fcgi,使它能够支持250个以上的FastCGI进程。
4、如果PHP直接对MySQL进行大量读写操作,速度是达不到“700 request/sec”的,PHP与MySQL之间需要一个中间层,这是关键的技术。
5、CPU的数量(多核算多个CPU,cat /proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。
6、使用PHP 5.2.6RC2,因为它修正了PHP 5.2.5的“zend_mm_heap corrupted”错误BUG。PHP 5.2.5(FastCGI)在高并发请求情况下,经常会出现该错误。
7、有空我将写一篇针对CentOS Linux环境Nginx + PHP5(FastCGI)安装、配置的最新博文。
来源:
http://blog.csdn.net/scun/archive/2008/03/27/2222233.aspx
服务器①:DELL PowerEdge 1950(两颗 Intel(R) Xeon(R) 双核CPU 5120 @ 1.86GHz,4GB内存)
服务器②:DELL PowerEdge 1950(一颗 Intel(R) Xeon(R) 双核CPU 5140 @ 2.33GHz,4GB内存)
Web服务器:CentOS Linux 4.4 + Nginx 0.5.35 + PHP 5.2.6RC2(300 FastCGI Procees, unix-domain socket, with XCache)
PHP程序内容:大量Memcached读写、少量MySQL读操作、大量文件队列写操作,然后计算,生成供<script type="text/javascript" src="http://www.domain.com/abc.php?u=1"></script>方式调用的JS代码或XML数据。
网卡流量:1.5M~3M/秒
请求数统计方式:从Nginx访问日志中,统计每分钟的第15秒共有多少条日志记录。
引用
grep "25/Mar/2008:15:01:15" /data1/logs/nginx.log | wc -l
服务器的系统负载也不算高:
总结:
1、Nginx的处理能力超强,这块不是瓶颈。影响动态程序处理能力的因素主要在于PHP(FastCGI)。PHP(FastCGI)模式适用于执行时间较短的PHP程序,一般复杂的PHP程序执行时间应该在100ms以内,例如我的博客首页执行时间为38ms左右。假设一个PHP程序的执行时间为 100ms,那么一个PHP(FastCGI)进程每秒可以处理完毕10个请求,300个FastCGI进程理论上每秒可以处理3000个请求。但是,在生产环境下,还将受到内存、系统负载等多方面的影响,例如300个PHP(FastCGI)进程需要占用2.4GB左右的内存,每秒处理超过1000个请求时,系统负载会飚升到100以上。因此,FastCGI的进程不是越多越好,而是够用就好。
2、使用PHP的XCache、APC等加速模块会提供速度10倍左右,降低系统负载50倍以上。
3、修改了spawn-fcgi,使它能够支持250个以上的FastCGI进程。
4、如果PHP直接对MySQL进行大量读写操作,速度是达不到“700 request/sec”的,PHP与MySQL之间需要一个中间层,这是关键的技术。
5、CPU的数量(多核算多个CPU,cat /proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。
6、使用PHP 5.2.6RC2,因为它修正了PHP 5.2.5的“zend_mm_heap corrupted”错误BUG。PHP 5.2.5(FastCGI)在高并发请求情况下,经常会出现该错误。
7、有空我将写一篇针对CentOS Linux环境Nginx + PHP5(FastCGI)安装、配置的最新博文。
来源:
http://blog.csdn.net/scun/archive/2008/03/27/2222233.aspx
不重视细节,如何谈得上成功!
1)程序员每天总结自己一天任务的完成情况
最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多
2)考虑自己明天应该做的主要工作
把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作
3)考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法
出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢
4)考虑自己一天工作完成的质量和效率能否还能提高
一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍
5)看一个有用的新闻网站或读一张有用的报纸,了解业界动态
闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示
6)记住一位同事的名字及其特点
你认识公司的所有同事吗?你了解他们吗?
7)清理自己的代码
今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?
8)清理自己的桌面
当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净
1)程序员每天总结自己一天任务的完成情况
最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多
2)考虑自己明天应该做的主要工作
把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作
3)考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法
出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢
4)考虑自己一天工作完成的质量和效率能否还能提高
一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍
5)看一个有用的新闻网站或读一张有用的报纸,了解业界动态
闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示
6)记住一位同事的名字及其特点
你认识公司的所有同事吗?你了解他们吗?
7)清理自己的代码
今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?
8)清理自己的桌面
当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净
4月21日全国哀悼日,将去除网站全站所有站点色彩(变灰),悼念遇难同胞,愿死者安息。
金山逍遥网旗下站点众多,虽然官网都有统一的页头、页尾,但是,还有一部分站点(例如用户中心、注册充值页面、游戏客户端内嵌网站、活动专题页等)页头、页尾不相同。但是,所有站点采用的都是Nginx服务器,95%以上的站点都经过Nginx负载均衡服务器,因此只需要在Nginx负载均衡服务器上,利用sub_filter指令在输出的HTML中增加一行:
就可以实现在IE及IE内核浏览器下,所有网站变灰色。步骤如下:
1、重新编译Nginx,增加http_sub_module模块:
2、在nginx.conf配置文件的http {...}大括号内增加以下两行:
保存后,重新加载配置文件:
3、如果某些带有Flash的页面仍显示彩色,或浏览器上下滚动条拖动时Flash FLV播放器变花(例如剑网3、剑侠世界官网分流页),将Flash改为JS输出(本例为SWFObject):
这样,整个页面,包括Flash播放器中的视频就都变灰色了。
来源于回忆未来的博客:http://blog.s135.com/post/441/#entrymore
金山逍遥网旗下站点众多,虽然官网都有统一的页头、页尾,但是,还有一部分站点(例如用户中心、注册充值页面、游戏客户端内嵌网站、活动专题页等)页头、页尾不相同。但是,所有站点采用的都是Nginx服务器,95%以上的站点都经过Nginx负载均衡服务器,因此只需要在Nginx负载均衡服务器上,利用sub_filter指令在输出的HTML中增加一行:
<style type="text/css">html {filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }</style>
就可以实现在IE及IE内核浏览器下,所有网站变灰色。步骤如下:
1、重新编译Nginx,增加http_sub_module模块:
wget http://nginx.org/download/nginx-0.8.35.tar.gz
tar zxvf nginx-0.8.35.tar.gz
cd nginx-0.8.35
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module
make && make install
pkill -9 nginx
/usr/local/webserver/nginx/sbin/nginx
tar zxvf nginx-0.8.35.tar.gz
cd nginx-0.8.35
./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module
make && make install
pkill -9 nginx
/usr/local/webserver/nginx/sbin/nginx
2、在nginx.conf配置文件的http {...}大括号内增加以下两行:
sub_filter '</head>' '<style type="text/css">html {filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); }</style></head>';
sub_filter_once on;
sub_filter_once on;
保存后,重新加载配置文件:
/usr/local/webserver/nginx/sbin/nginx -t
/usr/local/webserver/nginx/sbin/nginx -s reload
/usr/local/webserver/nginx/sbin/nginx -s reload
3、如果某些带有Flash的页面仍显示彩色,或浏览器上下滚动条拖动时Flash FLV播放器变花(例如剑网3、剑侠世界官网分流页),将Flash改为JS输出(本例为SWFObject):
<script type="text/javascript" src="http://v.xoyo.com/site/v.xoyo.com/web/js/swf.js"></script>
<div id="video_content"></div>
<script type="text/javascript">
<!--
var video_player_so = new SWFObject("http://api.v.xoyo.com/external/player.swf?autostart=true&config=http://api.v.xoyo.com/external/video-542.swf", "sotester", "439", "246", "7");
video_player_so.addParam("wmode", "opaque");
video_player_so.addParam("allowfullscreen","true");
video_player_so.addParam("allowscriptaccess","always");
video_player_so.write("video_content");
//-->
</script>
<div id="video_content"></div>
<script type="text/javascript">
<!--
var video_player_so = new SWFObject("http://api.v.xoyo.com/external/player.swf?autostart=true&config=http://api.v.xoyo.com/external/video-542.swf", "sotester", "439", "246", "7");
video_player_so.addParam("wmode", "opaque");
video_player_so.addParam("allowfullscreen","true");
video_player_so.addParam("allowscriptaccess","always");
video_player_so.write("video_content");
//-->
</script>
这样,整个页面,包括Flash播放器中的视频就都变灰色了。
来源于回忆未来的博客:http://blog.s135.com/post/441/#entrymore
SNS网站同学网今日对外宣布,正式任命颜莹为同学网CEO,原同学网CEO朱明华因个人原因离职。颜莹曾就职于Tano Capital中国基金,该基金也是同学网的投资方。
根据同学网的官方公告,同学网董事会认为颜莹有丰富的大型团队管理经验,不仅是互联网投资领域的专家,对移动社交网络等方面也有深入理解。公告表示,同学网原CEO朱华明因个人原因离职,寻求其他发展机会。
不过这一变动被业内人士解读为创业团队与投资方意见不合、创始人被迫离职的又一案例。同学网并未对此做出回应,朱华明在与新浪科技连线中确认离职,但不方面对此事做出评论,而未来计划暂不方便透露,而是将先休息一段事件。
同学网(Tongxue.com)的前身是花名册(FaceRen.com),2007年3月由在美留学的郭磊与朱华明将其带入中国市场,希望建立一个在同学关系基础上的国际化互动社区。今年2月同学网宣布获得来自Tano China Private Equity Fund I(TCPEFI)等多家风险投资商600万美元的投资。
新任CEO颜莹接受新浪连线时认为,同学网已经成长为业内不可忽视的力量,"我已经做好准备,并且深信我有能力将同学网带入一个新的发展阶段。"
同学网官方资料显示,颜莹拥有美国加州大学伯克利分校公共政策硕士(MPP)、美国杜克大学工商管理硕士(MBA)。曾任职于中国人民共和国外交部,IDG创业投资基金,Tano Capital中国基金。
根据同学网的官方公告,同学网董事会认为颜莹有丰富的大型团队管理经验,不仅是互联网投资领域的专家,对移动社交网络等方面也有深入理解。公告表示,同学网原CEO朱华明因个人原因离职,寻求其他发展机会。
不过这一变动被业内人士解读为创业团队与投资方意见不合、创始人被迫离职的又一案例。同学网并未对此做出回应,朱华明在与新浪科技连线中确认离职,但不方面对此事做出评论,而未来计划暂不方便透露,而是将先休息一段事件。
同学网(Tongxue.com)的前身是花名册(FaceRen.com),2007年3月由在美留学的郭磊与朱华明将其带入中国市场,希望建立一个在同学关系基础上的国际化互动社区。今年2月同学网宣布获得来自Tano China Private Equity Fund I(TCPEFI)等多家风险投资商600万美元的投资。
新任CEO颜莹接受新浪连线时认为,同学网已经成长为业内不可忽视的力量,"我已经做好准备,并且深信我有能力将同学网带入一个新的发展阶段。"
同学网官方资料显示,颜莹拥有美国加州大学伯克利分校公共政策硕士(MPP)、美国杜克大学工商管理硕士(MBA)。曾任职于中国人民共和国外交部,IDG创业投资基金,Tano Capital中国基金。
让我来告诉你,目前最好的SNS程序是Dolphin Smart Community Builder,这个程序由BoonEx开发,BoonEx拥有9年的社区程序开发经验,是SNS程序的鼻祖。
自Dolphin 7开发以来,致力于移动社区的研发,现已经开发出适应于苹果手机的应用软件。未来将支持Google Android操作系统、symbian操作系统、以及Winodws Phone操作系统。BoonEx的社区程序搭建的网站无疑是设计最全面、功能最强大的社区。
我们来详细介绍Dolphind的几大功能:
Dolphin 7已经为我们开发了35个模块,准确的说34个对您有用,Facebook connect是连接FaceBook API的登录方式,用户可以通过在FaceBook注册的帐户直接登录您的社区。遗憾的是这个网站已经不能在中国大陆访问。
小编近日测试了还在翻译中的Dolphin 7中文版,通过访问演示站点,让我眼前一亮的UI程序界面,无疑超过了目前所有的中国产品,让我们不禁感叹BoonEx有深厚美工功底。程序安装非常顺利,我在这就不详细介绍如何安装的问题了。在我们删除了install安装文件后,即刻进入了程序前台。在Dolphin 7里我们看到了一个重大的不同,在程序最底端出现了一个类似Windows任务栏的东西,这是非常人性化的设计,可以迅速进入自己的信箱收发站内邮件,浏览购物车内为付款的商品,查看最近浏览你页面的会员,查看在线的好友,切换默认语系,已经进入功能的快捷方式。Dolphin 7可以在线录制您的视频与好友分享,或者上传电脑里的视频文件,通过分享一键与站外好友通过Email分享。Dolphin 7的功能非常全面,为我们提供诸多应用。阅读全文
自Dolphin 7开发以来,致力于移动社区的研发,现已经开发出适应于苹果手机的应用软件。未来将支持Google Android操作系统、symbian操作系统、以及Winodws Phone操作系统。BoonEx的社区程序搭建的网站无疑是设计最全面、功能最强大的社区。
我们来详细介绍Dolphind的几大功能:
Dolphin 7已经为我们开发了35个模块,准确的说34个对您有用,Facebook connect是连接FaceBook API的登录方式,用户可以通过在FaceBook注册的帐户直接登录您的社区。遗憾的是这个网站已经不能在中国大陆访问。
小编近日测试了还在翻译中的Dolphin 7中文版,通过访问演示站点,让我眼前一亮的UI程序界面,无疑超过了目前所有的中国产品,让我们不禁感叹BoonEx有深厚美工功底。程序安装非常顺利,我在这就不详细介绍如何安装的问题了。在我们删除了install安装文件后,即刻进入了程序前台。在Dolphin 7里我们看到了一个重大的不同,在程序最底端出现了一个类似Windows任务栏的东西,这是非常人性化的设计,可以迅速进入自己的信箱收发站内邮件,浏览购物车内为付款的商品,查看最近浏览你页面的会员,查看在线的好友,切换默认语系,已经进入功能的快捷方式。Dolphin 7可以在线录制您的视频与好友分享,或者上传电脑里的视频文件,通过分享一键与站外好友通过Email分享。Dolphin 7的功能非常全面,为我们提供诸多应用。阅读全文
每台计算机都有一个字长,指明整数与指针的标称大小,因为虚拟地址是以这样的字来编码的,所以字长决定了最重要的系统参数就是虚拟地址空间的最大大小。也就是说最大值为2的32次方-1,即为4G!
使32位Linux支持4G以上内存的设置,主要需要2个方面设置
1.bios:在bios里开启对大内存的设置
2.安装支持大内存的kernel
Centos5上安装方法
centos 5.0 默认安装 for i386的内核不支持 4g+的内存
需要安装上kernel-hugemem
yum install kernel-hugemem
结果发现 centos 下面 没有 kernel-hugemem这个rpm包了
已经改名为kernel-PAE
尝试用yum安装
yum install kernel-PAE
安装好后 还需要手工修改 引导
vi /boot/grub/grub.conf
如果看到如下代码 代表PAE内核已经安装好了
title CentOS (2.6.18-8.1.4.el5PAE)
root (hd0,0)
kernel /vmlinuz-2.6.18-8.1.4.el5PAE ro root=LABEL=/
initrd /initrd-2.6.18-8.1.4.el5PAE.img
修改设置为默认启动
default=0
RHEL5安装方法
如果是RHEL5的系统就可从安装过Kernel-PAE的Centos上复制过来路径如下/var/cache/yum/update/packages/kernel-PAE-2.6.18-53.1.21.el5.i686.rpm
使用scp kernel-PAE-2.6.18-53.1.21.el5.i686.rpm root@192.168.168.164:/opt
这样将该文件复制到RHEL5上,然后rpm –Uvh kernel-PAE-2.6.18-53.1.21.el5.i686.rpm
就可以安装好该包,然后修改下/etc/grub.conf将Default改成0就可以了
PAE 的一些说明
http://zh.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80%E6%89%A9%E5%B1%95
使32位Linux支持4G以上内存的设置,主要需要2个方面设置
1.bios:在bios里开启对大内存的设置
2.安装支持大内存的kernel
Centos5上安装方法
centos 5.0 默认安装 for i386的内核不支持 4g+的内存
需要安装上kernel-hugemem
yum install kernel-hugemem
结果发现 centos 下面 没有 kernel-hugemem这个rpm包了
已经改名为kernel-PAE
尝试用yum安装
yum install kernel-PAE
安装好后 还需要手工修改 引导
vi /boot/grub/grub.conf
如果看到如下代码 代表PAE内核已经安装好了
title CentOS (2.6.18-8.1.4.el5PAE)
root (hd0,0)
kernel /vmlinuz-2.6.18-8.1.4.el5PAE ro root=LABEL=/
initrd /initrd-2.6.18-8.1.4.el5PAE.img
修改设置为默认启动
default=0
RHEL5安装方法
如果是RHEL5的系统就可从安装过Kernel-PAE的Centos上复制过来路径如下/var/cache/yum/update/packages/kernel-PAE-2.6.18-53.1.21.el5.i686.rpm
使用scp kernel-PAE-2.6.18-53.1.21.el5.i686.rpm root@192.168.168.164:/opt
这样将该文件复制到RHEL5上,然后rpm –Uvh kernel-PAE-2.6.18-53.1.21.el5.i686.rpm
就可以安装好该包,然后修改下/etc/grub.conf将Default改成0就可以了
PAE 的一些说明
http://zh.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80%E6%89%A9%E5%B1%95