10月 25

阿里云主机 yum 工具报错处理

试用了阿里云主机系统版本:Centos6.2 x64

安装gcc报错:

# yum install gcc

Error: Package: glibc-headers-2.12-1.80.el6_3.5.x86_64 (updates)
Requires: kernel-headers
Error: Package: glibc-headers-2.12-1.80.el6_3.5.x86_64 (updates)
Requires: kernel-headers >= 2.2.1
You could try using –skip-broken to work around the problem
** Found 1 pre-existing rpmdb problem(s), ‘yum check’ output follows:
kernel-2.6.32-220.13.1.el6.x86_64 has missing requires of kernel-firmware >= (‘0’, ‘2.6.32’, ‘220.13.1.el6’)

解决方法:

# vim /etc/yum.conf 注释
“#exclude=kernel*”

去除检查安装软的依赖

开始安装

# yum clean all

# yum install gcc -y

6月 25

如果我做双色球报表系统性能会如何

  双色球有人中了5.7亿,各种怀疑的声音也此起彼伏。有人说停售到开奖直播中间有一段时间是在算出现概率。我对是否在算并不感兴趣,我倒是想知道,如果在算要用什么样子的服务器

,会有多大压力。实际值2012072期销售349310588元,共174655294注。我用一台很老的dell 2850 来试验,双核3.2主频的单cpu,4G内存,ide接口硬盘。 Centos 5.4 64位系统,mysql5。

  写个脚本产生随机数来模拟彩票投注。根据投注号产生MD5码,取MD5的前两位作为分表依据。
  需要速度,所以开始用C来作,因学艺不精,C写的东西速度很慢,并且也没有找到原因,我将c的代码放在最后,如有朋友能帮忙解决烦请告知。最后还是用python来做。通过初步试验,

产生100万数据并入库需要3分多钟,如果产生1.8亿需要12个多小时。最后决定只产生一张表的数据,一张表数据100万。取MD5前两位,如果每张表都是100万,总共能产生2.56亿注,这个值

可以满足测试要求。

  产生表的SQL如下:

