db写入造成阻塞的原因

592480409

在本地虚拟机中压测时,单进程同一个方法,如果没有数据库写入通讯基本上不是什么问题,单进程每秒4000多的回复速度。但哪怕只有数据库操作时,哪怕2个客户端每秒只请求100次,都会卡住,数据会丢失,并没有全部写入数据库。
不知道产生这样情况的原因?有没有解决办法?数据库操作后来也试过原生的pdo,试过原生pdo的单例,都没用,都会堵死。直接连数据库写入速度是完全没有问题的,每秒钟上千条的写入速度。gateway写入数据库的速度也很快,0.01秒就写入一条数据,但为啥承载力这么低下,百思不得其解
是二进制双向通信,business写的业务逻辑

3703 3 0
3个回答

walkor

linux系统用命令
strace -ttp 进程pid
能看到到底卡在哪里了

  • 592480409 2017-03-19

    运行了这个命令,没能看懂。。这几天测试发现,不仅是操作数据库,还有curl,写文件,都会造成这种情况,不像是阻塞,因为监看mysql的时候发现它很闲,非常空闲,top看cup也只用了百分之50,更像是gateway占用着资源不释放,导致后面的请求得不到处理。
    还有就是,同事的电脑虚拟机分配的一核1g内存,发生这种情况很显著,我的虚拟机分配的2核4g内存,情况好很多,但是请求量大一样会发生这种情况,比如说线程达到1000时,这种情况产生后,数据库只能每秒写入一条数据的速度。。。

  • 592480409 2017-03-19

    我们做的是物联网,设备每10秒都会上报坐标的,所以处理速度直接影响服务器的承载量,这个问题很是诡异危险

  • walkor 2017-03-19

    你用的单进程,你描述是0.01秒才写入一条数据,那么一个进程一秒钟只能写入100条数据。你测试时有两个客户端,每个客户端每秒请求100次,假如每次写一次数据库,那个需要每秒写入200条数据,已经超过单进程的承载能力,所以请求可能会挤压,出问题也是正常的。

  • 592480409 2017-03-19

    不是,用jmeter测试的,是有回复之后才发起第二次请求的

  • 592480409 2017-03-19

    并不是1秒内一定发起了200次请求

  • 592480409 2017-03-19

    问题是,当发生状况后,数据一秒钟写入一个,workerman忙的要死,数据库闲的要死。是什么原因导致的?解决办法是?不然一台服务器cpu百分之50的利用率都用不到就上线显然是不行的

  • 592480409 2017-03-19

    同样的业务把数据库操作去掉后,连16000用户都可以,只是每秒回复只有几千条而已,并不会出现像这样占着茅坑不拉屎现象。

  • 592480409 2017-03-19

    之前的描述有点不准确,2个线程连接gateway,循环100次,当收到回复发起第二次请求。有时候执行到100多次就卡住了,有时候执行到几十次就卡住了。后面的写入速度很慢,每秒只写入个位数的记录。当循环完了发现数据库里记录只存了几十条或者100多条,卡住后的很多数据都丢失了

  • 592480409 2017-03-19

    我的电脑情况好点,1000个线程循环10次,写入了9000多条,丢失了700多条。
    100个线程循环100次,完全写入无丢失

  • 592480409 2017-03-19

    卡住后数据库写入速度非常慢,但是数据库其实非常空闲

  • 592480409 2017-03-19

    单独测workerman吞吐的时候,定时发送请求测的,虽然说回复量没有跟上请求量,但一直在回复,没有这种卡死的情况,没有这种秒回复量骤减到个位数的情况

  • walkor 2017-03-20

    看起来是没有优化linux内核导致的,根据手册优化下linux内核 http://doc3.workerman.net/appendices/kernel-optimization.html 。另外需要安装event扩展或者libevent扩展,参考手册 http://doc3.workerman.net/install/install.html

    并不是所有服务器的默认配置都能支持压测,默认内核配置都比较低,需要优化才能压测出好成绩,才能在正式环境使用。要想高并发,正式环境PHP的event扩展或者libevent扩展也是必须要装的。

  • 592480409 2017-03-20

    谢谢,是没优化,下午试试

  • 592480409 2017-03-20

    性能提高了不少,但后来报了这样的错SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready
    还是卡住了

  • 592480409 2017-03-20

    上面还有。。PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65536 bytes) in /mnt/hgfs/workspace/baiyi/GatewayWorker/Workerman/Connection/TcpConnection.php on line 360内存用尽?

  • walkor 2017-03-20

    php.ini 里调高 memory_limit

luckyrin

我的也是这种情况。但是我的是一个连接每3秒进行一次数据存储,过了大概20多分钟,就会卡住。卡住的表现就是别的请求反应慢,或者回复的消息不正确。楼主最后解决问题了吗??请教!!

  • 暂无评论
hehe

看看这个workerman与thinkphp5的实战教学视频,就都会了。

http://study.163.com/course/introduction/1005015012.htm?share=2&shareId=400000000388007

  • 暂无评论
年代过于久远,无法发表回答
🔝