邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

关于mysql的基准测试之mysqlslap和sysbench

mysql基准测试工作之 - mysqlslap

常用参数说明
--atuo-generate-sql 由系统自动生成sql脚本进行测试
--auto-generate-sql-add-autoincrement 在生成的表中增加自增ID
--auto-generate-sql-load-type 指定测试中使用的查询类型
--auto-generate-sql-write-number 指定初始化数据时生成的数据量
--concurrency 指定并发线程的数量
--engine指定要测试表的存储引擎,可以用逗号分割多个存储引擎
--no-drop 指定不清理测试数据
--iterations 指定测试运行的次数
--number-of-queries 指定每一个线程执行的查询数量
--debug-info 指定输出额外的内存以及cpu统计信息

--number-int-cols 指定测试表中包含的INT类型列的数量
--number-char-cols 指定测试表中包含的varchar类型列的数量

--create-schema 指定了用于执行测试的数据库的名字
--query 用于指定自定义SQL的脚本
--only-print 并不运行测试脚本,而是把生成的脚本打印出来


mysql基准测试工作之 - sysbench

安装说明
https://github.com/akopytov/sysbench/archive/0.5.zip
unzip sysbench-0.5.zip
./autogen.sh
./configue --with-mysql-includes=/usr/local/mysql/include/ --with-mysql-libs=/usr/local/mysql/lib/
make && make install
常用参数说明
--test 用于指定所要执行的测试类型,支持以下测试
Fileio 文件系统I/O性能测试
cpu cpu性能测试
memory 内存性能测试
oltp 测试要指定具体的lua脚本 //lua脚本位于sysbench-0.5/sysbench/tests/db
--mysqldb 用于指定执行基准测试的数据库名字
--mysql-table-engine 用于指定所使用的的存储引擎
--oltp-tables-count 执行测试的表的数量
--oltp-tables-size 执行每个表中的数据行数
--num-threads 指定测试的并发线程数量
--max-time 指定最大的测试时间
--report-interval 指定间隔多长时间输出一次统计信息

--mysql-user 指定执行测试的mysql用户
--mysql-password 指定执行测试的mysql用户的密码

prepare 用于准备测试数据
run 用于实际进行测试
cleanup 用于清理测试数据


mysql常用存储引擎以及简单介绍
1.MyISAM
    特性
        并发性与锁级别
        表损坏修复
        check table tablename
        repair table tablename     
        MyISAM表支持的索引类型
        MyISAM表支持数据压缩
        命令行:myisampack //压缩就只能进行读操作
    使用场景
        非事务型应用
        只读类应用(支持压缩)
        空间类应用
2.Innodb
    特性
        事务型存储引擎
        完全支持事务的ACID特性
        Redo Log 和 Undo Log
        支持行级锁
            行级锁可最大程度的支持并发
            行级锁是有存储引擎层实现的
3.csv
    特点
        以CSV格式进行数据存储
        所有列必须都是不能为null的
        不支持索引
        可以对数据文件直接编辑
    文件系统存储特点
        数据以文本方法存储在文件中
        .csv文件存储表内容
        .csm文件存储表的元数据如表状态和数据量
        .frm文件存储表结构信息
    适用场景
        适合做为数据交换的中间表  电子表格-》CSV文件 -》mysql数据目录
4.Archive 
    文件系统存储特点
        以ZLIB对表数据进行压缩,磁盘I/O更少
        数据存储在ARZ为后缀的文件中
    特点
        只支持select 和insert操作
        只支持在自增id上建立索引
    使用场景
        日志和数据采集类应用
5.Memory
    文件系统存储特点
        也称HEAP存储引擎,所以数据保存在内存中,只有.frm文件
    功能特点
        支持hash索引(等值查找)和Btree索引(范围查找)
        所有字段都为固定长度 varchar(10) = char(10)
        不支持BLOG和TEXT等大字段
        使用表级锁
        最大大小是由max_heap_table_size参数决定
        create index idx_c1 on mymemory(c1);
        create index idx_c2 using  btree on mymemory(c2);
    使用场景
        用于查找或者是映射表,例如邮编和地区的对应表
        用于保存数据分析中产生的中间表
        用户缓存周期性聚合数据的结果表
