`
hanyh
  • 浏览: 235630 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程数据库插入速度测试

    博客分类:
  • php
阅读更多
共享内存计数的时候没有锁定,会造成少量的更新遗失,不过对整体来说,遗失的数据量没有大的影响。


  <?php
 /**
  *

  *
  * 每个进程都单独连接数据库
  * */

 //configruation parameters
 
 $tbl_id = 0;
 $count_per_process = 10;
 $concurrents = 100;
 $logpath = "/tmp/s.log";
 $host = "10.218.26.75";
 $user = "user";
 $pwd = "pwd";
 $db = "test";
 $port = 3306;
 $sep = 1000;
 $uid_count = 100000;
 $uid_path= 100000;

 if ($argc != 13) {
    echo "Usage:php multiprocess.php tbl_id concurrents count_per_process logpath host user pwd db port sep_counts uid_count uid_path\n"; 
    echo "Usage:php multiprocess.php 表ID 并发数 每进程多少次 记录路径 主机 用户 密码 数据库 端口 多少条记录一次 用户数 用户UID保存路径\n"; 
    exit(1);
} else {
    $tbl_id= trim($argv[1]);
    $concurrents = (int)trim($argv[2]);
    $count_per_process= (int)trim($argv[3]);
    $logpath = trim($argv[4]);
 $host = trim($argv[5]);
 $user = trim($argv[6]);
 $pwd = trim($argv[7]);
 $db = trim($argv[8]);
 $port = trim($argv[9]);
 $sep = trim($argv[10]);
 $uid_count= (int)trim($argv[11]);
 $uid_path = trim($argv[12]);
 if($uid_count < $concurrents and ($uid_count % $concurrents !=0 )) {
     die("UID数必须多过并发进程数并曲uid数必须是进程数的整数倍\n");
 }
 $uid_count = $uid_count / $concurrents;

}

  $shm_key = ftok(__FILE__, 't');
  $shm_id = shmop_open($shm_key, "c", 0644, 100);
  shmop_write($shm_id, 0, 0);

  $m_start=  microtime(true);
  $conf = array(
    'count' => $count_per_process,
    'host' => $host,
    'user' => $user,
    'pwd' => $pwd,
    'db' => $db,
    'port' => $port,
    'logpath' => $logpath,
    'shm_id' => $shm_id,
    'tbl_id' => $tbl_id,
    'sep' => $sep,
    'uid_count' => $uid_count,
    'uid_path' => $uid_path,
  );

  error_log("+++++++++++++++++++++begin++++++++++++++++\n",3,$logpath);
  error_log("$m_start\n",3,$logpath);
    for ($i = 1; $i <= $concurrents; ++$i) {
        $pid = pcntl_fork();
        if (!$pid) {
            $worker = new Simulator(getmypid(),$conf);
            $worker->execute();
            exit($i);
        }
    }

  //main process
    while (pcntl_waitpid(0, $status) != -1) {
        $status = pcntl_wexitstatus($status);
        echo "Child $status completed\n";
    }
    $m_end =  microtime(true);
    $m_duration = $m_end - $m_start;
    echo "total time consumes:".$m_duration."\n";
    


    $shm_size = shmop_size($shm_id);
    $counter_str= shmop_read($shm_id, 0, $shm_size);
    echo "shm counter :$counter_str\n";
    $e =(int)$count_per_process * (int)$concurrents;
    echo "theory counter :$e \n";

    if (!shmop_delete($shm_id)) {
            echo "Couldn't mark shared memory block for deletion.";
    }
    shmop_close($shm_id);
    error_log("$m_end\n",3,$logpath);
    error_log("+++++++++++++++++++++end++++++++++++++++\n",3,$logpath);

 class Simulator{
     private $link;
     private $pid;
     private $sep; //每隔多少条记录时间
     private $tbl_id;
     private $uid_path;
     private $uid_count;
     private $uid_tmp_count;
     private $uid_is_ok;
     private $uid_data;
     private $count;
     private $logpath;
     private $error_path = "error.log";
     private $counter=0;
     private $domains = array(".com",".cn",".info",".org",".net",".biz",".mil",".net",".jp",".tw");
     private $domain_size;

     function __construct($pid,$conf) {
         $this->pid= $pid;
         if($conf['tbl_id'] == 0) {
            $this->tbl_id= '';
         } else {
            $this->tbl_id= $conf['tbl_id'];
         }
         $this->domain_size = count($this->domains)-1;
         $this->count = $conf['count'];
         $this->sep = (int)$conf['sep'];
         $this->shm_id = $conf['shm_id'];
         $this->logpath = $conf['logpath'];
         $this->uid_path = $conf['uid_path'];
         $this->uid_count = (int)$conf['uid_count'];
         $this->uid_is_ok = false; //关键字
         $this->uid_tmp_count = 0; //

         $this->link = mysql_connect($conf['host'].":".$conf['port'],$conf['user'],$conf['pwd']);
         if(!$this->link) {
            var_dump($conf);
             die("connected faild:".mysql_error());
         }
         $db_selected = mysql_select_db($conf['db'],$this->link);
         if(!$db_selected) {
             die("can't use db:".mysql_error());
         }
     }

     function __destruct() {
         if($this->link) {
            mysql_close($this->link);
         }
         if($this->uid_is_ok) {
             //echo "destory";
             $path = $this->uid_path;
             //$path = $this->uid_path."-$this->pid";
             $fp = fopen($path,"a");
             if($fp) {
                $contents = "";
                $i = 1;
                foreach($this->uid_data as $uid) {
                    if($i % 2000 == 0) {
                        $contents .= $uid."\n";
                        fwrite($fp,$contents);
                        $contents = "";
                    }
                    $contents .= $uid."\n";
                }
                fwrite($fp,$contents);
                fclose($fp);
             }
         
         }
     }
     
     private function inc() {
             $counter_str= shmop_read($this->shm_id, 0, 100);
             $c = (int) $counter_str + 1;
             if($c % $this->sep == 0) {
                error_log(microtime(true)."    $c\n",3,$this->logpath);
             }
             shmop_write($this->shm_id, $c, 0);
     }


     public function execute() {
         $start =  microtime(true);
         $this->pre = microtime(true);
         //  echo $this->count;
         for($i = 0;$i < $this->count;$i++) {
             $uid = $this->getUid();
             $email = $this->getEmail();
             $name = $this->getName();
             $sql = "INSERT INTO contact{$this->tbl_id}(uid,name,email) VALUES ($uid,'$name','$email')";
             $result = mysql_query($sql,$this->link);
             $this->inc();
             if(!$result) {
                error_log(mysql_error()."\n",3,$this->error_path);
             }
         }
         $end =  microtime(true);
         $duration = $end - $start;
         //$line = "process ".$this->pid." ".$count." ".$duration."\n";
         //echo "$line";
        // error_log($line,3,$this->logpath);

     }

     private function getEmail() {
         $email = $this->getName()."@".$this->getName().$this->domains[mt_rand(0,$this->domain_size)];
         //echo $email."\n";
         return $email;
     }

     private function getName() {
         $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; 
         $size = strlen($chars);
         mt_srand((double)microtime()*1000000*getmypid());
         $i = mt_rand(6,18);
         $output = "";
         while(strlen($output)<$i)
            $output.=substr($chars,(mt_rand() % $size),1);
         return $output;
     }

     private function getUid() {
         if($this->uid_is_ok) {
             return $this->uid_data[mt_rand(0,$this->uid_count-1)];
         } else {
            mt_srand((double)microtime()*1000000*getmypid());
            $uid = mt_rand(1000000000,9999999999);
            $this->uid_data[] = $uid;
            $this->uid_tmp_count += 1;
            if($this->uid_tmp_count == $this->uid_count) {
                $this->uid_is_ok = true;
            }
            return $uid;
         }
     }
}


?> 
1
0
分享到:
评论

相关推荐

    JAVA多线程实现数据库之间的数据互导、连接池、及多表插入数据库功能

    - **调试和优化**:通过模拟测试,观察多线程环境下数据互导的性能,对源码进行调优,提高数据传输速度和资源利用率。 6. **工具使用**: - **开发工具**:如IDEA、Eclipse等集成开发环境,辅助编写和调试Java...

    C#多线程连接mysql,Access

    可能需要设计一个包含多种测试场景的基准测试框架,以便更全面地评估两个数据库在多线程环境下的表现。 在实际应用中,选择MySQL还是Access通常取决于项目需求。MySQL适合大型、高性能的Web应用,提供强大的扩展性...

    数据插入数据库5种方式工具源码2012825

    数据插入数据库5种方式工具源码 功能描述: 基本Insert Into 单线程Bulk Insert 多线程Bulk Insert 单线程SqlBulkCopy 多线程SqlBulkCopy 试验的5种方法,比较各种方法的导入速度 要把导入的文件放在C盘如:c:\\20...

    C#.NET中如何批量插入大量数据到数据库中

    4. **优化数据库设计**:确保目标表有良好的索引和分区策略,可以进一步提高插入速度。 5. **减少数据库往返**:尽量减少不必要的数据库查询,例如,通过一次性获取所有需要的数据库对象,而不是在循环中多次查询。...

    ob多线程插入报错.docx

    根据文档标题“ob多线程插入报错.docx”及其描述“ob多线程插入报错.docx”,可以推断出该文档主要关注的是在使用OceanBase(简称OB)数据库时,在进行多线程插入操作过程中出现的错误情况。这种错误通常表现为死锁...

    基于python的ftp项目(含数据库,含多线程,含socketserver)

    在本项目中,我们主要探讨的是一个基于Python实现的FTP(File Transfer Protocol)服务器,它融合了数据库存储、多线程处理以及SocketServer模块。FTP是互联网上广泛使用的文件传输协议,允许用户从远程服务器上传、...

    BDB数据库测试工具

    1. **性能测试**:通过模拟大量并发读写操作,测试BDB在不同工作负载下的响应速度和吞吐量,帮助优化数据库配置以达到最佳性能。 2. **压力测试**:在高并发环境下运行测试,检测BDB在极限条件下的稳定性和耐久性,...

    湖北多线程注册

    9. **测试与调试**:多线程系统的测试更为复杂,需要对并发场景进行充分的测试,确保在高并发情况下系统的稳定性和正确性。 通过上述分析,我们可以看出,“湖北多线程注册”是一个涉及到并发处理、线程安全、资源...

    数据库性能基准测试 DB-Webbench.zip

    1. **多线程模拟**:Webbench 可以创建多个线程,每个线程代表一个并发用户,模拟真实用户对数据库的操作,如查询、插入、更新和删除。 2. **自定义脚本**:测试可以使用预定义或自定义的脚本来模拟特定的应用场景...

    用JMeter测量性能测试您的DB2数据库

    JMeter的多线程框架是其进行大规模并发测试的关键。通过创建大量的虚拟用户(即线程),JMeter能够模拟真实世界的高并发场景,从而对数据库的响应时间和资源消耗进行准确测量。此外,JMeter还提供了一系列图形化报告...

    测试人员需要了解的Mysql数据库

    MySQL具有体积小、运行速度快、可移植性强的特点,它支持多用户、多线程、跨平台,并提供丰富的编程接口。 三、数据库中的术语 在数据库中,“关系”指的是一张二维表(类似于Excel表格);“属性”指的是二维表中...

    压力测试数据库脚本

    3. 并发控制:为了模拟真实世界中的并发访问,脚本可能包含多线程或异步处理,使得多个插入操作同时进行,增加数据库的压力。 4. 性能监控:在执行脚本的过程中,需要记录和分析数据库的性能指标,如CPU使用率、内存...

    3分钟如何向MySQL数据库中插入100万条数据

    然而,实际应用中,可能还需要考虑其他因素,如数据库索引的影响、数据分批插入的大小优化、并发插入的策略等,这些都会对插入速度产生影响。 此外,`DBUtil`通常是一个工具类,用于管理数据库连接的打开和关闭,以...

    多线程线程池使用 (C#3.5) 高效

    在C# 3.5中,多线程和线程池是提高程序执行效率和并发能力的重要工具。本文将深入探讨如何高效地使用线程池进行多线程编程。 线程池是一种管理线程资源的技术,它能有效地管理和调度线程,避免了频繁创建和销毁线程...

    SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

    - **并行处理**:如果硬件资源允许,可以考虑多线程并行插入,但需注意并发控制。 4. **数据分片**:对于特别大的数据量,可以考虑数据分片,将数据分散到多个表或数据库中,以减轻单一表的压力。 5. **监控与...

    sqlite3-stress:多线程写入Sqlite3数据库

    在本文中,我们将深入探讨“sqlite3-stress”工具,它专门设计用于进行多线程写入 SQLite3 数据库的压力测试。这个工具可以帮助开发者评估 SQLite3 在并发环境下的性能和稳定性,确保在高负载情况下仍然能正常运行。...

    DAO多线程的技巧.rar_dao

    - **批量插入与更新**:在多线程环境下,可以将大量数据分成小批量,由多个线程并行处理,从而提高效率。JDBC的PreparedStatement提供了批处理功能,可以有效地减少数据库交互次数,提升性能。 - **线程池的使用**...

    fastdb,开源的内存数据库

    4. **多线程访问**:FastDB支持多线程并发访问,保证了在多线程环境下的数据安全。 5. **Java接口**:通过libjnicli.so,FastDB能够与Java应用程序无缝集成,方便Java开发者使用。 **二、libjnicli.so的生成与使用*...

    JAVA内存数据库使用demo

    - 在多线程环境下,每个线程可以拥有自己的数据库连接,互不干扰,实现并发访问。 10. **应用场景**: - 测试环境:内存数据库启动快速,数据不会污染生产环境。 - 高性能缓存:如Redis,尽管不是纯Java实现,但...

Global site tag (gtag.js) - Google Analytics