Skip to content

和tensorflow一起使用可能导致的死锁问题 #2313

@zgaze

Description

@zgaze

Describe the bug (描述bug)
和tensorflow一起使用有概率会死锁。 准备来说并不确定是brpc的bug。
但是使用公司内部rpc,相同的行为并不会发生死锁,因此比较大概率是brpc的bthread带来的影响。

现象和描述
用法:
1、rpc的接口里面调用tf的session run。设置了tf的超时时间,这个是tf主线程,应该是个bthread
2、tf应该是有自己的线程池处理本次pv。
3、tf的图节点有一个异步节点。 在这个异步节点 我使用brpc的DynamicPartitionChannel 请求下游多个节点,有设置超时时间。由rpc的回调触发tf的回调done。
现象:
1、死锁的线程只有一个栈(并没有bthread直接相关的栈)。是rpc的线程(bthread),在等待tf结果返回。 等于是这些工作线程死锁了,并不能继续对外提供服务。
image

syscall部分内核栈如下:
[] futex_wait_queue_me+0xc6/0x130
[] futex_wait+0x17b/0x280
[] do_futex+0x106/0x5a0
[] SyS_futex+0x80/0x180
[] system_call_fastpath+0x1c/0x21
[] 0xffffffffffffffff

2、brpc请求下游(在tf框架里,应该是pthread线程)出现了多个超时,1分钟后rpc线程里面tf开始大量报超时(报超时是正常的)。然后死锁(不能wait到超时了)。
3、线上多台服务,只有一两台有这个请求,稳定运行两周后偶现。

tensorflow 使用nsync库来实现同步。比如 condition_variable,不确定它是否会跟bthread冲突。

很愿意配合排查,任何建议都欢迎。

Expected behavior (期望行为)

Versions (各种版本)
OS:
Compiler: gcc 4.9.2
brpc: 1.2.0
protobuf: 3.8

Additional context/screenshots (更多上下文/截图)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions