存档

2008年8月 的存档

让你的windows也拥有多个桌面

2008年8月26日 2 条评论

现在的电脑cpu越来越快,内存越来越多。所以自然而然的开的程序也多。每天上班到下班总能开个一堆程序,下面的任务栏从一开始的一行到2行,再到现在的3行。可是还是觉得不够放开的程序。而且桌面要放的东西也越来越多,监控啊、日程安排啊、任务管理啊,真的有点觉得一个屏幕不够用了。所以把目光投向了类似linux的多桌面环境软件。无意中发现原来微软也自己出了一个那就是:Windows Sysinternals Desktops

由强悍的Sysinternals团队发布的一个多桌面工具,它不但可以完成类似于Linux虚拟桌面这样的任务,还可以在任务栏处设置缩略图,帮助快速识别这个虚拟桌面所运行的程序,并且在使用虚拟桌面时并不额外占用系统资源,非常好用,这款软件的大小仅有62KB.

界面截图:

Configuration Dialog
Configuration Dialog

Tray Desktop Switch Window
Tray Desktop Switch Window

PS:这篇日志就是在我的第二个桌面下面写的嘿嘿,第一个桌面已经开了一堆了

分类: 只谈软件 标签:

rsync备份时排除指定目录

2008年8月25日 3 条评论

要排除指定目录,可以在客户端命令行中使用–exclude-from命令
例如
rsync -vzrtopg –progress –delete –exclude-from=/home/pcfile xxx@xxx.xxx.xxx.xxx::xxx /back/xxx

pcfile内容写成
aaa/
bbb/

这样,待同步目录中的子目录 aaa和bbb,就不在同步之列了
以下内容待定
同理,若要指定只同步某几个目录,可以用–include-from
include 和 exclude指令则可以排除或不排除指定的文件

分类: 软件相关 标签:

my.cnf自动生成器[试用版]

2008年8月24日 没有评论

本工具产生的配置文件仅作参考用途,对此带来的后果不符任何责任,请注意使用。

看这里

http://imysql.cn/my_cnf_generator

分类: mysql相关 标签:

今天正式启用wordpress作为博客系统了

2008年8月24日 没有评论

其实我相当的懒所以也很少写博客,大多数是看到好的文章转一下,方便自己看看。

不过现在似乎流行自己建博客站,所以我也就申请了2域名开始单飞了。

当然程序肯定是首先wp的。

其实单飞也不见得会勤快点,主要是用来测试运行环境用的,外加单飞什么东西都好由着自己乱整。

当然在尽可能的情况下我会努力更新的

以后访问直接到 http://226617.cn/  就是我qq号

下面的内容可能会有点乱,刚刚从oblog里面转过来的,还没来得及整理,将就一下先。

分类: 只谈心情 标签:

MySQL优化[转]-ps:wp第一贴

2008年8月24日 没有评论
google reader上看到的一片关于mysql的文章,觉得写得不错转一下。这里想说的是这只能作为参考,任何优化都要根据应用分析为前提的来进行。
8月 21st, 2008 Posted in MySQL < by Johnny Woo >

thread_concurrency
数量设置为CPU核心数量的两倍.
thread_cache_size
按照内存大小来设置, 1G=8, 2G=16, 3G=32, >3G=64
wait_timeout
超时时间,如果连接数比较大,可以减少此参数的值,我使用的是10
max_connections
最大连接数,mysql实际允许连接数的值是max_connections+1,按照系统库不同而有不同性能.一般是500~1000,MySQL AB提供的linux静态库可以达到4000.
query_cache_size
查询缓冲,默认是0,所以必须打开以提高mysql性能,其本身需要40K来保存结构数据.所以不能设置的太小,初期可以设置成32M,然后根据实际运行情况另行调整
query_cache_type
指定查询缓冲的类型,0是关闭,1是缓冲除了使用SELECT SQL_NO_CACHE语句指明了不需要缓冲的数据意外的所有查询,2是只缓冲SELECT SQL_CACHE指定的查询.一般设置为1.
query_cache_limit
允许进入查询缓冲区的最小数据大小,默认值是1MB,可以修改的小一点以满足更多查询的需求.但是如果设置的过于小,则会导致很多新的小查询的结果将原有的查询结果交换出去.增加系统的颠簸.

相关命令
查询mysql服务器相关状态数据
>SHOW STATUS;

查询mysql服务器相关配置选项
>SHOW VARIABLES;

整理查询缓冲区里的碎片
>flush query cache;

删除查询缓冲区里的所有内容
>reset query cache;

设置mysql参数
>SET GLOBAL;

查询mysql当前执行的sql语句
>show processlist;

变量 含义
Qcache_queries_in_cache
在缓存中已注册的查询数目
Qcache_inserts
被加入到缓存中的查询数目
Qcache_hits
缓存采样数数目
Qcache_lowmem_prunes
因为缺少内存而被从缓存中删除的查询数目
Qcache_not_cached
没有被缓存的查询数目 (不能被缓存的,或由于 QUERY_CACHE_TYPE)
Qcache_free_memory
查询缓存的空闲内存总数
Qcache_free_blocks
查询缓存中的空闲内存块的数目
Qcache_total_blocks
查询缓存中的块的总数目

MySQL查询优化
>SHOW STATUS LIKE ‘Qcache%’;
查询出Cache状态
如果Qcache_lowmem_prunes非常大,说明因为内存不足而被交换出cache的数据很多.如果增加内存.可以保证较小的交换次数以及较高的命中率
例如现在我们查询的结果如下

| Qcache_free_blocks      | 1234     |
| Qcache_free_memory      | 25957504 |
| Qcache_hits             | 55771119 |
| Qcache_inserts          | 7441153  |
| Qcache_lowmem_prunes    | 28332    |
| Qcache_not_cached       | 1233788  |
| Qcache_queries_in_cache | 4810     |
| Qcache_total_blocks     | 11038    |

设置为64M cache内存后
>set global query_cache_size=67108864;

| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 66623616 |
| Qcache_hits             | 55788258 |
| Qcache_inserts          | 7445445  |
| Qcache_lowmem_prunes    | 28332    |
| Qcache_not_cached       | 1234057  |
| Qcache_queries_in_cache | 183      |
| Qcache_total_blocks     | 392      |

自由内存块看起来变小了
是因为现在自由内存块.是一个整块.而以前的内存块都是分散的小块
而因为重建了cache区
Qcache_queries_in_cache变量变小了.因为此操作重新建立了cache内存区.所有数据重新缓存
在运行一两天后我们再看此数据.如果变大了.说明增大cache内存区域是有效的.如果和以前数据差不多
说明增加的内存并没有实际起到多大的作用.

有人会觉得如果我将cache内存设置的非常大
然后将cache_limit设置成0
那么所有查询都会被缓存了
理论上是这样.但是一台数据库服务器的查询非常多.
如果连查询单条数据都要缓存.
那么内存再大也会不够的.到时候老的内容就会被交换出去
当cache内存使用满的时候,就会不停的有新查询进来将老查询替换出去.
这样导致两个结果.一个是内存颠簸.效率反而下降.
第二个是cache内存的小碎块增多,内存利用率降低
如果是只有内容很少的小库,并且查询率不高.是可以使用这种方法提高响应速度
但是如果是实际生产环境,数据量会比较大.还是需要按照最佳比例来配置.
而不同的应用不同的数据量会有不同的搭配,这点大家不要看网上的优化配置随便的填写
还是要时时的查看mysql的状态进行调整.即便是这个月调整好的优化参数
到了下个月业务不同,数据量增加,也会需要调整的.

分类: 只谈技术 标签:

一个用nginx后访问网站子目录问题

2008年8月20日 没有评论

今天在做测试环境的时候发现网站的

http://testbbs.thmz.com/uc/ 打得开的

但是

http://testbbs.thmz.com/uc 就打不开,就少一个/

照例说http://testbbs.thmz.com/uc  访问时会自动跳转为 http://testbbs.thmz.com/uc/

但是我这个偏偏就是没有跳转

问了个朋友,他说他的好的,要来配置文件对比着看看,没啥大的区别

最好一个一个调试,结果发现问题出在了

server_name 221.134.22.196 testbbs.thmz.com;

我的conf文件是从以前的机器复制过来的,结果221.134.22.196这个ip忘了改了,导致了这个问题。

