因为JavaEye网站的数据库服务器搬家的时候被托管商的工作人员狠狠摔了一下,所以硬盘整个挂掉了,我重新安装数据库服务器的时候,顺手下载了 Percona patch过的MySQL5.0版本,使用MySQL自带的heavy innodb配置文件改了改,作为my.cnf启动运行。数据库服务器的物理内存有6GB,其中有4GB可以被MySQL使用,my.cnf相关配置参数如下:
buffer pool越大越好,官方推荐使用物理内存的50%-80%;log_file_size也是越大越好,官方推荐log size加起来要达到buffer pool的25%-100%。使用memlock可以避免MySQL内存进入swap,这些都是默认的推荐配置了,没有什么可以质疑的地方。但是数据库服务器启动以后,运行不太正常。表现出来的现象是:
1、操作系统内存Disk Cache使用了2.7GB
2、操作系统swap空间使用了200MB左右,一直不停进行swap in/swap out
3、CPU的IO Wait偏高,平均在10%以上
这个现象看起来非常怪异和矛盾。IO Wait偏高显然是因为频繁的使用swap进行内存换页引起的,但问题是物理内存非常空闲,操作系统明明有2.7GB空闲物理内存做Disk Cache,怎么不吐出来一点,非要去用swap呢?
想来想去只有一种可能性,就是MySQL存在非常巨大的,频繁的文件读写操作,迫使操作系统不得不分配了2.7GB的Disk Cache,从而造成了物理内存的不足,被迫使用swap。而可能造成巨大文件读写操作的就是buffer pool的flush和log file的flush操作了。因此配置文件做如下修改:
memlock
innodb_buffer_pool_size = 2G
innodb_log_file_size = 64M
innodb_log_files_in_group = 2
innodb_flush_method=O_DIRECT
减少log file size和数量,使用O_DIRECT。重启以后,数据库服务器恢复正常。操作系统Disk Cache下降到900MB,Swap使用了200多MB,但是不再进行swap in/swap out操作,CPU的IO Wait下降到2-3%。
通过这次MySQL InnoDB的调优经历,发现一些和MySQL官方推荐配置不符合的疑惑之处,值得思考和探索:
1、innodb_flush_method究竟应不应该使用O_DIRECT?
所有MySQL调优的建议都说,如果硬件没有预读功能,那么使用O_DIRECT将极大降低InnoDB的性能,因为O_DIRECT跳过了操作系统的文件系统Disk Cache,让MySQL直接读写磁盘了。
但是在我的实践中来看,如果不使用O_DIRECT,操作系统被迫开辟大量的Disk Cache用于innodb的读写缓存,不但没有提高读写性能,反而造成读写性能急剧下降。而且buffer pool的数据缓存和操作系统Disk Cache缓存造成了Double buffer的浪费,显然从我这个实践来看,浪费得非常厉害。
说O_DIRECT造成MySQL直接读写磁盘造成得性能下降问题,我觉得完全是杞人忧天。因为从JavaEye的数据库监测来看,Innodb 的buffer pool命中率非常高,有98%以上,真正的磁盘操作是微乎其微的。为了1%的磁盘操作能够得到Disk Cache,而浪费了98%的double buffer内存空间,无论从性能上看,还是从内存资源的消耗来看,都是非常不明智的。
2、innodb_log_file_size究竟应该大一点,还是小一点?
所有MySQL调优建议都说,innodb_log_file_size要越大越好,避免无谓的buffer pool的flush操作。
但是在我的实践中来看,innodb_log_file_size开得太大,会明显增加innodb的log写入操作,而且会造成操作系统需要更多的Disk Cache开销。
因此从我的经验来看,innodb_flush_method=O_DIRECT是必须的,而innodb_log_file_size也不宜太大
1. memlock
2. innodb_buffer_pool_size = 2G
3. innodb_log_file_size = 256M
4. innodb_log_files_in_group = 3
5. #innodb_flush_method=fdatasync 默认设置
2. innodb_buffer_pool_size = 2G
3. innodb_log_file_size = 256M
4. innodb_log_files_in_group = 3
5. #innodb_flush_method=fdatasync 默认设置
memlock
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
#innodb_flush_method=fdatasync 默认设置
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
#innodb_flush_method=fdatasync 默认设置
buffer pool越大越好,官方推荐使用物理内存的50%-80%;log_file_size也是越大越好,官方推荐log size加起来要达到buffer pool的25%-100%。使用memlock可以避免MySQL内存进入swap,这些都是默认的推荐配置了,没有什么可以质疑的地方。但是数据库服务器启动以后,运行不太正常。表现出来的现象是:
1、操作系统内存Disk Cache使用了2.7GB
2、操作系统swap空间使用了200MB左右,一直不停进行swap in/swap out
3、CPU的IO Wait偏高,平均在10%以上
这个现象看起来非常怪异和矛盾。IO Wait偏高显然是因为频繁的使用swap进行内存换页引起的,但问题是物理内存非常空闲,操作系统明明有2.7GB空闲物理内存做Disk Cache,怎么不吐出来一点,非要去用swap呢?
想来想去只有一种可能性,就是MySQL存在非常巨大的,频繁的文件读写操作,迫使操作系统不得不分配了2.7GB的Disk Cache,从而造成了物理内存的不足,被迫使用swap。而可能造成巨大文件读写操作的就是buffer pool的flush和log file的flush操作了。因此配置文件做如下修改:
1. memlock
2. innodb_buffer_pool_size = 2G
3. innodb_log_file_size = 64M
4. innodb_log_files_in_group = 2
5. innodb_flush_method=O_DIRECT
2. innodb_buffer_pool_size = 2G
3. innodb_log_file_size = 64M
4. innodb_log_files_in_group = 2
5. innodb_flush_method=O_DIRECT
memlock
innodb_buffer_pool_size = 2G
innodb_log_file_size = 64M
innodb_log_files_in_group = 2
innodb_flush_method=O_DIRECT
减少log file size和数量,使用O_DIRECT。重启以后,数据库服务器恢复正常。操作系统Disk Cache下降到900MB,Swap使用了200多MB,但是不再进行swap in/swap out操作,CPU的IO Wait下降到2-3%。
通过这次MySQL InnoDB的调优经历,发现一些和MySQL官方推荐配置不符合的疑惑之处,值得思考和探索:
1、innodb_flush_method究竟应不应该使用O_DIRECT?
所有MySQL调优的建议都说,如果硬件没有预读功能,那么使用O_DIRECT将极大降低InnoDB的性能,因为O_DIRECT跳过了操作系统的文件系统Disk Cache,让MySQL直接读写磁盘了。
但是在我的实践中来看,如果不使用O_DIRECT,操作系统被迫开辟大量的Disk Cache用于innodb的读写缓存,不但没有提高读写性能,反而造成读写性能急剧下降。而且buffer pool的数据缓存和操作系统Disk Cache缓存造成了Double buffer的浪费,显然从我这个实践来看,浪费得非常厉害。
说O_DIRECT造成MySQL直接读写磁盘造成得性能下降问题,我觉得完全是杞人忧天。因为从JavaEye的数据库监测来看,Innodb 的buffer pool命中率非常高,有98%以上,真正的磁盘操作是微乎其微的。为了1%的磁盘操作能够得到Disk Cache,而浪费了98%的double buffer内存空间,无论从性能上看,还是从内存资源的消耗来看,都是非常不明智的。
2、innodb_log_file_size究竟应该大一点,还是小一点?
所有MySQL调优建议都说,innodb_log_file_size要越大越好,避免无谓的buffer pool的flush操作。
但是在我的实践中来看,innodb_log_file_size开得太大,会明显增加innodb的log写入操作,而且会造成操作系统需要更多的Disk Cache开销。
因此从我的经验来看,innodb_flush_method=O_DIRECT是必须的,而innodb_log_file_size也不宜太大
05年再次实践:
如果没有问题,再次关闭后推入后台:
/usr/local/mysql/bin/mysqld_safe --user=root &
停止:
确定停止?:
root 4121 0.0 0.0 5800 2488 pts/35 S+ 16:22 0:00 mysql
gastonwu 5365 0.0 0.0 5192 2256 pts/67 S+ Aug24 0:00 mysql -u root -p
root 5844 0.0 0.0 5800 2516 pts/28 S+ 16:28 0:00 mysql -uwiki -p wiki -hlocalhost
root 11169 0.0 0.0 2768 744 pts/49 S+ 16:46 0:00 grep mysql
root 15169 0.0 0.0 5844 2712 pts/8 S+ Sep23 0:00 mysql
gastonwu 18138 0.0 0.0 5188 2276 pts/91 S+ Aug25 0:00 mysql -u root -p DB_DemoSoapp
root 23843 0.0 0.0 5800 2584 pts/27 S+ 15:40 0:00 mysql
root 27623 0.0 0.0 5800 2568 pts/99 S+ 14:08 0:00 mysql
启动:
Starting mysqld daemon with databases from /usr/local/mysql/data[1]+ Stopped /bin/sh /usr/local/mysql/bin/mysqld_safe --user=root
客户端登陆:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.27-max
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
如果已经连上后,重启后会出现:
当然,用pkill 杀mysql的进程也是也可以的,呵呵!
如果没有问题,再次关闭后推入后台:
/usr/local/mysql/bin/mysqld_safe --user=root &
mysqladmin -u root shutdown
停止:
[/usr/local/mysql/bin]# mysqladmin -u root shutdown
确定停止?:
[/usr/local/mysql/bin]# ps axu|grep mysql
root 4121 0.0 0.0 5800 2488 pts/35 S+ 16:22 0:00 mysql
gastonwu 5365 0.0 0.0 5192 2256 pts/67 S+ Aug24 0:00 mysql -u root -p
root 5844 0.0 0.0 5800 2516 pts/28 S+ 16:28 0:00 mysql -uwiki -p wiki -hlocalhost
root 11169 0.0 0.0 2768 744 pts/49 S+ 16:46 0:00 grep mysql
root 15169 0.0 0.0 5844 2712 pts/8 S+ Sep23 0:00 mysql
gastonwu 18138 0.0 0.0 5188 2276 pts/91 S+ Aug25 0:00 mysql -u root -p DB_DemoSoapp
root 23843 0.0 0.0 5800 2584 pts/27 S+ 15:40 0:00 mysql
root 27623 0.0 0.0 5800 2568 pts/99 S+ 14:08 0:00 mysql
启动:
[/usr/local/mysql/bin]# /bin/sh /usr/local/mysql/bin/mysqld_safe --user=root
Starting mysqld daemon with databases from /usr/local/mysql/data[1]+ Stopped /bin/sh /usr/local/mysql/bin/mysqld_safe --user=root
客户端登陆:
[/usr/local/mysql/bin]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.27-max
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
如果已经连上后,重启后会出现:
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
No connection. Trying to reconnect...
Connection id: 2
Current database: *** NONE ***
当然,用pkill 杀mysql的进程也是也可以的,呵呵!
netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r +0n
netstat -na|grep SYN|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r +0n
Onecent:~ # netstat -an | grep 80 | awk '{print $6}' | sort | uniq -c | sort -rn
681 TIME_WAIT
122 ESTABLISHED
107 FIN_WAIT2
44 FIN_WAIT1
14 SYN_SENT
3 LAST_ACK
2 SYN_RECV
1 LISTEN
1 CLOSING
linux可以查看多少人连接了80端口:
Onecent:~ # netstat -na | grep ":80" | wc
1074 6444 86994
1074 6444 86994
Onecent:~ # netstat -atlunp|grep 80|grep TIME_WAIT|wc
787 5509 79487
787 5509 79487
Oncecent:~ # netstat -atlunp|grep 80|wc
1030 7210 104030
1030 7210 104030
线程数:
Onecent:/usr/local/apache2/conf # ps -ef |grep httpd |wc -l
360
360
工作模式查看:
Onecent:/usr/local/apache2/conf # /usr/local/apache2/bin/httpd -l
Compiled in modules:
core.c
mod_access.c
mod_auth.c
mod_cache.c
mod_disk_cache.c
mod_mem_cache.c
mod_include.c
mod_deflate.c
mod_log_config.c
mod_env.c
mod_expires.c
mod_setenvif.c
prefork.c
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c
mod_so.c
Compiled in modules:
core.c
mod_access.c
mod_auth.c
mod_cache.c
mod_disk_cache.c
mod_mem_cache.c
mod_include.c
mod_deflate.c
mod_log_config.c
mod_env.c
mod_expires.c
mod_setenvif.c
prefork.c
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c
mod_so.c
注意:prefork.c //此处为mpm工作模式,也可使用worker.c模式
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
Onecent:/usr/local/# netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
LAST_ACK 3
SYN_RECV 5
ESTABLISHED 207
FIN_WAIT1 63
FIN_WAIT2 105
SYN_SENT 1
TIME_WAIT 912
LAST_ACK 3
SYN_RECV 5
ESTABLISHED 207
FIN_WAIT1 63
FIN_WAIT2 105
SYN_SENT 1
TIME_WAIT 912
修理修理下面的参数:
sysctl -p
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 2048 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 2048 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
修改:
1, sysctl命令的作用
在运行时配置内核参数
2,用法举例:
-w 用此选项来改变一个sysctl设置
例:sysctl -w net.ipv4.ip_forward=1
-p 载入sysctl配置文件
如-p后未指定路径,则载入 /etc/sysctl.conf
例: sysctl -p /etc/sysctl.conf
3,修改/etc/sysctl.conf可以保存设置在机器重启后仍然有效
例如:
vi /etc/sysctl.conf
修改: net.ipv4.ip_forward=0的值为1
作用:打开数据包的转发功能
如何使修改马上生效?
sysctl -p /etc/sysctl.conf // 作用:重新载入/etc/sysctl.conf文件
整个张宴的nginx的配置,如下,可以参考:
优化Linux内核参数
vi /etc/sysctl.conf
在末尾增加以下内容:
引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
使配置立即生效:
/sbin/sysctl -p
当FreeBSD系统上线运行一段时间后,用top命令查看内存的使用情况,会发现Free内存已经变得很小了。而在同样应用的情况下,Windows Server的Free内存会有很大的剩余。这是为什么呢?难道FreeBSD系统比Windows Server还要消耗内存?
答案当然是否定的。其实,这是由于FreeBSD的内存管理与Windows Server的不同。FreeBSD会最大化的利用系统中的内存,系统中有多少内存,FreeBSD都会尽量去使用。
使用top命令,你会发现内存被分为以下几种。
引用
Active,在一段时间内被使用的内存
Inact(Inactive),在一段时间内没有被使用的内存
Wired,挂起的内存,系统内核使用的内存
Cache、Buf,顾名思义,用于缓存,其中的数据有可能被再次使用,避免从磁盘中读取,加快读取速度
Free,系统中空闲的内存
当需要使用内存时,是以以下优先级来进行的。
引用
Free > Cache(Buf) > Inact > Active
所以,当Free变小时,不必担心内存不够用,只要Free内存还有,就表示内存够用。这正是FreeBSD内存管理的优越性,最大化利用内存,使系统的整体性能得到充分的发挥。只有当Swap使用较多时,我们才应该考虑增加内存了。
来源:http://blog.jiqila.com/post/210/
答案当然是否定的。其实,这是由于FreeBSD的内存管理与Windows Server的不同。FreeBSD会最大化的利用系统中的内存,系统中有多少内存,FreeBSD都会尽量去使用。
使用top命令,你会发现内存被分为以下几种。
引用
Active,在一段时间内被使用的内存
Inact(Inactive),在一段时间内没有被使用的内存
Wired,挂起的内存,系统内核使用的内存
Cache、Buf,顾名思义,用于缓存,其中的数据有可能被再次使用,避免从磁盘中读取,加快读取速度
Free,系统中空闲的内存
当需要使用内存时,是以以下优先级来进行的。
引用
Free > Cache(Buf) > Inact > Active
所以,当Free变小时,不必担心内存不够用,只要Free内存还有,就表示内存够用。这正是FreeBSD内存管理的优越性,最大化利用内存,使系统的整体性能得到充分的发挥。只有当Swap使用较多时,我们才应该考虑增加内存了。
来源:http://blog.jiqila.com/post/210/
cat /etc/rc.conf
hostname="freebsd-unmp-10-10-0-237"
#ifconfig_vtnet0="inet 10.10.0.237 netmask 255.255.255.0" #为名称是vtnet0的网卡设置
ifconfig_re0="inet 10.10.0.237 netmask 255.255.255.0" #ifconfig 看网卡名
defaultrouter="10.10.0.1"
/etc/netstart
FreeBSD13上配置静态IP地址:
Port安装准备
修改DNS 命令:ee /etc/resolv.conf
添加DNS服务器地址 nameserver x.x.x.x 存盘重启(x.x.x.x用实际的ip地址代替)
下载Port安装目录文件 命令:portsnap fetch
更新Port安装目录文件 命令:portsnap extract update
来自:https://liujia.anqun.org/index.php/archives/1451/
=============
一、制作启动U盘
从FreeBSD官网(https://www.freebsd.org/)下载安装源程序: FreeBSD-12.0-RELEASE-amd64-memstick.img
从rufus官网(https://rufus.akeo.ie/)下载rufus.exe。
用rufur制作FreeBSD安装启动盘。
二、安装FreeBSD12.0
将电脑设置成U盘启动。
启动后,基本自动安装,如遇选择项,全选Y;
添加用户(略)。
三、开通SSH服务
安装完毕后,重启。
root登录,修改远程登录配置。
命令:ee /etc/inetd.conf
打开inetd.conf文件,将SSH服务前的“#”去掉,存盘重启。
可以使用Putty远程登录了。
四、Port安装准备
修改DNS 命令:ee /etc/resolv.conf
添加DNS服务器地址 nameserver x.x.x.x 存盘重启(x.x.x.x用实际的ip地址代替)
下载Port安装目录文件 命令:portsnap fetch
更新Port安装目录文件 命令:portsnap extract update
五、安装Apache24
进入 /usr/ports/www/apache24/目录
安装,命令:make install clean
设置服务器地址 命令:ee /usr/local/etc/apache24/httpd.conf
修改www服务器地址 ServerName x.x.x.x:80(x.x.x.x用实际的ip地址代替)
修改开机启动文件,设置Apache24随开机启动,命令:ee /etc/rc.conf
添加 apache24_enable="YES" 存盘启动。
安装完毕,默认网页目录: /usr/local/www/apache24/data/
Apache相关命令 启动 apachectl start 停止 apachectl stop 重启 apachectl restart
六、安装MySQL80
建议先于PHP安装MySQL,进入/usr/ports/databases/mysql80-server
安装 命令:make install clean
修改开机启动文件,设置MySQL随开机启动,命令:ee /etc/rc.conf
添加 mysql_enable="YES" 存盘启动。
七、安装php73
进入/usr/ports/lang/php73
安装 命令:make install clean
八、配置 Apache24和PHP73
进入/usr/ports/www/mod_php73
安装 命令:make install clean
修改配置文件 ee /usr/local/etc/apache24/httpd.conf
添加
DrectoryIndex index.html index.php
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
<�6�8FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
<�6�8FilesMatch>
编写入口文件index.php 内容为<?php phpinfo(); ?> 存盘重启
通过服务器地址访问index.php
复制配置文件 /usr/local/etc/php.ini-development 到 /usr/local/etc/php.ini
九、配置PHP73和MySQL80
进入/usr/ports/lang/php73-extensions
安装 命令:make install clean
出现选择菜单时,选mysqli
访问index.php,如mysqli加载成功,即安装完成。
hostname="freebsd-unmp-10-10-0-237"
#ifconfig_vtnet0="inet 10.10.0.237 netmask 255.255.255.0" #为名称是vtnet0的网卡设置
ifconfig_re0="inet 10.10.0.237 netmask 255.255.255.0" #ifconfig 看网卡名
defaultrouter="10.10.0.1"
/etc/netstart
FreeBSD13上配置静态IP地址:
Port安装准备
修改DNS 命令:ee /etc/resolv.conf
添加DNS服务器地址 nameserver x.x.x.x 存盘重启(x.x.x.x用实际的ip地址代替)
下载Port安装目录文件 命令:portsnap fetch
更新Port安装目录文件 命令:portsnap extract update
来自:https://liujia.anqun.org/index.php/archives/1451/
=============
一、制作启动U盘
从FreeBSD官网(https://www.freebsd.org/)下载安装源程序: FreeBSD-12.0-RELEASE-amd64-memstick.img
从rufus官网(https://rufus.akeo.ie/)下载rufus.exe。
用rufur制作FreeBSD安装启动盘。
二、安装FreeBSD12.0
将电脑设置成U盘启动。
启动后,基本自动安装,如遇选择项,全选Y;
添加用户(略)。
三、开通SSH服务
安装完毕后,重启。
root登录,修改远程登录配置。
命令:ee /etc/inetd.conf
打开inetd.conf文件,将SSH服务前的“#”去掉,存盘重启。
可以使用Putty远程登录了。
四、Port安装准备
修改DNS 命令:ee /etc/resolv.conf
添加DNS服务器地址 nameserver x.x.x.x 存盘重启(x.x.x.x用实际的ip地址代替)
下载Port安装目录文件 命令:portsnap fetch
更新Port安装目录文件 命令:portsnap extract update
五、安装Apache24
进入 /usr/ports/www/apache24/目录
安装,命令:make install clean
设置服务器地址 命令:ee /usr/local/etc/apache24/httpd.conf
修改www服务器地址 ServerName x.x.x.x:80(x.x.x.x用实际的ip地址代替)
修改开机启动文件,设置Apache24随开机启动,命令:ee /etc/rc.conf
添加 apache24_enable="YES" 存盘启动。
安装完毕,默认网页目录: /usr/local/www/apache24/data/
Apache相关命令 启动 apachectl start 停止 apachectl stop 重启 apachectl restart
六、安装MySQL80
建议先于PHP安装MySQL,进入/usr/ports/databases/mysql80-server
安装 命令:make install clean
修改开机启动文件,设置MySQL随开机启动,命令:ee /etc/rc.conf
添加 mysql_enable="YES" 存盘启动。
七、安装php73
进入/usr/ports/lang/php73
安装 命令:make install clean
八、配置 Apache24和PHP73
进入/usr/ports/www/mod_php73
安装 命令:make install clean
修改配置文件 ee /usr/local/etc/apache24/httpd.conf
添加
DrectoryIndex index.html index.php
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
<�6�8FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
<�6�8FilesMatch>
编写入口文件index.php 内容为<?php phpinfo(); ?> 存盘重启
通过服务器地址访问index.php
复制配置文件 /usr/local/etc/php.ini-development 到 /usr/local/etc/php.ini
九、配置PHP73和MySQL80
进入/usr/ports/lang/php73-extensions
安装 命令:make install clean
出现选择菜单时,选mysqli
访问index.php,如mysqli加载成功,即安装完成。
dmesg 最简单的方法
freebsd# cat /var/run/dmesg.boot |grep CPU 可以查看 cpu信息
sysctl hw.model 看cpuid
sysctl machdep.tsc_freq 看cpu频率
或者直接通过ports
cd /usr/ports/misc/cpuid
make install clean
然后
可以直接通过cpuid来查看
/usr/local/bin/cpuid
Tags: cpu , freebsd
来自:http://blog.sina.com.cn/s/blog_49f8dc400100wnn9.html
获取CPU速度
在shell下键入以下命令:
引用
sysctl -a | egrep -i 'hw.machine|hw.model|hw.ncpu'
将会得到大概如下输出:
引用
hw.machine: amd64
hw.model: Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
hw.ncpu: 8
hw.machine_arch: amd64
那么,通过以上信息我们得知CPU为Intel Xeon四核,频率为2.4GHz
获取更多CPU信息
为了得到更详细的CPU信息,我们可以用下面的命令:
引用
dmesg | grep -i cpu
或
grep -i cpu /var/run/dmesg.boot
将会得到大概如下输出:
引用
CPU: Intel(R) Xeon(TM) CPU 3.00GHz (3000.12-MHz K8-class CPU)
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
cpu0 (BSP): APIC ID: 0
cpu1 (AP/HT): APIC ID: 1
cpu0: <ACPI CPU> on acpi0
p4tcc0: on cpu0
cpu1: <ACPI CPU> on acpi0
p4tcc1: on cpu1
SMP: AP CPU #1 Launched!
来源:http://blog.jiqila.com/post/227/
freebsd# cat /var/run/dmesg.boot |grep CPU 可以查看 cpu信息
sysctl hw.model 看cpuid
sysctl machdep.tsc_freq 看cpu频率
或者直接通过ports
cd /usr/ports/misc/cpuid
make install clean
然后
可以直接通过cpuid来查看
/usr/local/bin/cpuid
Tags: cpu , freebsd
来自:http://blog.sina.com.cn/s/blog_49f8dc400100wnn9.html
获取CPU速度
在shell下键入以下命令:
引用
sysctl -a | egrep -i 'hw.machine|hw.model|hw.ncpu'
将会得到大概如下输出:
引用
hw.machine: amd64
hw.model: Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
hw.ncpu: 8
hw.machine_arch: amd64
那么,通过以上信息我们得知CPU为Intel Xeon四核,频率为2.4GHz
获取更多CPU信息
为了得到更详细的CPU信息,我们可以用下面的命令:
引用
dmesg | grep -i cpu
或
grep -i cpu /var/run/dmesg.boot
将会得到大概如下输出:
引用
CPU: Intel(R) Xeon(TM) CPU 3.00GHz (3000.12-MHz K8-class CPU)
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
cpu0 (BSP): APIC ID: 0
cpu1 (AP/HT): APIC ID: 1
cpu0: <ACPI CPU> on acpi0
p4tcc0: on cpu0
cpu1: <ACPI CPU> on acpi0
p4tcc1: on cpu1
SMP: AP CPU #1 Launched!
来源:http://blog.jiqila.com/post/227/
php5.3.3已经内置了php-fpm(之前是patch的形式),编译的时候,设置以下参数就可以了
–enable-fpm
---------------------------------------------------
安装php 5.3.3(5.3.3已包括fpm):
阅读全文
–enable-fpm
---------------------------------------------------
安装php 5.3.3(5.3.3已包括fpm):

HTML <form> 标签的 accept-charset 属性定义和用法accept-charset 属性规定服务器处理表单数据所接受的字符集。
accept-charset 属性允许您指定一系列字符集,服务器必须支持这些字符集,从而得以正确解释表单中的数据。
该属性的值是用引号包含字符集名称列表。如果可接受字符集与用户所使用的字符即不相匹配的话,浏览器可以选择忽略表单或是将该表单区别对待。
此属性的默认值是 "unknown",表示表单的字符集与包含表单的文档的字符集相同。
提示:请避免使用该属性。应该在服务器端验证文件上传。
accept-charset
一个很少用到的表单属性,利用它实现在不同编码的页面里实现表单的提交也是一种很方便的解决方法。转自老王的baidu空间,记录在此。
作者:老王
问题背景:
两个应用编码不同,一个是GBK编码,另一个是UTF-8编码。现在要在GBK编码的应用里使用表单向UTF-8编码的应用里提交数据,很显然,如果不做特殊处理的话,会出现乱码。
解决方案:
当然了,可以自己使用ICONV或者MB扩展来转换编码,但这不是我们要的。
在W3里介绍了一个不太常见的属性:accept-charset,用它可以完成我们的需求。
在GBK编码的页面里编写如下代码:
<form method="post" action="..." accept-charset="utf-8">
...
</form>
如此的代码在Firefox等正常的浏览器下没有任何问题,但是遇到IE这个变态浏览器就不灵光了,我们还得用点不入流的手段Hack一下:
<form method="post" action="..." accept-charset="utf-8" onsubmit="document.charset='utf-8';">
...
</form>
剩下的工作浏览器会搞定。
参考:
http://www.w3school.com.cn/tags/att_form_accept_charset.asp
http://blog.zol.com.cn/795/article_794546.html
来源:http://gfeng.org/?m=201009
accept-charset 属性允许您指定一系列字符集,服务器必须支持这些字符集,从而得以正确解释表单中的数据。
该属性的值是用引号包含字符集名称列表。如果可接受字符集与用户所使用的字符即不相匹配的话,浏览器可以选择忽略表单或是将该表单区别对待。
此属性的默认值是 "unknown",表示表单的字符集与包含表单的文档的字符集相同。
提示:请避免使用该属性。应该在服务器端验证文件上传。
accept-charset
一个很少用到的表单属性,利用它实现在不同编码的页面里实现表单的提交也是一种很方便的解决方法。转自老王的baidu空间,记录在此。
作者:老王
问题背景:
两个应用编码不同,一个是GBK编码,另一个是UTF-8编码。现在要在GBK编码的应用里使用表单向UTF-8编码的应用里提交数据,很显然,如果不做特殊处理的话,会出现乱码。
解决方案:
当然了,可以自己使用ICONV或者MB扩展来转换编码,但这不是我们要的。
在W3里介绍了一个不太常见的属性:accept-charset,用它可以完成我们的需求。
在GBK编码的页面里编写如下代码:
<form method="post" action="..." accept-charset="utf-8">
...
</form>
如此的代码在Firefox等正常的浏览器下没有任何问题,但是遇到IE这个变态浏览器就不灵光了,我们还得用点不入流的手段Hack一下:
<form method="post" action="..." accept-charset="utf-8" onsubmit="document.charset='utf-8';">
...
</form>
剩下的工作浏览器会搞定。
参考:
http://www.w3school.com.cn/tags/att_form_accept_charset.asp
http://blog.zol.com.cn/795/article_794546.html
来源:http://gfeng.org/?m=201009
file_get_contents() 函数
定义和用法
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
语法
file_get_contents(path,include_path,context,start,max_length)参数 描述
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context 可选。规定文件句柄的环境。
context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。
说明
对 context 的支持是 PHP 5.0.0 添加的。
针对超时或页面过慢,一般可采取两个解决方案:
1. 利用file_get_contents()第三个参数
<?php
$url = "http://zhoz.com/zhoz.php";
$ctx = stream_context_create(array(
‘http’ => array(‘timeout’ => 10)
)
);
$result = @file_get_contents($url, 0, $ctx);
if($result){
var_dump($result);
}else{
echo " Buffer is empty";
}
?>
阅读全文
定义和用法
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
语法
file_get_contents(path,include_path,context,start,max_length)参数 描述
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context 可选。规定文件句柄的环境。
context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。
说明
对 context 的支持是 PHP 5.0.0 添加的。
针对超时或页面过慢,一般可采取两个解决方案:
1. 利用file_get_contents()第三个参数
<?php
$url = "http://zhoz.com/zhoz.php";
$ctx = stream_context_create(array(
‘http’ => array(‘timeout’ => 10)
)
);
$result = @file_get_contents($url, 0, $ctx);
if($result){
var_dump($result);
}else{
echo " Buffer is empty";
}
?>

http://gfeng.org/?p=147
在PHP中用exec()或popen()函数将一个shell命令行推到后台去.
PHP执行Shell命令发现popen好像是异步执行的,奶奶的。。奇怪了。。关注下
在PHP中用exec()或popen()函数将一个shell命令行推到后台去.
PHP执行Shell命令发现popen好像是异步执行的,奶奶的。。奇怪了。。关注下
今天,在写shell的时候,需要读取一个sh文件的内容,然后给予拼接字符串后执行这个字符串,出现换行的情况,于是,经过苦心查找,原来是读取vi编辑文件的后面有换行符,通过php的trim对其做了处理,OK,以前一直没有注意,原来Linux的vi一直都在干这个事情,哈哈哈,特别写下这个记录!
----------------------------------------------------------------------------------------------------------------------------------------------------
Linux下vi一个jackxiang.txt,然后,sz下来,用编辑器:FlexHEX.ext打开Jackxiang.txt,换行符的查看:
换行符(\n) 相当于ASCII 换行字符(十六进制0A),
因此,在文本模式下打开的文件作为新行字符读入CR/LF 对,并且作为CR/LF 写入新行字符。
原来是vi编辑器自己在行尾加了个\n换行符。用od命令可看的很清楚:od -A d -t c jackxiang.txt
PHP用trim去掉换行符,即可! "\n" (ASCII 10 (0x0A)), a new line (line feed).
阅读全文
----------------------------------------------------------------------------------------------------------------------------------------------------
Linux下vi一个jackxiang.txt,然后,sz下来,用编辑器:FlexHEX.ext打开Jackxiang.txt,换行符的查看:
16进制:6A 61 63 6B 78 69 61 6E 67 0A
原文:jackxiang
原文:jackxiang
换行符(\n) 相当于ASCII 换行字符(十六进制0A),
因此,在文本模式下打开的文件作为新行字符读入CR/LF 对,并且作为CR/LF 写入新行字符。
原来是vi编辑器自己在行尾加了个\n换行符。用od命令可看的很清楚:od -A d -t c jackxiang.txt
Onecent:/usr/local/tads/htdocs/*****_2010/bin # od -A d -t c jackxiang.txt
0000000 j a c k x i a n g \n
0000010
0000000 j a c k x i a n g \n
0000010
PHP用trim去掉换行符,即可! "\n" (ASCII 10 (0x0A)), a new line (line feed).

[个人原创]awk取得绝对路径和文件名拼接的方法
Php/Js/Shell/Go jackxiang 2010-9-21 17:19
原因很简单,需要某个目录下的shell文件同时推到后台执行:
引申:
结果如下:
TTTTT:/usr/local/tads/htdocs/*/data/20100920 #
导入到文件:
其实际在shell编程过程中,往往需要用到绝对地址的时候,就不用这个,如下:
路径已经在里面了!
awk -v var=$(pwd) 'BEGIN{print var}'
引申:
ls -lart GrepQQCommand_*|awk -v PWD=$PWD '{print PWD "/" $9}'
结果如下:
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ak
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc
/usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef
TTTTT:/usr/local/tads/htdocs/*/data/20100920 #
ls -lart GrepQQCommand_*|awk -v PWD=$PWD '{print "nohup sh " PWD "/" $9 "&"}'
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ak&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_bc&
nohup sh /usr/local/tads/htdocs/*/data/20100920/GrepQQCommand_ef&
导入到文件:
s -lart GrepQQCommand_*|awk -v PWD=$PWD '{print "nohup sh " PWD "/" $9 "&"}' > ccc.sh
然后:sh ccc.sh即可。其实际在shell编程过程中,往往需要用到绝对地址的时候,就不用这个,如下:
ls -lart /usr/local/tads/htdocs/*****_2010/data/20100921/GrepQQCommand_*
-rwxrwxrwx 1 root users 284064 Sep 22 15:39 /usr/local/tads/htdocs/*****_2010/data/20100921/GrepQQCommand_aa
-rwxrwxrwx 1 root users 284064 Sep 22 15:39 /usr/local/tads/htdocs/*****_2010/data/20100921/GrepQQCommand_aa
路径已经在里面了!
cat CCC_ad |awk '{print '"$(date +"%Y%m%d%H%M%S")"',$1,$5,$6,$7,$8}'
cat CCC_ad |awk '{print strftime(), $1,$5,$6,$7,$8}'
now=$(date +%Y-%m-%d" "%H:%M:%S)
echo $now
echo $now
Math.round(Math.random()*10000)
alert(Math.round(Math.random()*10000))
使用如下:
var item = $("input:radio:checked");
var checkedvalue = item.val();
var fqq = $('#FVotedQQ').val();
var frominvite = $('#frominvite').val();
var random = Math.round(Math.random()*10000);
var getaward = $.ajax({
url: "http://***.act.***.com/c/vote/add",
data:"FVotedQQ="+fqq+"&kindid="+checkedvalue+"&frominvite="+frominvite+"random="+random,
async: false
}).responseText;
eval('var data = '+getaward);
alert(data.message);
split -l 5000 CCC.txt CCC_New.txt
[~/split]# ls
CCC_New.txtaa CCC_New.txtad CCC_New.txtag CCC_New.txtaj CCC_New.txtam CCC_New.txtap
CCC_New.txtab CCC_New.txtae CCC_New.txtah CCC_New.txtak CCC_New.txtan CCC_New.txtaq
CCC_New.txtac CCC_New.txtaf CCC_New.txtai CCC_New.txtal CCC_New.txtao CCC.txt
今天接到一个需求是提取5月访问某域名的所有用户号码,文件一存放访问域名下地址A的用户号码,剩余用户按照50万整数一个包为规则提取。
这个剩余用户按照50万一个包让人看着有点紧张,怎么提?难道要用rownum?
不要被蒙蔽!还是提成一个文件好了,用linux下的split一分就完事了。
怎么用?
这样写
split -l 500000 js_24875.csv new_js_24875.csv
split -l n
把infile拆分为n行的段,默认一个文件为1000行、、split --help
-l, --lines=NUMBER put NUMBER lines per output file
-l, --lines=NUMBER put NUMBER lines per output file
注意:
split: Output file suffixes exhausted 注意此处:split在提示我们说输出时的文件名后缀被用光了
[root@linux ~]# split [-bl] file PREFIX
参数:
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分割。
范例:
范例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一个档案时?
[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
[root@linux tmp]# ls -l termcap*
-rw-rw-r-- 1 root root 307200 8月 17 00:25 termcapaa
-rw-rw-r-- 1 root root 307200 8月 17 00:25 termcapab
-rw-rw-r-- 1 root root 184848 8月 17 00:25 termcapac
# 那个档名可以随意取的啦!我们只要写上前导文字,小档案就会以
# xxxaa, xxxab, xxxac 等方式来建立小档案的!
范例二:如何将上面的三个小档案合成一个档案,档名为 termcapback
[root@linux tmp]# cat termcap* >> termcapback
# 很简单吧?就用资料流重导向就好啦!简单!