CREATE TABLE `dt_00` ( \
             `Id` int(11) NOT NULL AUTO_INCREMENT, \
             `CreateUnixTime` varchar(13) NOT NULL, \
             `RedBlue` varchar(21) DEFAULT NULL, \
             `HashValues` varchar(32) DEFAULT NULL, \
             `SaleId` int(11) DEFAULT NULL, \
             PRIMARY KEY (`Id`), \
             KEY `i_RedBlue` (`RedBlue`), \
             KEY `i_HashValues` (`HashValues`) \
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  产生投注的脚本如下,因为开始考虑到要放到256张表里,所以就没有做成批量入库,而是做成生成SQL语句,5000条提交一次。:

#!/bin/env python
# ----------------------------------------
# Filename:    rand.py
# Revision:    1.0
# Date:        2012-06-24
# Web:        http://www.simonzhang.net
# Author:      simonzhang
# Email:       simon-zzm@163.com
# ----------------------------------------
import random
import time
import MySQLdb
import hashlib


def mysql_run(sql):
    try:
        db = MySQLdb.connect(host = '192.168.1.41', user = 'double', passwd = 'ball', db = 'doubleball')
        cursor = db.cursor()
    except MySQLdb.Error, e:
        print "Error %d:%s" % (e.args[0], e.args[1])
        exit(1)
    try:
        result_set = ''
        cursor.execute('%s' % sql)
        result_set = cursor.fetchall()
        cursor.close()
        db.close()
        return  result_set
    except MySQLdb.Error, e:
        print "Error %d:%s" % (e.args[0], e.args[1])
        cursor.close()
        db.close()


def create_sql():
    z = 0
    _tmp_di = []
    while (z < 6):
        red = random.randint(1, 33)
        count_rand_di = 0
        if len(_tmp_di) > 0:
            for i in _tmp_di:
                if red == i:
                    count_rand_di += 1
        if count_rand_di == 0:
            _tmp_di.append(red)
            z += 1
    _tmp_di.sort()
    blue = random.randint(1, 16)
    _result_di = ''
    for j in xrange(6):
        if j == 1:
            _result_di = "%s" % _tmp_di[j]
        else:
            _result_di += " %s" % _tmp_di[j]
    _get_md5 = hashlib.md5("%s+%s" % (_result_di, blue)).hexdigest()
    if _get_md5[0:2] == "00":
       _create_sql = "INSERT INTO  dt_00(CreateUnixTime,RedBlue,HashValues) VALUES (\'%s\',\'%s+%s\',\'%s\');" % (int(time.time()), _result_di, blue, _get_md5)
    else:
       _create_sql = ""
    return _create_sql


def write_time():
    _open_file = open("history.txt", "ab")
    get_time = time.localtime()
    _open_file.write("%s-%s-%s %s:%s:%s\n" % (get_time[0], get_time[1], get_time[2], get_time[3], get_time[4], get_time[5]))
    _open_file.close()


def main():
    _get_sql = ''
    for i in xrange(1000000):
        _loop_status = 0
        while _loop_status == 0:
            _tmp_sql = create_sql()
            if len(_tmp_sql) >2:
                _loop_status = 1
        _get_sql += _tmp_sql
        if i % 5000  == 0:
            print i
            mysql_run("%scommit;" % _get_sql)
            _get_sql = ''


if __name__ == "__main__":
    write_time()
    main()
    write_time()

  运行完毕使用sql分组统计,查看分组和排序结果SQL如下,运行一次用时6.693秒。

SELECT
	count(*) AS c,
	RedBlue,
	HashValues
FROM
	dt_00 d
GROUP BY
	d.HashValues
ORDER BY
	c DESC

  结论:因为要保证速度和稳定,所以购买系统应该是各省有各省的一套系统,然后准实时向中心汇数据,所以汇总需要的时间基本可以忽略。统计是按照分表的方式进行计算,然后在合

并结果,从计算效率来看,如果使用Dell R420高配的服务器,即使只有一台,系统也可以在3-5分钟产生出所有的分析报表(这个是估算,因为不知道需要多少统计表,也不知道需要统计的

逻辑)。如果是用oracle数据库应该会更安全快速。

  我写失败的C代码:

#include 
#include 
#include 

/*快速排序*/
void quickSort(int a[],int left,int right)
{
  int i,j,temp;
  i=left;
  j=right;
  temp=a[left];
  if (left>right)
    return;
  while(i!=j)
  {
    while(a[j]>=temp && j>i)
      j--;
    if(j>i)
      a[i++]=a[j];
    while (a[i]<=temp && j>i)
      i++;
    if(j>i)
      a[j--]=a[i];
  }
  a[i]=temp;
  quickSort(a,left,i-1);
  quickSort(a,i+1,right);
}

void main()
{
   int i,z;
   int red,blue;
   int count_rand_di;
   int di[6];
   char result_di[30]="";
   z=0;
   while(z<6)
   {
      srand(time(0)); 
      red=1+(int)(33.0*rand()/(RAND_MAX+1.0));
      count_rand_di=0;
      for(i=0;i

  编译命令:
gcc rand.c -o rand -Wall

参考资料:

http://baike.baidu.com/view/19016.htm

6月 06

linux 两个文件取交集命令

  有两个文件a和b,a中包含b中所有数据。需要找出a文件中包含b文件内容的数据。具体操作如下:
a.txt文件
http://www.simonzhang.net/msg?phone=12320421&msg=hfeaf
http://www.simonzhang.net/msg?phone=13219543&msg=efweff3
http://www.simonzhang.net/msg?phone=12765745&msg=f3fds
http://www.simonzhang.net/msg?phone=12432321&msg=3r2r322
http://www.simonzhang.net/msg?phone=14142142&msg=rgewo3
http://www.simonzhang.net/msg?phone=14212412&msg=iv9e
http://www.simonzhang.net/msg?phone=12321243&msg=e

b.txt文件
12320421
12432321
12321243

  查找a对b的交集命令:grep -f b.txt a.txt
结果如下:
http://www.baidu.com/msg?phone=12320421&msg=hfeaf
http://www.baidu.com/msg?phone=12432321&msg=3r2r322
http://www.baidu.com/msg?phone=12321243&msg=e

举一反三,如果要找差集命令为:grep -v -f b.txt a.txt

4月 16

linux下网络流量突然上涨问题查询

  服务器流量突然上涨,是否客户一下增多了?需要查看一下,因为数据库压力并没有增加。服务器使用的CentOS的系统,所以就用到抓包工具tcpdump。使用命令如下,在eth0的网卡上抓10万个数据包,保存在log.cap中。
# tcpdump -c 100000 -i eth0 -w log.cap &
  执行命令后台运行,并且退掉ssh,这样又避免了复杂的过滤,又不会有大量和ssh客户端的交互。(偷懒的行为)过一段时间,到服务器上把抓好的包拿下来,使用windows的上的wrieshark分析。发现了一个地址有大量连接交互,通过分析包得知,这个地址是个搜索的抓取地址,因为我们有个连接是直接跳转到下载数据包,所以这个抓取每次访问都会把整个数据包下载一边。所以造成网络流量突增。
  使用抓包工具比较麻烦,但是也不能通过统计日志里IP访问的方法来判断。因为下载只是一次访问,日志只有一条记录,所以不能更好反应增长量的问题。

TcpDump
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 数量 ] [ -C 文件尺寸 ] [ -F 文件名 ] [ -i 网络接口 ] [ -m 文件名 ] [ -r 文件名 ] [ -s 长度 ] [ -T 类型 ] [ -w 文件名 ] [ -E algo:secret ] [ 表达式

-a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd   将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。
   -n    不把网络地址转换成名字;
如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就
像这样:eth0 < ntc9.1165> router.domain.net.telnet,
使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。
-nn 不进行端口名称的转换。
上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp

4月 13

nginx 区分移动设备配置

  当期需求,要将来访请求区分开,pc使用页面展示,android和iphone转向相应的页面,配置如下,文中连接只是为了演示:
server {
listen 80;
access_log off;
server_name simonzhang.net www.simonzhang.net ;
modern_browser unlisted;
set $ismob 0;
if ( $http_user_agent ~ “^((.*iPhone.*)|(.*iOS.*)|(.*Safari.*))$”) {
set $ismob 1;
rewrite ^(.*) http://www.simonzhang.net/?page_id=782 break;
}
if ( $http_user_agent ~ “^((.*Android.*))$”) {
set $ismob 1;
rewrite ^(.*) http://www.pixshow.net/robots.txt break;
}
if ( $http_user_agent ~ “^((.*Windows NT.*)|(.*Intel Mac OS.*))$”) {
set $ismob 1;
rewrite ^(.*) http://www.simonzhang.net/ break;
}
rewrite ^(.*) http://www.pixshow.net/ break;
}

注:此类配置并不能百分之百区分出设备,毕竟有写设备还是不守规矩。