另外一直解决方案是做个rewrite,这样即使server_name填错也没关系

             if (-d $request_filename)
             {
                    rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
             }

分类: 只谈技术 标签:

发送Nagios报警到gtalk

2008年8月19日 没有评论

发送Nagios报警到gtalk

Nagios是一个用来监控主机、服务和网络的开放源码软件,很多大的公司或组织都在使用它。Nagios与其他一些开源的网管软件(如CactiOpenNMS)相比,其报警功能是相当强大和灵活的,支持邮件,短信,IM等等报警方式。今天就讲一下如何发送Nagios报警到gtalk

gtalk的服务端使用的是开放的jabber,登录过程通过SSL加密,所以我们需要Net::XMPPIO::Socket::SSL这2个perl package,安装过程不废话了。

在Nagios的command.cfg里定义2个命令:

# ‘host-notify-by-jabber’ command definition
define command{
        command_name    host-notify-by-jabber
        command_line    $USER1$/notify-by-jabber.pl $CONTACTPAGER$ “Host ‘$HOSTALIAS$’ is $HOSTSTATE$ – Info: $HOSTOUTPUT$”
        }# ‘notify-by-jabber’ command definition
define command{
        command_name    notify-by-jabber
        command_line    $USER1$/notify-by-jabber.pl $CONTACTPAGER$ “$NOTIFICATIONTYPE$ $HOSTNAME$ $SERVICEDESC$ $SERVICESTATE$ $SERVICEOUTPUT$ $LONGDATETIME$”
        }

notify-by-jabber.pl 内容如下:

#!/usr/bin/perl -w
#
# script for nagios notify via Jabber / Google Talk Instant Messaging
#   using XMPP protocol and SASL PLAIN authentication.
#
# author: Andrew Elwell <A.Elwell@physics.gla.ac.uk>
# based on work by Thus0 <Thus0@free.fr> and  David Cox
#
# released under the terms of the GNU General Public License v2
# Copyright 2007 Andrew Elwell.

use strict;
use Net::XMPP;

## Configuration
my $username = "your.google.username";
my $password = "your.google.password";
my $resource = "nagios";
## End of configuration

my $len = scalar @ARGV;
if ($len ne 2) {
   die "Usage...\n $0 [jabberid] [message]\n";
}
my @field=split(/,/,$ARGV[0]);
#------------------------------------

# Google Talk & Jabber parameters :

my $hostname = 'talk.google.com';
my $port = 5222;
my $componentname = 'gmail.com';
my $connectiontype = 'tcpip';
my $tls = 1;

#------------------------------------

my $Connection = new Net::XMPP::Client();

# Connect to talk.google.com
my $status = $Connection->Connect(
       hostname => $hostname, port => $port,
       componentname => $componentname,
       connectiontype => $connectiontype, tls => $tls);

if (!(defined($status))) {
   print "ERROR:  XMPP connection failed.\n";
   print "        ($!)\n";
   exit(0);
}

# Change hostname
my $sid = $Connection->{SESSION}->{id};
$Connection->{STREAM}->{SIDS}->{$sid}->{hostname} = $componentname;

# Authenticate
my @result = $Connection->AuthSend(
       username => $username, password => $password,
       resource => $resource);

if ($result[0] ne "ok") {
   print "ERROR: Authorization failed: $result[0] - $result[1]\n";
   exit(0);
}

# Send messages
foreach ( @field ) {
$Connection->MessageSend(
        to       => "$_\@$componentname",
        resource => $resource,
        subject  => "Notification",
        type     => "chat",
        body     => $ARGV[1]);
}

在contacts.cfg里定义联系人pager信息

define contact{
    contact_name        xmb
    use            generic-contact
    alias           xmb
    email         xmb@abc.com
    pager         xmbgoogleuser
}

修改templetes.cfg里关于generic-contact的定义

service_notification_commands   notify-service-by-smtp,notify-by-jabber
host_notification_commands      notify-host-by-smtp,host-notify-by-jabber

最后重启Nagios,搞定!

分类: 只谈技术 标签:

取代低效率order by rand()的方法

2008年8月12日 没有评论