6.Federated
    特点
        提供了访问远程Mysql服务器上表的方法
        本地不存储数据,数据全部放到远程服务器上
        本地需要保存表结构和远程服务器的连接信息
    如何使用
        默认禁止,启用需要在启动时增加federated参数
        mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name
    使用场景
        偶尔的统计分析与手工查询
php发送与接收流文件方法
<?php  
/** php 发送流文件 
* @param  String  $url  接收的路径 
* @param  String  $file 要发送的文件 
* @return boolean 
*/  
function sendStreamFile($url, $file){  
    if(file_exists($file)){  
        $opts = array(  
            'http' => array(  
                'method' => 'POST',  
                'header' => 'content-type:application/x-www-form-urlencoded',  
                'content' => file_get_contents($file)  
            )  
        );  
        $context = stream_context_create($opts);  
        $response = file_get_contents($url, false, $context);  
        $ret = json_decode($response, true);  
        return $ret['success'];  
    }else{  
        return false;  
    }  
}  
  
$ret = sendStreamFile('http://localhost/receiveStreamFile.php', 'send.txt');  
var_dump($ret);  


/** php 接收流文件 
* @param  String  $file 接收后保存的文件名 
* @return boolean 
*/  
function receiveStreamFile($receiveFile){  
    $streamData = file_get_contents('php://input');  
    if($streamData!=''){  
        $ret = file_put_contents($receiveFile, $streamData, true);  
    }else{  
        $ret = false;  
    }  
    return $ret;  
}  
$receiveFile = 'receive.txt';  
$ret = receiveStreamFile($receiveFile);  
echo json_encode(array('success'=>(bool)$ret));  
?>  
关于php类的析构函数


<?php
	class A
	{
		public $name = 'xd';
		function __construct($test='test'){
			echo 'construct->'.$test.'<br>';
		}
		function __destruct(){
			echo 'destruct->'.$this->name.'<br>';
		}
	}
	$a = new A('a');
	$a = null;
	$b = new A('b');
	echo 'helloxd';
?>



<!-- 

上面的结果是:
construct->a
destruct->xd
construct->b
111destruct->xd 

如果把$a = null;去掉

construct->a
construct->b
111 destruct->xd
destruct->xd


ps:析构函数会在程序执行完毕之后进行调用,如果把new类的变量设置为null(重新赋值一样),可以触发析构函数的调用
-->

进程、线程和协程的异同

首先,给出“进程、线程和协程”的特点:

  • 进程:拥有自己独立的堆和栈,既不共享堆,也不共享栈,进程由操作系统调度;
  • 线程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,标准线程由操作系统调度;
  • 协程:拥有自己独立的栈和共享的堆,共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

接下来,以一个形象的例子,进一步讲述“进程、线程和协程”三者之间的异同:

假设有一个单核的操作系统,系统上没有其它的程序需要运行,现有两个线程 A 和 B,A 和 B 在单独运行时都需要 10 秒来完成自己的任务,而且任务都是运算操作,线程 A 和 B 之间没有竞争和共享数据的问题。现在让 A 和 B 两个线程并行,则操作系统会不停的在 A 和 B 两个线程之间切换,达到一种伪并行的效果。

如果操作系统切换的频率是每秒一次,切换的成本是 0.1 秒(主要是栈切换),则总共需要 20 + 19 * 0.1 = 21.9 秒;如果使用协程的方式,可以先运行协程 A,A 结束的时候让位给协程 B,只发生一次切换,则总共需要 20 + 1 * 0.1 = 20.1 秒。如果操作系统是双核的,而且线程是标准线程,那么线程 A 和 B 可以达到真的并行,则总时间为 10 秒;而协程的方式仍然需要 20.1 秒的时间。

原文:http://blog.csdn.net/qq_35246620/article/details/62887604

常用sql语句整理

