发布新日志

  • postfix-postmap命令

    2017-08-22 11:04:37

    1、重建hash表:
    postmap hash:/etc/mail/access
        ==>自动建立 /etc/mail/access.db

    注:sendmail的rpm包中,也有一个makemap命令,也支持重新生成hash表:
    makemap
      hash /etc/mail/access.db < /etc/mail/access

    2、查询某个表:
    postmap -q milter-limit-to-Sum:a@a.com /etc/mail/access
        =>-q参数后面跟的是key,自动查/etc/mail/access.db文件中key=milter-limit-to-Sum:a@a.com的记录

    举例:
    # postmap -q milter-limit-to-Sum:a@a.com /etc/mail/access
    1/1h


        man postmap中-q参数的说明:   
           -q key Search  the  specified  maps  for  key and write the first value found to the standard output stream. The exit status is zero when the requested
                  information was found.

                  If a key value of - is specified, the program reads key values from the standard input stream and writes one line of key value output  for  each
                  key that was found. The exit status is zero when at least one of the requested keys was found.   
                 

    3、删除某个键:
    postmap -d milter-limit-to-Sum:a@a.com /etc/mail/access
        =>-d参数后面跟的是key,删除/etc/mail/access.db文件中key=milter-limit-to-Sum:a@a.com的记录

    举例:
    # postmap -q milter-limit-to-Sum:a@a.com /etc/mail/access
    1/1h
    # postmap -d milter-limit-to-Sum:a@a.com /etc/mail/access
    # postmap -q milter-limit-to-Sum:a@a.com /etc/mail/access
    #


        man postmap中-d参数的说明:   
           -d key Search the specified maps for key and remove one entry per map.  The exit status is zero when the requested information was found.

                  If a key value of - is specified, the program reads key values from the standard input stream. The exit status is zero when at least one of  the
                  requested keys was found.
                 
    4、增加一个键值:
    echo "milter-limit-to-Sum:a@a.com    1/1h" | postmap -i /etc/mail/access
        =>增加"milter-limit-to-Sum:a@a.com    1/1h"键值至/etc/mail/access.db

    举例:
    # echo "milter-limit-to-Sum:a@a.com 1/1h" | postmap -i /etc/mail/access
    # postmap -q milter-limit-to-Sum:a@a.com /etc/mail/access
    1/1h


        man postmap中-i参数的说明:   
           -i     Incremental mode. Read entries from standard input and do not truncate an existing database. By default, postmap(1) creates a new database  from
                  the entries in file_name.
  • linux-mail利用外部邮箱地址发邮件

    2016-09-01 16:12:23

    bin/mail会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,配置比较麻烦,而且会带来不必要的资源占用。
    而通过修改配置文件可以使用外部SMTP服务器,可以达到不使用sendmail而用外部的smtp服务器发送邮件的目的:

    修改/etc/mail.rc
    增加下面的配置(请根据实际替换内容):
    set from=fromUser@domain.com smtp=smtp.domain.comset smtp-auth-user=username smtp-auth-password=password smtp-auth=login

    说明:
    from是发送的邮件地址
    smtp是发生的外部smtp服务器的地址
    smtp-auth-user是外部smtp服务器认证的用户名
    smtp-auth-password是外部smtp服务器认证的用户密码
    smtp-auth是邮件认证的方式

    配置成功后,就可以使用了
    可以发送一封邮件测试一下:
    mail -s "test" user@test.com <content.txt 其中-s后面的是邮件标题,user@sohu.com是收件人地址,content.txt里面是邮件正文

  • php-一个页面响应未完成时,另一页面无法继续操作(session死锁)

    2016-08-18 12:27:31

    php做了一个远程查询的功能,后台处理时间比较久,数据量大时,有可能到几十分钟;

    当PHP 处理大数据量操作时,不能及时操作完成,这时候又有访问其他控制器
    或者
    异步请求时候会造成session 死锁现象
    这时,必须在A页面处理完成后,B页面才可以继续处理;


    处理方案:
    在A页面上增加:session_write_close();
    这样就可以不干扰B页面继续处理了。
  • linux服务器使用tsocks设置代理

    2016-08-17 10:38:17


    一、tosocks介绍:
    官网:
    http://tsocks.sourceforge.net

    tsocks概述:
    SOCKS servers are a form. of proxy that are commonly used in firewalled LAN environments to allow access between networks, and often to the Internet. The problem is that most applications don't know how to gain access through SOCKS servers. This means that network based applications that don't understand SOCKS are very limited in networks they can reach. An example of this is simple 'telnet'. If you're on a network firewalled from the internet with a SOCKS server for outside access, telnet can't use this server and thus can't telnet out to the Internet.
    tsocks' role is to allow these non SOCKS aware applications (e.g telnet, ssh, ftp etc) to use SOCKS without any modification. It does this by intercepting the calls that applications make to establish network connections and negotating them through a SOCKS server as necessary.

    linux上,如果只是做http或ftp的代理,可以简单的设置环境变量:http_proxy、https_proxy、ftp_proxy;
    这里使用tsocks,是为了解决ssh通过代理连接远程服务器

    二、下载安装
    从官网下载最新版本,本文使用的是:tsocks-1.8beta5.tar.gz

    tar xzvf tsocks-1.8beta5.tar.gz
    cd tsocks-1.8
    ./configure
    make && make install

    确认是否存在:/usr/lib/libtsocks.so文件,如果没有,cp -af libtsocks.so.1.8 /usr/lib/libtsocks.so
    注:tsocks-1.8包里的libtsocks.so,只是libtsocks.so.1.8的软链接,复制实际文件过去以免安装目录删除,导致不可用。

    三、配置tsocks
    tar.gz包中有两个配置文件模板:
    tsocks.conf.simple.example
    tsocks.conf.complex.example
    复制一个到/etc/tsocks.conf

    样例:
    # cat /etc/tsocks.conf             
    # This is the configuration for libtsocks (transparent socks)
    # Lines beginning with # and blank lines are ignored
    #
    # The basic idea is to specify:
    #       - Local subnets - Networks that can be accessed directly without
    #                         assistance from a socks server
    #       - Paths - Paths are basically lists of networks and a socks server
    #                 which can be used to reach these networks
    #       - Default server - A socks server which should be used to access
    #                          networks for which no path is available
    # Much more documentation than provided in these comments can be found in
    # the man pages, tsocks(8) and tsocks.conf(8)

    # Local networks
    # For this example this machine can directly access 192.168.0.0/255.255.255.0
    # (192.168.0.*) and 10.0.0.0/255.0.0.0 (10.*)

    local = 192.168.0.0/255.255.0.0
    local = 10.0.0.0/255.0.0.0
    local = 211.211.211.0/255.255.255.224

    # Default server
    # For connections that aren't to the local subnets or to 150.0.0.0/255.255.0.0
    # the server at 192.168.0.1 should be used (again, hostnames could be used
    # too, see note above)

    server = 211.211.211.211 #代理服务器IP
    # Server type defaults to 4 so we need to specify it as 5 for this one
    server_type = 5 #代理服务器使用socks5版本
    # The port defaults to 1080 but I've stated it here for clarity
    server_port = 1080 #代理服务器端口

    default_user = 代理帐号用户名
    default_pass = 代理帐号密码



    这里配置所有的都使用默认的代理服务器
    也可以使用path来指定部分走其他代理服务器,具体参见:tsocks.conf.complex.example模板中的配置及说明;
    模板中:local = 192.168.0.0/255.255.255.0 子网掩码配置错误,应修改为255.255.0.0

    四、使用tsocks
    源码安装的tsocks,默认路径为:/usr/bin/tsocks
    tsocks [application [applications arguments]]
    tsocks [on|off]

    举个实例吧:
    tsocks firefox  #之后在firefox上浏览网页就会默认使用tsocks配置的代理


    source tsocks on #设置当前shell的tsocks
    tsocks show    #查看当前Shell的tsocks设置,LD_PRELOAD="/usr/lib/libtsocks.so";如果LD_PRELOAD为空,表示没设置成功;
    do_something   #这里就能默认使用tsocks的代理去do something了,前面已经设置了
    source tsocks off #关闭当前shell的tsocks代理设置
    tsocks show    #再次查看,LD_PRELOAD="".

    查看/usr/bin/tsocks文件,能发现tsocks on 只是设置LD_PRELOAD环境变量,tsocks off只是去除LD_PRELOAD环境变量的设置;
    所以如果想让所有用户都可以使用tsocks配置,直接在/etc/profile中设置:export LD_PRELOAD="/usr/lib/libtsocks.so"
    再source /etc/profile,让所有用户都生效;


    五、遇到的问题及解决方案
    10:26:43 libtsocks(31015): Need a password in tsocks.conf or $TSOCKS_PASSWORD to authenticate withssh: connect to host 151.151.151.151 port 22: Connection refused
    使用的代理服务器,需要帐号密码进行身份校验,增加default_user及default_pass配置解决;

    10:30:45 libtsocks(31032): SOCKS server 211.211.211.211 (211.211.211.211) is not on a local subnet!
    设置的代理没有与/etc/tsocks.conf文件中的local设置的网络在同一个子网中。配置:local = 211.211.211.0/255.255.255.224解决;

    ERROR: ld.so: object '/usr/lib/libtsocks.so' from LD_PRELOAD cannot be preloaded: ignored.
    .so库文件不存在,从安装包中复制过去:cp -af libtsocks.so.1.8 /usr/lib/libtsocks.so



  • Php两种调用ssh的方法

    2016-08-16 09:18:38

     
    1.用key方式
    public function ssh_cmd($cmd)
    {
        $content = '';
        $host = "192.168.146.180";
       
        $connection = ssh2_connect($host,22,array('hostkey'=>'ssh-rsa'));
        if (!$connection)
            die('Connection failed');
        else
        {
            if(ssh2_auth_pubkey_file($connection, 'root','/root/.ssh/id_rsa.pub','/root/.ssh/id_rsa'))
            {
                $stream = ssh2_exec($connection, $cmd);
                $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

                stream_set_blocking($stream, true);
                stream_set_blocking($errorStream, true);

                if ($stream === FALSE) 
                        die('Command exec failed!');
                else
                        $content = stream_get_contents($stream).stream_get_contents( $errorStream );

                fclose($stream);
                fclose( $errorStream );
            }
            else
            {
                die('Public Key Authentication Failed');
            }
        }
        return $content;
    }

    使用key方式时,需要在php执行服务器上,root用户执行ssh-keygen命令,生成建立安全信任关系的证书。
    [root@Client root]# ssh-keygen -b 1024 -t rsa
    把生成的 /root/.ssh/id_rsa.pub 中的内容,追加到 ssh连接的服务器 /root/.ssh/authorized_keys 文件后;
    php执行服务器上,ssh连接测试:ssh -o GSSAPIAuthentication=no 192.168.146.180
    连接成功,表示安全信任关系配置完成;

    执行php过程中,如果提示:
    Warning: ssh2_auth_pubkey_file(): Authentication failed for root using public key: Unable to open public key file
    表示php执行用户无权限访问/root/.ssh/id_rsa.pub&id_rsa
    解决方法可参照:http://www.php.net/manual/en/function.ssh2-auth-pubkey-file.php

    另外创建一个目录来存放证书信息,如:
    mkdir /home/.ssh
    cp -af /root/.ssh/id_rsa /home/.ssh/      
    cp -af /root/.ssh/id_rsa.pub /home/.ssh/
    chmod 777 /home/.ssh -R
    修改ssh2_auth_pubkey_file中路径位置,再重试;

          
    2.用密码方式

    public function ssh_cmd($cmd)
    {
        $content = '';
        $host = "192.168.146.180";
        $hostuser = "root";
        $sshpasswd = "123456";
        $connection = ssh2_connect($host,22);

        if (!$connection)
                die('Connection failed');
        else
        {
            if(ssh2_auth_password($connection, $hostuser, $sshpasswd))
            {
                $stream = ssh2_exec($connection, $cmd);
                $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);

                stream_set_blocking($stream, true);
                stream_set_blocking($errorStream, true);

                if ($stream === FALSE) 
                        die('Command exec failed!');
                else
                        $content = stream_get_contents($stream).stream_get_contents( $errorStream );

                fclose($stream);
                fclose( $errorStream );
            }
            else
            {
                die('Public Key Authentication Failed');
            }
        }
        return $content;
    }
        
  • tctmgr支持的命令和参数-zt

    2016-07-11 17:45:35

    转自:http://blog.csdn.net/leonzhang2008/article/details/5407051

    tctmgr支持的命令和参数

        tctmgr create [-tl] [-td|-tb|-tt|-tx] path [bnum [apow [fpow]]]   
        创建数据库  
        
        tctmgr inform. [-nl|-nb] path  
        输出数据库的统计信息
       
        tctmgr put [-nl|-nb] [-sx] [-dk|-dc|-dai|-dad] path pkey [cols ...]  
        创建记录  
       
        tctmgr out [-nl|-nb] [-sx] path pkey  
        删除记录 
       
        tctmgr get [-nl|-nb] [-sx] [-px] [-pz] path pkey  
        通过主键查询记录 
       
        tctmgr list [-nl|-nb] [-m num] [-pv] [-px] [-fm str] path  
        输出所有记录
        -pv:显示所有详情;-m num:显示记录条数
       
        tctmgr search [-nl|-nb] [-ord name type] [-m num] [-sk num] [-kw] [-pv] [-px] [-ph] [-bt num] [-rm] [-ms type] path [name op expr ...]  
        通过自定义条件查询记录  
        例:tctmgr search test.tct date NUMBT 1383235200,1385827199 folder STREQ cur
       
        tctmgr optimize [-tl] [-td|-tb|-tt|-tx] [-tz] [-nl|-nb] [-df] path [bnum [apow [fpow]]]  
        优化数据库 
       
        tctmgr setindex [-nl|-nb] [-it type] path name  
        设置索引  
       
        tctmgr importtsv [-nl|-nb] [-sc] path [file]  
        Store records of TSV in each line of a file.  
        #导入TSV
        #tsv文件是以tab分隔的文件,例: key1/tvalue1/n
        例:tchmgr importtsv test.tct tsv.txt   
       
        tctmgr version  
        Print the version information of Tokyo Cabinet. 

       
    附查询条件表达式(前面加~,相当于标准sql中的非)

        STREQ :完全包含字符串,相当于标准sql中的where 字段=‘字符串’
        STRINC :包含此字符串,相当于标准sql中like ‘*字符串*’
        STRBW :以此字符串开头的内容,相当于标准sql中like ‘字符串*’
        STREW :以此字符串结尾的内容,相当于标准sql中like ‘*字符串’
        STRAND :包含在某区间内的内容,如标准sql中like ‘a-z’,那么他只能是a到z的字母
        STROR :不包含在某区间内的内容,如标准sql中like ‘!a-z’,那么他只能是数字或其他的符号
        STRRX :组合式结构,如标准sql中like “a“!b-m”#”
        NUMEQ :数值大小一样 相当于标准sql中 where a=‘1’
        NUMGT :数值大于某一值 相当于标准sql中 where a>‘1’
        NUMGE :数值大于等于某一值 相当于标准sql中 where a>=‘1’
        NUMLT :数值小于某一值 相当于标准sql中 where a<‘1’
        NUMLE :数值小于某一值 相当于标准sql中 where a<=‘1’
        NUMBT :数值处于某一数值区间,相当于标准sql中 where a> 1 and a < 10
        NUMOREQ :数值不处于某一数值的区间,如果是a大于1,小于10的话,那这个表达式右边的内容应该相当于标准sql中 where a< 1 or a > 10
        
  • linux-awk & sed之奇数行与偶数行的打印-zt

    2016-06-16 14:48:33

    转自:http://blog.chinaunix.net/uid-10540984-id-316081.html

    对于这个问题或许大家觉得不难,确实也不是什么太难的问题,首先想到的是对2的取余,诚然,在编程思想里这是一个概念。下面我们看看几个例子。
     
    1. $ cat file
    2. 1
    3. 2
    4. 3
    5. 4
    6. 5
    7. 6
    8. $ awk 'NR%2' file
    9. 1
    10. 3
    11. 5
    12. $ awk '!(NR%2)' file
    13. 2
    14. 4
    15. 6

    [解析]

      这应该是最标准的答案,NR是行号,awk的内建函数,当第一行,NR==1时,对2取余,结果是1,在awk的执行模式里,这个1就是pattern, 为真,执行默认的{print},这个action操作。那么打印出该行,到第2行则余数是0,pattern为0,则为假,不会执行默认的 {print},则不会输出偶数行。就达到了只输出奇数行的效果,反之则输出偶数行了。我们再看看一个更新颖的办法。

    1. $ awk '++i%2' file
    2. 1
    3. 3
    4. 5
    5. $ awk 'i++%2' file
    6. 2
    7. 4
    8. 6

    [解析]

      这行命令充分的利用了C语言中 ++i 与 i++ 的区别,i++ 中i的值自加一次后这个表达式的结果等于1,但此时i的值仍然为0,为什么呢?i的值在当前表达式中不会改变,++i中i的值自加一次后,i的值是1,听 起来很矛盾?确实比较饶口,我们再调用一个C程序来说明例子:

    1. # include <stdio.h>
    2. int main(void)
    3. {
    4.     int i, j, a, b;
    5.     i = j = 0;
    6.     a = i++;
    7.     b = ++j;
    8.     printf ("a = %d , i = %d , b = %d , j = %d\n",a,i,b,j);
    9.     return 0;
    10. }
    11. /*
    12. 运行结果:
    13. a = 0 , i = 1 , b = 1 , j = 1
    14. */

    [解析]

      在这个C语言程序中不难看出,a的值是0,i的值却是1,i++ 是把自加前的值赋予** ++i 不一样。这就可以解释为什么 i++ 输出的是偶数行了,第一行时,因为对2取余的时候 i++ 自加一次后的值是1,但 i++ 是把i的自加前的值去对2取余的,0对2取余结果为0,条件为假,到第二行的时候i的值才是上次自加后的值为1,对2取余数为1,pattern为真,则 输出第2行,以此类推。++i 则是自加后i的值是1,所以输出的奇数行。++i 和 i++ 他们自加的结果都是i为1,但是在赋值和比较的时候,却是有区别的。看到这里我想聪明的您已经明白了它们的区别。我们再看看第三中方法。

     

    1. $ awk 'i=!i' file
    2. 1
    3. 3
    4. 5
    5. $ awk '!(i=!i)' file
    6. 2
    7. 4
    8. 6

    [解析]

      这句还需要我解释吗?阁下想必已经明白其中的奥妙了吧。^_^

     

    1. $ awk 'and(FNR,1)' file
    2. 1
    3. 3
    4. 5
    5. $ awk '!and(FNR,1)' file
    6. 2
    7. 4
    8. 6

    [解析]

      awk里面有三个built-in function,分别是:and(a, b)按位与,or(a, b)按位或,xor(a, b)按位异或,当FNR为1的时候,就是第一行,1的2进制为0001,与0001按位与,得到结果是0001,0001的结果为真,就打印改行,当 FNR为2时二进制表示为0010,那么又与0001相与,结果为0000,条件为假,则不打印。只有当FNR为奇数时,二进制的尾数为1,与0001相 与结果才为真,否则结果都为假。即只输出奇数行,非则输出偶数行。

     

    1. $ sed -n 'p;n' file
    2. 1
    3. 3
    4. 5
    5. $ sed -n 'n;p' file
    6. 2
    7. 4
    8. 6

    [解析]

      sed也不难解释,好好看看手册吧。

     

    1. $ seq 6 | sed -n '1~2p'
    2. 1
    3. 3
    4. 5
    5. $ seq 6 | sed -n '0~2p'
    6. 2
    7. 4
    8. 6

    [解析]

      FIRST~STEP
      This GNU extension matches every STEPth line starting with line FIRST.In particular, lines will be selected when there exists a non-negative N such that the current line-number equals FIRST + (N * STEP).  Thus, to select the odd-numbered lines, one would use`1~2'.



    1. seq 10 | sed '0~3a\=='

    2. seq 10 | awk 'ORS=NR%3?"\n":"\n==\n"

    [解析]

    每隔三行就在后面添加一个分割符。

  • vim查看文件,多了<200b>字符,使用sed进行过滤

    2016-06-12 16:50:05

    vim查看文件,发现多了<200b>字符,使用/200b搜索匹配不上;
    grep 200b 也匹配不上

    查询后才知道:
    200b是:Unicode Character 'ZERO WIDTH SPACE' (U+200B)
    参见:
    http://www.fileformat.info/info/unicode/char/200B/index.htm

    处理方法见:
    http://superuser.com/questions/207207/how-can-i-delete-u200b-zero-width-space-using-sed

    sed 's/\xe2\x80\x8b//g' inputfile

    特做个记录!
  • mysql-使用UDFs对memcache进行操作

    2016-06-08 08:57:51

    UDFs是User Defined Functions的缩写,表示MySQL的用户定义函数,应用程序可以利用这些函数从MySQL 5.0以上版本的数据库中访问Memcached写入或者获取的数据。
    此外,MySQL从5.1版本开始支持触发器,从而可以在触发器中使用UDFs直接更新Mcmcached的内容,这种方式降低了应用程序设计和编写的复杂性。

    安装UDFs需要在数据库服务器上安装两个包,分别是libmemcached和memcached_functions_mysql


    libmemcached下载地址:https://launchpad.net/libmemcached/
    memcached_functions_mysql下载地址:https://launchpad.net/memcached-udfs/+milestones


    安装成功后,登录mysql,可以使用命令查看UDFs:
    PS:示例为1.1版本的memcached_functions_mysql结果;不同版本支持的函数不同。

    mysql> select * from mysql.func;         
    +------------------------------+-----+---------------------------------+----------+
    | name                         | ret | dl                              | type     |
    +------------------------------+-----+---------------------------------+----------+
    | memc_add                     |   2 | libmemcached_functions_mysql.so | function |
    | memc_add_by_key              |   2 | libmemcached_functions_mysql.so | function |
    | memc_servers_set             |   2 | libmemcached_functions_mysql.so | function |
    | memc_server_count            |   2 | libmemcached_functions_mysql.so | function |
    | memc_set                     |   2 | libmemcached_functions_mysql.so | function |
    | memc_set_by_key              |   2 | libmemcached_functions_mysql.so | function |
    | memc_cas                     |   2 | libmemcached_functions_mysql.so | function |
    | memc_cas_by_key              |   2 | libmemcached_functions_mysql.so | function |
    | memc_get                     |   0 | libmemcached_functions_mysql.so | function |
    | memc_get_by_key              |   0 | libmemcached_functions_mysql.so | function |
    | memc_get_cas                 |   2 | libmemcached_functions_mysql.so | function |
    | memc_get_cas_by_key          |   2 | libmemcached_functions_mysql.so | function |
    | memc_delete                  |   2 | libmemcached_functions_mysql.so | function |
    | memc_delete_by_key           |   2 | libmemcached_functions_mysql.so | function |
    | memc_append                  |   2 | libmemcached_functions_mysql.so | function |
    | memc_append_by_key           |   2 | libmemcached_functions_mysql.so | function |
    | memc_prepend                 |   2 | libmemcached_functions_mysql.so | function |
    | memc_prepend_by_key          |   2 | libmemcached_functions_mysql.so | function |
    | memc_increment               |   2 | libmemcached_functions_mysql.so | function |
    | memc_decrement               |   2 | libmemcached_functions_mysql.so | function |
    | memc_replace                 |   2 | libmemcached_functions_mysql.so | function |
    | memc_replace_by_key          |   2 | libmemcached_functions_mysql.so | function |
    | memc_servers_behavior_set    |   2 | libmemcached_functions_mysql.so | function |
    | memc_servers_behavior_get    |   0 | libmemcached_functions_mysql.so | function |
    | memc_behavior_set            |   2 | libmemcached_functions_mysql.so | function |
    | memc_behavior_get            |   0 | libmemcached_functions_mysql.so | function |
    | memc_list_behaviors          |   0 | libmemcached_functions_mysql.so | function |
    | memc_list_hash_types         |   0 | libmemcached_functions_mysql.so | function |
    | memc_list_distribution_types |   0 | libmemcached_functions_mysql.so | function |
    | memc_udf_version             |   0 | libmemcached_functions_mysql.so | function |
    | memc_libmemcached_version    |   0 | libmemcached_functions_mysql.so | function |
    | memc_stats                   |   0 | libmemcached_functions_mysql.so | function |
    | memc_stat_get_keys           |   0 | libmemcached_functions_mysql.so | function |
    | memc_stat_get_value          |   0 | libmemcached_functions_mysql.so | function |
    +------------------------------+-----+---------------------------------+----------+
    34 rows in set (0.00 sec)


    注意:
    memcached_functions_mysql在V1.0以前的版本,函数返回值,默认0表示成功,1表示失败;
    但在V1.0开始,修改了返回值,0表示失败,1表示成功;

    见:
    https://launchpad.net/memcached-udfs/+milestone/version-1.0
    Changelog
    1.0 Thursday, July 30, 2009 12:00:00 EST 2009
     * Fixed issue of setting NULLs with user-defined variables (Thanks to
     Jean-Jacques Moortgat @ aol dot com !)
     * Fixed issue of obtaining a NULL value FROM memcached
     * All set functions now return 0 (failure) or 1 (success)
     * Other cleanups
     * More tests
  • 使用sysbench测试mysql性能

    2016-05-26 15:52:57

    sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。

    它主要包括以下几种方式的测试:

    1、cpu性能

    2、磁盘io性能

    3、调度程序性能

    4、内存分配及传输速度

    5、POSIX线程性能

    6、数据库性能(OLTP基准测试)


    sysbench下载地址:http://downloads.mysql.com/source/sysbench-0.4.12.10.tar.gz

    安装过程:

    tar xzvf sysbench-0.4.12.10.tar.gz 

    cd sysbench-0.4.12.10

    ./configure 

    make

    make install


    确认是否安装成功:

    # sysbench --version

    sysbench 0.4.12.10


    sysbench参数:

    # sysbench

    Missing required command argument.

    Usage:

      sysbench [general-options]... --test=<test-name> [test-options]... command


    General options:

      --num-threads=N             number of threads to use [1]

      --max-requests=N            limit for total number of requests [10000]

      --max-time=N                limit for total execution time in seconds [0]

      --forced-shutdown=STRING    amount of time to wait after --max-time before forcing shutdown [off]

      --thread-stack-size=SIZE    size of stack per thread [32K]

      --init-rng=[on|off]         initialize random number generator [off]

      --seed-rng=N                seed for random number generator, ignored when 0 [0]

      --tx-rate=N                 target transaction rate (tps) [0]

      --tx-jitter=N               target transaction variation, in microseconds [0]

      --report-interval=N         periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports [0]

      --report-checkpoints=[LIST,...]dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. []

      --test=STRING               test to run

      --debug=[on|off]            print more debugging info [off]

      --validate=[on|off]         perform. validation checks where possible [off]

      --help=[on|off]             print help and exit

      --version=[on|off]          print version and exit


    Log options:

      --verbosity=N      verbosity level {5 - debug, 0 - only critical messages} [4]


      --percentile=N      percentile rank of query response times to count [95]


    Compiled-in tests:

      fileio - File I/O test

      cpu - CPU performance test

      memory - Memory functions speed test

      threads - Threads subsystem performance test

      mutex - Mutex performance test

      oltp - OLTP test


    Commands: prepare run cleanup help version


    See 'sysbench --test=<name> help' for a list of options for each test.


    这里进行oltp测试:

    PS:联机事务处理OLTP(on-line transaction processing)主要是执行基本的、日常的事务处理,比如数据库记录的增、删、改、查。


    # sysbench --test=oltp help

    sysbench 0.4.12.10:  multi-threaded system evaluation benchmark


    oltp options:

      --oltp-test-mode=STRING                  test type to use {simple,complex,nontrx,sp} [complex]

      --oltp-reconnect-mode=STRING             reconnect mode {session,transaction,query,random} [session]

      --oltp-sp-name=STRING                    name of store procedure to call in SP test mode []

      --oltp-read-only=[on|off]                generate only 'read' queries (do not modify database) [off]

      --oltp-avoid-deadlocks=[on|off]          generate update keys in increasing order to avoid deadlocks [off]

      --oltp-skip-trx=[on|off]                 skip BEGIN/COMMIT statements [off]

      --oltp-range-size=N                      range size for range queries [100]

      --oltp-point-selects=N                   number of point selects [10]

      --oltp-use-in-statement=N                Use IN-statement with 10 PK lookups per query [0]

      --oltp-simple-ranges=N                   number of simple ranges [1]

      --oltp-sum-ranges=N                      number of sum ranges [1]

      --oltp-order-ranges=N                    number of ordered ranges [1]

      --oltp-distinct-ranges=N                 number of distinct ranges [1]

      --oltp-index-updates=N                   number of index update [1]

      --oltp-non-index-updates=N               number of non-index updates [1]

      --oltp-nontrx-mode=STRING                mode for non-transactional test {select, update_key, update_nokey, insert, delete} [select]

      --oltp-auto-inc=[on|off]                 whether AUTO_INCREMENT (or equivalent) should be used on id column [on]

      --oltp-connect-delay=N                   time in microseconds to sleep after connection to database [10000]

      --oltp-user-delay-min=N                  minimum time in microseconds to sleep after each request [0]

      --oltp-user-delay-max=N                  maximum time in microseconds to sleep after each request [0]

      --oltp-table-name=STRING                 name of test table [sbtest]

      --oltp-table-size=N                      number of records in test table [10000]

      --oltp-dist-type=STRING                  random numbers distribution {uniform,gaussian,special} [special]

      --oltp-dist-iter=N                       number of iterations used for numbers generation [12]

      --oltp-dist-pct=N                        percentage of values to be treated as 'special' (for special distribution) [1]

      --oltp-dist-res=N                        percentage of 'special' values to use (for special distribution) [75]

      --oltp-point-select-mysql-handler=[on|off]Use MySQL HANDLER for point select [off]

      --oltp-point-select-all-cols=[on|off]    select all columns for the point-select query [off]

      --oltp-secondary=[on|off]                Use a secondary index in place of the PRIMARY index [off]

      --oltp-num-partitions=N                  Number of partitions used for test table [0]

      --oltp-num-tables=N                      Number of test tables [1]


    General database options:


      --db-driver=STRING  specifies database driver to use ('help' to get list of available drivers)

      --db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]


    Compiled-in database drivers:

      mysql - MySQL driver


    mysql options:

      --mysql-host=[LIST,...]       MySQL server host [localhost]

      --mysql-port=N                MySQL server port [3306]

      --mysql-socket=STRING         MySQL socket

      --mysql-user=STRING           MySQL user [sbtest]

      --mysql-password=STRING       MySQL password []

      --mysql-db=STRING             MySQL database name [sbtest]

      --mysql-table-engine=STRING   storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated} [innodb]

      --mysql-engine-trx=STRING     whether storage engine used is transactional or not {yes,no,auto} [auto]

      --mysql-ssl=[on|off]          use SSL connections, if available in the client library [off]

      --myisam-max-rows=N           max-rows parameter for MyISAM tables [1000000]

      --mysql-create-options=STRING additional options passed to CREATE TABLE []

      

    常用的参数列表


    --mysql-host=test.mysql.rds.aliyuncs.com #数据库host 

    --mysql-port=3306 #数据库端口 

    --mysql-user=your_username #数据库用户名 

    --mysql-password=your_password #数据库密码 

    --mysql-db=your_db_for_test #数据库名 

    --mysql-table-engine=STRING   storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated},默认存储引擎为[innodb]

    --oltp-tables-count=10 #模拟的表的个数,规格越高该值越大 

    --oltp-table-size=6000000 #模拟的每张表的行数,规格越高该值越大 

    --oltp-table-name=sbtest #测试表名,默认为[sbtest]

    --num-threads=50 #模拟的并发数量,规格越高该值越大 

    --max-requests=100000000 #最大请求次数 

    --max-time=20 #最大测试时间(与--max-requests只要有一个超过,则退出) 

    --report-interval=1 #每1秒打印一次当前的QPS等值 

    --test=oltp #OLTP基准测试

    [prepare | run | cleanup] #prepare准备数据,run执行测试,cleanup清理数据


    测试样例:


    准备数据:

    sysbench --test=oltp --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=postfix --mysql-password=postfix --mysql-db=test --oltp-table-size=4000000 --oltp-table-name=yuntest --max-requests=100000 --num-threads=300 --mysql-table-engine=myisam prepare


    执行测试:

    sysbench --test=oltp --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=postfix --mysql-password=postfix --mysql-db=test --oltp-table-size=4000000 --oltp-table-name=yuntest --max-requests=100000 --num-threads=300 --mysql-table-engine=myisam run


    测试结果:

    # time sysbench --test=oltp --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=postfix --mysql-password=postfix --mysql-db=test --oltp-table-size=4000000  --oltp-table-name=yuntest --max-requests=100000 --num-threads=300 --mysql-table-engine=myisam run

    sysbench 0.4.12.10:  multi-threaded system evaluation benchmark


    No DB drivers specified, using mysql

    Running the test with following options:

    Number of threads: 300

    Random number generator seed is 0 and will be ignored


    Doing OLTP test.

    Running mixed OLTP test

    Using Special distribution (12 iterations,  1 pct of values are returned in 75 pct cases)

    Using "LOCK TABLES WRITE" for starting transactions

    Using auto_inc on the id column

    Maximum number of requests for OLTP test is limited to 100000

    Using 1 test tables

    Threads started!

    Done.


    OLTP test statistics:

        queries performed:

            read:                            1400000

            write:                           500000

            other:                           200000

            total:                           2100000

        transactions:                        100000 (455.68 per sec.)

        deadlocks:                           0      (0.00 per sec.)

        read/write requests:                 1900000 (8657.91 per sec.)

        other operations:                    200000 (911.36 per sec.)


    General statistics:

        total time:                          219.4526s

        total number of events:              100000

        total time taken by event execution: 65719.8341

        response time:

             min:                                 39.30ms

             avg:                                657.20ms

             max:                                763.08ms

             approx.  95 percentile:             685.38ms


    Threads fairness:

        events (avg/stddev):           333.3333/0.47

        execution time (avg/stddev):   219.0661/0.19


    清理数据:

    sysbench --test=oltp --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=postfix --mysql-password=postfix --mysql-db=test --oltp-table-size=4000000 --oltp-table-name=yuntest --max-requests=100000 --num-threads=300 --mysql-table-engine=myisam cleanup

  • 通过telnet连接查看memcache服务器-zt

    2016-05-23 14:57:08


    memcache作为一款优秀的进程外缓存,常常被运用于高并发系统架构中。这里主要谈谈怎么通过telnet工具,查看memcache运行状况并对其key进行管理维护。

    1、启动memcache

    [root@localhost ~]# /usr/local/bin/memcached -u root -m 1024 -p 11211 -u postfix -l 127.0.0.1 -M -v -c 4096

    启动参数详解

    -d:以守护进程方式启动。如果该参数没有指定,当按ctrl+c命令结束,memcache自动关闭
    -m:分配给memcache使用的最大内存数 单位是m,默认是64m
    -u: 指定运行memcache的用户
    -l: 指定监听的ip地址
    -p: 指定监听的tcp端口号,可以通过-u指定udp端口.默认是11211
    -c: 最大并发连接数
    -P: 报错进程id的文件
    memcache 启动之后,我们就可以通过telnet连接memcache,对其进行简单操作管理。

    2、telnet连接memcache

    [root@localhost ~]# telnet 192.168.119.70 11211
    Trying 192.168.119.70...
    Connected to 192.168.119.70 (192.168.119.70).
    Escape character is '^]'.

    连接成功之后,即可对memcache进行操作管理了,常用的命令有:

    Ⅰ、添加修改

    命令格式:<command> <key> <flags> <exptime> <bytes>\r\n<data block>\r\n

       <command>:add, set或 replace
       <key> :缓存的名字
       <flag>:16位无符号整数,和key要存储的数据一起存储,并在程序get缓存时,返回。
       <exptime>:过去时间,0 表示永远不过期,如果非零,表示unix时间或距此秒数
       <bytes>:存储数据的字节数
        \r\n: 表示换行回车

        命令结果:
                STORED :表示成功
                NOT_STORED : 表示失败

    a)、添加缓存

    add id 1 0 4 
    1234 
    STORED

    如果key已经存在,则会添加失败。

    b)、修改缓存

    replace id 1 0 4 
    3456 
    STORED 

    key存在时,成功;不存在时,失败。

    c)、设置缓存

    set id 1 0 4 
    2345 
    STORED

    key不存在时,添加【add】;已存在时,替换【replace】。
    注意:字节数必须和你要存储的数据保持一致,不然回报 CLIENT_ERROR bad data chunk 错误

    Ⅱ、读取

       命令格式:get <key>+\r\n
       <key>+:表示一个或多个key,多个key时,用空格隔开

    a)、读取单个key的缓存

    get id 
    VALUE id 1 4 
    1234 
    END 

    b)、读取多个key的缓存

    get id name 
    VALUE id 1 4 
    3456 
    VALUE name 1 3 
    jim 
    END 

    Ⅲ、删除

    命令格式:delete <key> \r\n
    <key>:要删除的key
    删除id

    delete id  
    DELETED

    Ⅳ、清空所有缓存

    命令格式:flush_all

    flush_all 
    OK

    Ⅴ、查看缓存服务器状态

    命令:stats

    stats 
    STAT pid 2711     //进程id 
    STAT uptime 2453  //总的运行时间,单位描述 
    STAT time 1344856333  //当前时间 
    STAT version 1.4.0 //版本 
    STAT pointer_size 32    //服务器指针位数,一般32位操作系统是32 
    STAT rusage_user 0.002999  //进程的累计用户时间  
    STAT rusage_system 1.277805  //进程的累计系统事件 
    STAT curr_connections 1  //当前连接数 
    STAT total_connections 11  //服务器启动后,总连接数 
    STAT connection_structures 11  //连接结构的数量 
    STAT cmd_get 17   //总获取次数 
    STAT cmd_set 1  //总写入次数 
    STAT cmd_flush 1   //总的的清空次数 
    STAT get_hits 1  //总的命中次数 
    STAT get_misses 7   //获取没有命中次数 
    STAT delete_misses //删除没有命中次数 
    STAT delete_hits 4   //删除命中次数 
    STAT incr_misses //递增操作没有命中次数  
    STAT incr_hits //递增操作命中次数 
    STAT decr_misses //递减操作没有命中的次数 
    STAT decr_hits //递减操作命中的次数 
    STAT cas_misses //cas设置没有命中次数 
    STAT cas_hits //cas命中次数 
    STAT cas_badval //cas操作找到key,但版本过期,没有设置成功 
    STAT bytes_read 455    //总共获取数据量 
    STAT bytes_written 1175  //总共写入数据量 
    STAT limit_maxbytes 1048576  //最大允许使用内存,单位字节 
    STAT accepting_conns 1     
    STAT listen_disabled_num 0 
    STAT threads 5   //当前线程数 
    STAT conn_yields 0 
    STAT bytes 56      //已用缓存空间 
    STAT curr_items 1  //当前缓存的keyvalue数 
    STAT total_items 7 //总共缓存的keyvalue数,包括过期删除的 
    STAT evictions //通过删除keyvalue,释放内存次数 
    END 

    Ⅵ、打印版本

    命令:version

    version 
    VERSION 1.4.0 

    Ⅶ、打印内存信息

    命令:stats slabs

    stats slabs 
    STAT 1:chunk_size 80 
    STAT 1:chunks_per_page 13107 
    STAT 1:total_pages 1 
    STAT 1:total_chunks 13107 
    STAT 1:used_chunks 1 
    STAT 1:free_chunks 1 
    STAT 1:free_chunks_end 13105 
    STAT 1:get_hits 10 
    STAT 1:cmd_set 10 
    STAT 1:delete_hits 4 
    STAT 1:incr_hits 0 
    STAT 1:decr_hits 0 
    STAT 1:cas_hits 0 
    STAT 1:cas_badval 0 
    STAT active_slabs 1 
    STAT total_malloced 1048560 
    END

    3、退出telnet
    quit


  • linux 使用FIO测试磁盘iops

    2016-05-20 18:16:32

    具体内容参见:
    http://blog.itpub.net/26855487/viewspace-754346/

    千万注意:
    样例中的:-filename=/dev/sdb1
    filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘下的data文件。

    写测试时,使用/dev/sdb1,表示直接往裸设备上写数据,容易造成设备损坏,IO出错!!!重格才能恢复!!!

    一定要选择测试的盘的data文件,如:/mail/data!!!
  • linux-使用parted来进行分区

    2016-05-18 14:07:35

    通常我们用的比较多的一般都是fdisk工具来进行分区,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大;

    而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘。

    但是现在的磁盘空间很多都已经是远远大于2T了,如我们今天例子中的4.7T,那要怎么办能,有两个方法,其一是通过卷管理来实现,其二就是通过我们今天谈到的Parted工具来实现对GPT磁盘进行分区操作。


    fdisk显示例子:

    # fdisk -l


    WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.


    Disk /dev/sdb: 4798.6 GB, 4798552211456 bytes

    255 heads, 63 sectors/track, 583390 cylinders

    Units = cylinders of 16065 * 512 = 8225280 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disk identifier: 0x00000000


       Device Boot      Start         End      Blocks   Id  System

    /dev/sdb1               1      267350  2147483647+  ee  GPT



    # parted  /dev/sdb

    GNU Parted 2.1

    Using /dev/sdb

    Welcome to GNU Parted! Type 'help' to view a list of commands.

    (parted) mklabel gpt

    将MBR磁盘格式化为GPT


    (parted) mkpart primary 0 100

    划分一个起始位置为0,大小为100M的主分区


    (parted) mkpart primary 100 200

    划分一个起始位置为100M,大小为100M的主分区


    (parted) mkpart primary 0 -1

    划分所有空间到一个分区


    (parted)  print

    打印当前分区


    (parted)  quit


    可能还会用到的一些命令


    (parted) mklable msdos

    如果要反过来.将GPT磁盘转化为MBR磁盘


    在这样分完分区后,还要使用mkfs.ext4来进行格式化:

    # mkfs.ext4 -F /dev/sdb1


    格式化后可以直接挂载使用:

    mount -t ext4 /dev/sdb1 /mail


    当然也可以增加到/etc/fstab中


    命令行的模式:

    将硬盘转化为GPT磁盘后,执行下列命令

    parted /dev/sdb mkpart primary 0 100 ##划分一个起始位置为0大小为100M的主分区

  • JAVA内存分析之- MAT(Memory Analyzer Tool)工具入门介绍

    2016-04-08 16:29:12

    参考:http://blog.csdn.net/fenglibing/article/details/6298326

    1.MAT是什么?
        MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具。
        它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
     
    2.为什么使用MAT?
        当服务器应用占用了过多内存的时候,会遇到OutOfMemoryError。如何快速定位问题呢?Eclipse MAT的出现使这个问题变得非常简单。它能够离线分析dump的文件数据。
        Eclipse MAT是SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。它可比Sun提供的内存镜像分析工具jhat要强太多了。
    3.安装MAT

    下载页:
    http://www.eclipse.org/mat/

    插件更新地址:
    http://download.eclipse.org/mat/1.5/update-site/

    使用Eclipse Marketplace安装:
    Eclipse -> Help -> Eclipse Marketplace -> Memory Analyzer 1.5.0

    4.使用MAT
    先调用jdk的工具得到heap使用情况:

    我安装的是jdk1.8
    # java -version
    java version "1.8.0_77"
    Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
    Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

    调用jdk工具jps查看当前的java进程:
    # jps
    26233 Bootstrap
    28014 Jps

    调用jmap工具得到信息:
    # jmap -dump:format=b,file=heap.bin 26233
    Dumping heap to /tmp/heap.bin ...
    Heap dump file created

    用eclipse的file---->open打开这个文件
    这里可以选择查看
    1、内存泄露报表,自动检查可能存在内存泄露的对象,通过报表展示存活的对象以及为什么他们没有被垃圾收集;
    2、对象报表,对可疑对象的分析,如字符串是否定义重了,空的collection、finalizer以及弱引用等。


  • JProfiler9.1远程监控Tomcat-yc

    2016-04-08 15:00:56

    一、下载安装JProfiler

    9.1.1版本:

    Windows-x64下载地址:

    http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_windows-x64_9_1_1.exe

    根据提示安装即可;

     

    linux下载地址:

    http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_linux_9_1_1.rpm

    安装:rpm -ivh jprofiler_linux_9_1_1.rpm

    安装后,会生成目录:/opt/jprofiler9

     

    注意:windowslinux两个安装包的版本需要一致,否则远程连接时,会提示版本不匹配!

     

    注册码:

    L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257(亲测可用)

    L-Larry_Lau@163.com#5481-ucjn4a16rvd98#6038

    L-Larry_Lau@163.com#99016-hli5ay1ylizjj#27215

    L-Larry_Lau@163.com#40775-3wle0g1uin5c1#0674

    L-Larry_Lau@163.com#7009-14frku31ynzpfr#20176

    L-Larry_Lau@163.com#49604-1jfe58we9gyb6#5814

    L-Larry_Lau@163.com#25531-1qcev4yintqkj#23927

    L-Larry_Lau@163.com#96496-1qsu1lb1jz7g8w#23479

    L-Larry_Lau@163.com#20948-11amlvg181cw0p#171159

    二、配置JProfiler生成脚本

    在本机配置JProfiler生成startup_jprofiler.sh脚本,生成方式如下:

    运行JProfiler,弹出提示对话框:

    这里使用的是Apache Tomcat 8.x

    远程服务器JProfiler的安装路径,默认在/opt/jprofiler9

    tomcatstartup.sh脚本,从远程服务器上把tomcatbin目录下的startup.sh复制到本地,再选择本地的路径


    Finish后,会在Start Center显示刚创建的Session

    上传脚本

    把生成出的startup_jprofiler.sh(在选择的startup.sh目录中)文件上传到远程tomcatbin目录下

    chmod +x startup_jprofiler.sh(脚本赋写权限)

     

    启动脚本

    ./startup_jprofiler.sh,然后就可以再本地远程访问了

     

    对比startup.shstartup_jprofiler.sh

    #################################################################

    [root@localhost bin]# diff startup.sh startup_jprofiler.sh 

    60c60,69

    < exec "$PRGDIR"/"$EXECUTABLE" start "$@"

    ---

    >  

    > # The following lines have been added by the

    > # application server integration wizard of JProfiler

    >  

    > CATALINA_OPTS="-agentpath:/opt/jprofiler9/bin/linux-x64/libjprofilerti.so=port=8849,nowait $CATALINA_OPTS"

    > export CATALINA_OPTS

    >  

    > # end of modifications

    >  

    > exec "$PRGDIR"/"$EXECUTABLE" run "$@"

    #################################################################

     

    startup_jprofiler.sh只多了下面两行:

    CATALINA_OPTS="-agentpath:/opt/jprofiler9/bin/linux-x64/libjprofilerti.so=port=8849,nowait $CATALINA_OPTS"

    export CATALINA_OPTS

     

    三、启动Session

    初始化profiling设置,这里选择所有功能

    可以开始jprofiler分析了。