2 big bow big_bow 于 2018.01.12 15:38 提问

java 接口请求访问阻塞问题 40C

做了一个接口,查询mongdb的,然后根据日志分析发现有个别请求非常慢,甚至主键查询都要几分钟了,通过生产实测,了解 到当时其实据库压力并不大,而且相同的条件直接用sql跑还是1秒左右返回的,就是在用接口调用的时候,一直在等待请求进入,导致最后返回耗时比较长,请问这个该怎么优化,优化方向在那里,谢谢各位大佬了

4个回答

devmiao
devmiao   Ds   Rxr 2018.01.12 23:42
devmiao
devmiao   Ds   Rxr 2018.01.12 23:42

一、同步阻塞

这是早期Linux常用的IO方式,在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。图 1 给出了传统的阻塞 I/O 模型,这也是目前应用程序中最为常用的一种模型。其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。在调用read系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read调用返回)。

\

图1 同步阻塞方式

二、同步非阻塞 I/O

同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。在这种模型中,设备是以非阻塞的形式打开的。这意味着 I/O 操作不会立即完成,read操作可能会返回一个错误代码,说明这个命令不能立即满足(EAGAIN或EWOULDBLOCK),如图 2 所示。

\

图2 同步非阻塞方式

非阻塞的实现是 I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。这可能效率不高,因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,或者试图执行其他工作。正如图 3 所示的一样,这个方法可以引入 I/O 操作的延时,因为数据在内核中变为可用到用户调用read返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。

三、异步阻塞方式

另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。在这种模型中,配置的是非阻塞 I/O,然后使用阻塞select系统调用来确定一个 I/O 描述符何时有操作。使select调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。

yangezheyue
yangezheyue   2018.01.12 15:59

看下是不是查询的量比较大,然后回写的时候超时了呢?再一个就是调试跟进一下代码逻辑,应该是在加工的时候有什么延迟。
或者地柜,或者循环,或者存取集合数据上。希望能够帮助到你

big_bow
big_bow 查询量都不大的,就是字段有点多把,但是也是一页20条,主键查询也才1条的
5 天之前 回复
oyljerry
oyljerry   Ds   Rxr 2018.01.12 15:57

那就看看接口调用的相关日志,是不是服务器接口处理不过来在等待任务

oyljerry
oyljerry 还要看看Tomcat日志等。具体时间花在哪
5 天之前 回复
big_bow
big_bow 已目前的并发量来说tomcat,和数据库 连接数也给绝对够用,而且tomcat是Nio的连接方式,但是就是在接口请求的时候,一直等待很长时间才会有返回
5 天之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!