随机取一条数据的一般来讲用SELECT * FROM `table` ORDER BY RAND() LIMIT 1是最方便的,但是order by rand()有个致命的缺点,就是表的索引完全没有作用,在高负载和表数据量大的情况下很容易把mysql拖死。最近在优化论坛无心宠物插件的时候一直卡在了order by rand()。

无心宠物在取怪的时候用了一条order by rand()来选取打怪的怪物。表的数据量不大,但是负载很高,在优化前mysql并发最低值不低于4000经常在5000-6000徘徊。在对sql语句:
select * from {$tablepre}wxnpcdata where (mapid=’$mapid’ and pktime<”.($timestamp-4).”)  or mapid=0 order by rand() limit 1

修改为

SELECT * FROM cdb_wxnpcdata AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(npcid) FROM cdb_wxnpcdata where (mapid=’$mapid’ and pktime<”.($timestamp-4).”)  or mapid=0)-(SELECT MIN(npcid) FROM cdb_wxnpcdata where (mapid=’$mapid’ and pktime<”.($timestamp-4).”)  or mapid=0))+(SELECT MIN(npcid) FROM cdb_wxnpcdata where (mapid=’$mapid’ and pktime<”.($timestamp-4).”)  or mapid=0)) AS id) AS t2 WHERE t1.npcid >= t2.id and (mapid=’$mapid’ and pktime<”.($timestamp-4).”)  or mapid=0 ORDER BY t1.npcid LIMIT 1;

之后mysql负载立刻降到1800左右徘徊,最高2000出头。效果立杆见影

对应SELECT * FROM `table` ORDER BY RAND() LIMIT 1的修改方法是

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

分类: 只谈技术 标签:

xcache和TCMalloc对php和mysql性能提升的评测

2008年8月12日 没有评论

