#79 一定期間経過後にアクセスができなくなる

 [Public]
icon written by dai at May 10, 2018 9:59 AM
  Edit(Sign in)
  Stock
  Answer survey   Answer survey

  TOC

下記現象に関して、教えていただけませんでしょうか。

現在、クラウド上にてKnowledge環境を構築致しましたが、
一定期間経過後にアクセスができなくなります。

Tomcatのログを確認したところ、下記のログ(Websocketのリモート側の切断?)が定期的に発生しており、

INFO [https-jsse-nio-443-exec-147] org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doClose Failed to close the ServletOutputStream connection cleanly
java.io.IOException: An established connection was aborted by the software in your host machine
at sun.nio.ch.SocketDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(Unknown Source)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.write(Unknown Source)
at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
at org.apache.tomcat.util.net.SecureNioChannel.flush(SecureNioChannel.java:144)
at org.apache.tomcat.util.net.SecureNioChannel.close(SecureNioChannel.java:520)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.close(NioEndpoint.java:1209)
at org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doClose(WsRemoteEndpointImplServer.java:167)
at org.apache.tomcat.websocket.WsRemoteEndpointImplBase.close(WsRemoteEndpointImplBase.java:710)
at org.apache.tomcat.websocket.WsSession.onClose(WsSession.java:518)
at org.apache.tomcat.websocket.WsFrameBase.processDataControl(WsFrameBase.java:347)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:289)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

しばらくすると、下記のOutOfMemoryでスレッドが落ちているようです。
SEVERE [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run Unexpected death of background thread [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
java.lang.OutOfMemoryError: Java heap space

 Attach Files     - [0]


 Comment
[Registration] May 10, 2018 11:30 PM [Koda]
icon

エラーのログを見たのですが、エラーの原因を特定はできません。
ただし、以前、アプリケーションサーバーのTomcatの前に、Webサーバー(リバースプロキシ)でApacheをおいたときに、WebSocketが繋がらなくてエラーになるという報告を聞いたことがあります。(私は、リバースプロキシにはNginxを使っているのでエラーを見たことが無いのですが)
もしかすると、上記のような構成になっていてWebSocketが繋がらず、それでもなんとか繋げようとリトライが頻発してOutOfMemoryが発生しているのかもしれません。
いったんご利用の環境が上記の状態になっていないかチェックを行ってください。


 Like! × 0  
Collapsed
[Registration] May 11, 2018 8:16 AM [dai]
icon

ご回答ありがとうございます。

リバースプロキシは使っておりません。
全く使えないわけではないのでWebsocketは接続できているのかな?という認識です。
また、他システムも同様の環境で運用しており、そちらのシステムでもWebsocketを使用しており問題なく接続できています。

リバースプロキシは使用しておりませんが、前段にAWSのALBを置いており、アイドルタイムアウトで切断されている可能性も疑っております。
ALBのタイムアウトは300秒に設定していますが、KnowledgeのWebsocket通信は一定間隔で通信していますでしょうか。


 Like! × 0  
Collapsed
[Registration] May 11, 2018 11:09 PM [Koda]
icon

KnowledgeのWebsocket通信は一定間隔で通信していますでしょうか。

決められた一定期間でサーバーからプッシュするようなことはしていません。
投稿やコメントがあった場合の通知を行っているのみです。
WebSocketをつないでも、300秒の中で通信が無いとALBが通信を切ってしまうのであれば、それが原因になっている可能性は高いと思います。

ちなみに、Websocketの場合、サーバーから通知を出したいときにだけプッシュ通知すればよいと思っていたのですが、
定期的に接続をチェックするような通知を出すのが普通なのでしょうか?


 Like! × 0  
Collapsed
[Registration] May 14, 2018 8:16 AM [dai]
icon

ちなみに、Websocketの場合、サーバーから通知を出したいときにだけプッシュ通知すればよいと思っていたのですが、
定期的に接続をチェックするような通知を出すのが普通なのでしょうか?

ロードバランサーやファイアーウォールがアイドル接続タイムアウトを設けているのは良くあることかと思いますので、
通信時に通信可能か確認して必要に応じて再接続するか、キープアライブをして接続を維持するのが一般的かなと思います。


 Like! × 0  
Collapsed
[Registration] May 14, 2018 10:07 PM [Koda]
icon

なるほど。
では、WebSocketで接続している場合は、一定期間にKeepAlive的な疎通確認のリクエストを投げれるようにしたいと思います。(管理者が設定できるようにする)

といっても、最近はあまり時間が取れないので、対応まで時間がかかると思います。
https://github.com/support-project/knowledge/blob/v1/src/main/webapp/js/notification.js
を編集すれば良いと思いますので、もしお急ぎであればそちらを編集願います。


 Like! × 0  
Collapsed
[Registration] May 16, 2018 9:08 AM [dai]
icon

では、WebSocketで接続している場合は、一定期間にKeepAlive的な疎通確認のリクエストを投げれるようにしたいと思います。(管理者が設定できるようにする)

対応のご検討ありがとうございます。
暫定でサーバー側の定期再起動などで対応しておりますので、
個人でメンテナンスされているということで大変心苦しいところですが、
しばらくは対応頂けるのを待たせていただきます。

1年ほど前から活用させていただいており、その後の機能拡張もかなり有用なものとなりそうに感じています。
特にシステム連携の面でWebAPIの拡充に期待しております。


 Like! × 0  
Collapsed



 Add Comment