增加一张表
CREATE TABLE `table_name`(
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

增加记录
INSERT INTO `your_table_name`(`column_name`)
VALUES
('your_value_one'),
('your_value_two');

增加字段
ALTER TABLE `your_table_name`
ADD `your_column_name` ...
AFTER `column_name`;

增加索引
主键
ALTER TABLE `your_table_name`
ADD PRIMARY KEY your_index_name(your_column_name);

唯一索引
ALTER TABLE `your_table_name`
ADD UNIQUE your_index_name(your_column_name);

普通索引
ALTER TABLE `your_table_name`
ADD INDEX your_index_name(your_column_name);

全文索引
ALTER TABLE `your_table_name`
ADD FULLTEXT your_index_name(your_column_name);


逐行删除
DELETE FORM `table_name`
WHERE ...;
清空整张表
TRUNCATE TABLE `your_table_name`;

删除表
DROP TABLE `your_table_name`;

删除字段
ALTER TABLE `your_table_name`
DROP `column_name`;

删除索引
ALTER TABLE `your_table_name`
DROP INDEX your_index_name(your_column_name);


变更数据
UPDATE `table_name`
SET column_name=your_value
WHERE ...;

变更字段
ALTER TABLE `your_table_name`
CHANGE `your_column_name` `your_column_name` ...(变更);

变更字段值为另一张表的某个值
UPDATE `your_table_name`
AS a
JOIN `your_another_table_name`
AS b
SET a.column = b.another_column
WHERE a.id = b.a_id...;


普通查询
SELECT `column_name_one`, `column_name_two`
FROM `table_name`;

关联查询
SELECT *
FROM `your_table_name`
AS a
JOIN `your_anther_table_name`
AS b
WHERE a.column_name = b.column_name...;

合计函数条件查询:WHERE 关键字无法与合计函数一起使用
SELECT aggregate_function(column_name)
FROM your_table_name
GROUP BY column_name
HAVING aggregate_function(column_name)...;

同一个实例下跨库查询
SELECT *
FROM database_name.your_table_name
AS a
JOIN anther_database_name.your_anther_table_name
AS b
WHERE a.column_name = b.column_name...;

复制一张表结构
CREATE `your_table_name`
LIKE `destination_table_name`;

完全复制一张表:表结构+全部数据
CREATE `your_table_name`
LIKE `destination_table_name`;
INSERT INTO `your_table_name`
SELECT *
FROM `destination_table_name`;

附录:mysql常用命令
登陆: mysql -h host -u username -p
列出数据库:SHOW DATABESES;
列出表:SHOW TABLES;
表结构:DESC table_name;
使用一个数据库:USE database_name;
导入:source 'file';
导出:mysqldump -h 127.0.0.1 -u root -p "database_name" "table_name" --where="condition" > file_name.sql;
nginx限制某个IP同一时间段的访问次数(转)
坑说明
公司内有好几个网段,测试那边在测试的时候偶尔会出现503,我这边切换了几个网,有的可以正常访问范围,有的是出现503,访问html文件也是如此,最后查看服务器的nginx配置,发现了一些参数,原来是nginx限制某个IP同一时间段的访问次数

相关资料

HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令
这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制
HttpLimitReqModul 限制某一段时间内同一ip访问数实例
http{
    ...

    #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
    #以$binary_remote_addr 为key,限制平均每秒的请求为20个,
    #1M能存储16000个状态,rete的值必须为整数,
    #如果限制两秒钟一个请求,可以设置成30r/m

    limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
    ...
    server{
        ...
        location {
            ...

            #限制每ip每秒不超过20个请求,漏桶数burst为5
            #brust的意思就是,如果第1秒、2,3,4秒请求为19个,
            #第5秒的请求为25个是被允许的。
            #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
            #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
            #第1秒25个请求时,5个请求放到第2秒执行,
            #设置nodelay,25个请求将在第1秒执行。

            limit_req zone=allips burst=5 nodelay;
            ...
        }
        ...
    }
    ...
}
HttpLimitZoneModule 限制并发连接数实例
limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域
http{
    ...

    #定义一个名为one的limit_zone,大小10M内存来存储session,
    #以$binary_remote_addr 为key
    #nginx 1.18以后用limit_conn_zone替换了limit_conn
    #且只能放在http作用域
    limit_conn_zone   one  $binary_remote_addr  10m;  
    ...
    server{
        ...
        location {
            ...
           limit_conn one 20;          #连接数限制

           #带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
           limit_rate 500k;            

            ...
        }
        ...
    }
    ...
}

nginx白名单设置
以上配置会对所有的ip都进行限制,有些时候我们不希望对搜索引擎的蜘蛛或者自己测试ip进行限制,
对于特定的白名单ip我们可以借助geo指令实现。
http{
     geo $limited{
        default 1;
        #google 
        64.233.160.0/19 0;
        65.52.0.0/14 0;
        66.102.0.0/20 0;
        66.249.64.0/19 0;
        72.14.192.0/18 0;
        74.125.0.0/16 0;
        209.85.128.0/17 0;
        216.239.32.0/19 0;
        #M$
        64.4.0.0/18 0;
        157.60.0.0/16 0;
        157.54.0.0/15 0;
        157.56.0.0/14 0;
        207.46.0.0/16 0;
        207.68.192.0/20 0;
        207.68.128.0/18 0;
        #yahoo
        8.12.144.0/24 0;
        66.196.64.0/18 0;
        66.228.160.0/19 0;
        67.195.0.0/16 0;
        74.6.0.0/16 0;
        68.142.192.0/18 0;
        72.30.0.0/16 0;
        209.191.64.0/18 0;
        #My IPs
        127.0.0.1/32 0;
        123.456.0.0/28 0; #example for your server CIDR
    }


 geo指令定义了一个白名单$limited变量,默认值为1,如果客户端ip在上面的范围内,$limited的值为0

2.使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真是的ip,这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问

map $limited $limit {
1 $binary_remote_addr;
0 "";
}

3.设置limit_req_zone和limit_req
limit_req_zone $limit zone=foo:1m rate=10r/m;
limit_req zone=foo burst=5;

最后我们使用ab压php-fpm的方式,对上面的方法效果实际测试下

例1:限制只允许一分钟内只允许一个ip访问60次配置,也就是平均每秒1次
首先我们准备一个PHP脚本放在根目录下$document_root
test.php
for( $i=0; $i < 1000; $i++)
echo 'Hello World';
?>

nginx配置增加limit_req_zone 和 limit_req
http{
    ...
    limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;
    ...
    server{
        ...
        location {
            ...
            limit_req zone=allips;
            ...
        }
        ...
    }
    ...
}

ab -n 5 -c 1 http://www.weizhang.org/test.php
118.144.94.193 - - [22/Dec/2012:06:27:06 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:06:27:06 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
未设置brust和nodelay可以看到该配置只允许每秒访问1次,超出的请求返回503错误
http{
    ...
    limit_req_zone $binary_remote_addr zone=allips:10m rate=60r/m;
    ...
    server{
        ...
        location {
            ...
            limit_req zone=allips burst=1 nodelay;
            ...
        }
        ...
    }
    ...
}

ab -n 5 -c 1 http://www.weizhang.org/test.php
118.144.94.193 - - [22/Dec/2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

设置brust=1和nodelay后允许第1秒处理两个请求。


原文地址:http://blog.csdn.net/gebitan505/article/details/17610485


php获取和处理url常用方法
<?php

//当前页面 http://localhost/ceshi/url.php?id=365

//获取域名或主机地址 
echo $_SERVER['HTTP_HOST']; //localhost
echo "<br>";

//获取当前页面url
echo $_SERVER['PHP_SELF']; //   /ceshi/url.php,如果url为url.php/index/index,则输出/ceshi/url.php/index/index
echo "<br>";

//获取当前页面参数
echo $_SERVER["QUERY_STRING"];//id=365
echo "<br>";

//获取端口
echo $_SERVER["SERVER_PORT"];//80
echo "<br>";

//完成的url
$url =  'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER["QUERY_STRING"];
echo $url;
echo "<br>";


echo "<pre>";
print_r(pathinfo($url));  //返回文件路径的信息 
/*结果 Array
(
    [dirname] => http://localhost//ceshi
    [basename] => url.php?id=365
    [extension] => php?id=365
    [filename] => url
)*/
print_r(parse_url($url)); //解析 URL,返回其组成部分 
/*结果Array
(
    [scheme] => http
    [host] => localhost
    [path] => //ceshi/url.php
    [query] => id=365
)
*/


print_r(basename($url)); // 返回路径中的文件名部分  结果url.php?id=365
echo "<br>";


print_r(dirname($url)); //返回路径中的目录部分 结果 http://localhost/ceshi


优惠券
最新微语