`平时上班基本没有定的下心的时候,晚上么时间不够,加上eswc很久没有双休了,今天终于有机会尝试了一下
环境:centos 5.1/apache 2.2.8/php 5.2.6/mysql 5.0.66a-enterprise-gpl
装了个干净的Discuz 6.1 关闭缓存 测试板块帖子列表显示页面 forumdisplay.php?fid=2&page=1

测试采用本机webbench
首先尝试关闭xcache和TCMalloc情况下的负载能力
采用1客户端10秒
webbench -c 1 -t 10 http://xxx/forumdisplay.php?fid=2\&page=1
成绩如下
Speed=1758 pages/min, 305745 bytes/sec.
Requests: 293 susceed, 0 failed.
Speed=1692 pages/min, 294267 bytes/sec.
Requests: 282 susceed, 0 failed.
Speed=1764 pages/min, 306789 bytes/sec.
Requests: 294 susceed, 0 failed.
Speed=1764 pages/min, 306789 bytes/sec.
Requests: 294 susceed, 0 failed.
Speed=1596 pages/min, 277571 bytes/sec.
Requests: 266 susceed, 0 failed.
 1
采用5客户端10秒
webbench -c 5 -t 10 http://xxx/forumdisplay.php?fid=2\&page=1
成绩如下
Speed=2796 pages/min, 486271 bytes/sec.
Requests: 466 susceed, 0 failed.
Speed=3012 pages/min, 523837 bytes/sec.
Requests: 502 susceed, 0 failed.
Speed=2916 pages/min, 507141 bytes/sec.
Requests: 486 susceed, 0 failed.
Speed=2976 pages/min, 517576 bytes/sec.
Requests: 496 susceed, 0 failed.
Speed=2976 pages/min, 517576 bytes/sec.
Requests: 496 susceed, 0 failed.
 2

下面只打开xcache和关闭TCMalloc情况下的负载能力
采用1客户端10秒
webbench -c 1 -t 10 http://xxx/forumdisplay.php?fid=2\&page=1
成绩如下
Speed=6270 pages/min, 1090457 bytes/sec.
Requests: 1045 susceed, 0 failed.
Speed=6216 pages/min, 1081066 bytes/sec.
Requests: 1036 susceed, 0 failed.
Speed=6222 pages/min, 1082109 bytes/sec.
Requests: 1037 susceed, 0 failed.
Speed=6318 pages/min, 1098805 bytes/sec.
Requests: 1053 susceed, 0 failed.
Speed=6012 pages/min, 1045587 bytes/sec.
Requests: 1002 susceed, 0 failed.

 3

采用5客户端10秒
webbench -c 5 -t 10 http://xxx/forumdisplay.php?fid=2\&page=1
成绩如下
Speed=13368 pages/min, 2324918 bytes/sec.
Requests: 2228 susceed, 0 failed.
Speed=13992 pages/min, 2433442 bytes/sec.
Requests: 2332 susceed, 0 failed.
Speed=14130 pages/min, 2457442 bytes/sec.
Requests: 2355 susceed, 0 failed.
Speed=14034 pages/min, 2439853 bytes/sec.
Requests: 2339 susceed, 0 failed.
Speed=14304 pages/min, 2486660 bytes/sec.
Requests: 2384 susceed, 0 failed.

 4

最后全打开xcache和TCMalloc情况下的负载能力
由于TCMalloc主要是提升mysql在高负载的情况下的性能,所以1客户端就不测试了。我们直接测试5客户端

采用5客户端10秒
webbench -c 5 -t 10 http://xxx/forumdisplay.php?fid=2\&page=1
成绩如下
Speed=14052 pages/min, 2443877 bytes/sec.
Requests: 2342 susceed, 0 failed.
Speed=13914 pages/min, 2417196 bytes/sec.
Requests: 2319 susceed, 0 failed.
Speed=13806 pages/min, 2400200 bytes/sec.
Requests: 2301 susceed, 0 failed.
Speed=13914 pages/min, 2419876 bytes/sec.
Requests: 2319 susceed, 0 failed.
Speed=14028 pages/min, 2439703 bytes/sec.
Requests: 2338 susceed, 0 failed.
5

从结果来看,确实xcache对于提高php的性能是相当显著的,但是并不是提高了就能直接用的,从测试的数据来看,在1客户端打开xcache后虽然性能从1700一跃到了6200,这个结果我想每个人看了都会热血沸腾,但是php的性能提高了必然的给mysql的压力就高了,从图中可以看到mysql的压力从62同样的也一跃到达了289。整个系统的负载虽然没变多少,但是很明显的,在打开xcache的情况下,整体性能得到了大幅度的提升。很明显在应用系统对mysql压力不大的情况下安装xcache会给处理性能带来质的飞跃。但是如果本身压力是在mysql的情况下盲目的上xcache反而会得不偿失。

google-perftools的TCMalloc很明显对与此次的测试压力完全没有发挥优势,TCMalloc是 Thread-Caching Malloc的缩写,相对于与标准的glibc库的malloc相比,在高并发的 mysql上面可以有效的降低系统负载。只是测试的负载太低,看来只能直接上生产系统看效果了。

分类: 只谈技术 标签: , , ,

Nginx的日志回滚

2008年8月12日 没有评论

作者:shunz,出处:http://shunz.net/2008/07/nginx_log_rotation.html

Nginx是一款采用Linux 2.6内核epoll新机制开发的Web服务器软件,能极大地提高Web访问特别是小文件访问的I/O性能,是c10k问题的一个解决方案。有测试称Nginx比Apache效率提高10倍,而从我自己上次的测试来看,其并发性能确实比Apache强不少。Nginx以短小精悍著称,所以虽然一些web核心功能他都支持得挺好,但是一些扩展功能却还不能支持,比如Nginx目前就还不支持通过pipe输出log,所以就不支持利用cronolog来按时间进行日志截断回滚。下面提供一种替代解决方案:

#!/bin/shlog_dir="/var/log/httpd"yesterday=`date +%Y%m%d -d '-1 day'`lastday =`date +%Y%m%d -d '-1 month'`/bin/rm ${log_dir}/access.${lastday}.log/bin/rm ${log_dir}/error.${lastday}.log/bin/mv ${log_dir}/access.log ${log_dir}/access.${yesterday}.log/bin/mv ${log_dir}/error.log ${log_dir}/error.${yesterday}.logkill -USR1 `cat /var/run/nginx.pid`/bin/gzip ${log_dir}/access.${yesterday}.log &/bin/gzip ${log_dir}/error.${yesterday}.log &

然后将该脚本保存在/etc/cron.daily目录里,或者在crontab里每日0点时运行。

分类: 只谈技术 标签: