Yang,Liming
Yang,Liming
Can I configure gtags.conf to use gogtags backend?
yes,in vterm i use less command,then i switch to vterm-copy-mode,then return back to vterm mode,i can not type command. it not alway happened
when i use tmux, then enter vterm-copy-mode, do some searching, then [RET], the terminal is readonly
我理解用io_uring替换epoll API,是不是网络io和磁盘io都能同时支持呀?
看这个函数的注释,每次都要EPOLL_CTL_ADD and EPOLL_CTL_DEL,对性能有影响?我这个需求是注册上去了,后边就一直监听就可以了。
嗯,我觉得这样是可以的
> > 上述问题可以通过使用cas进行链表插入来解决,当然brpc的span不止这一处问题,收到请求包后发起异步调用,svr span会被析构。收到异步调用回包后再发起rpc就可能core。done->Run()提前回包后再发起rpc也有类似的问题。 为了解决这个问题我们对svr span加入了引用计数机制。在合适的位置为当前的svr span引用计数+1,析构时-1。算是比较彻底的解决了这个问题。 在这些问题解决前,不建议在生产环境使用brpc的trace。 > > hello,想请教一下“收到异步调用回包后再发起rpc就可能core”,异步回调中发起rpc时,所在的bthread的thread local的变量中,应该不包含原来那个svr span的指针吧。因为这可能会是一个新的bthread,那么会是什么原因导致的core呢? > > 从源代码来看([https://github.com/apache/brpc/blob/master/src/brpc/controller.cpp#L718),创建新的bthread的时候,也没有使用BTHREAD_INHERIT_SPAN标志。brpc这个时候,可能不认为新的rpc请求是老的svr](https://github.com/apache/brpc/blob/master/src/brpc/controller.cpp#L718%EF%BC%89%EF%BC%8C%E5%88%9B%E5%BB%BA%E6%96%B0%E7%9A%84bthread%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E4%B9%9F%E6%B2%A1%E6%9C%89%E4%BD%BF%E7%94%A8BTHREAD_INHERIT_SPAN%E6%A0%87%E5%BF%97%E3%80%82brpc%E8%BF%99%E4%B8%AA%E6%97%B6%E5%80%99%EF%BC%8C%E5%8F%AF%E8%83%BD%E4%B8%8D%E8%AE%A4%E4%B8%BA%E6%96%B0%E7%9A%84rpc%E8%AF%B7%E6%B1%82%E6%98%AF%E8%80%81%E7%9A%84svr) span的child span了。不知道我理解的是否有问题 @bigolcy 感觉你可以在父bthread里面创建多个span,然后作为argument传递给每个子bthread。
@wwbmmm 这个问题我最近想出一个方案来解决,想和你讨论一下: 现在启动bthread如果加上BTHREAD_INHERIT_SPAN标志,bthread会继承span,为了修复这个问题,简单的方法是在创建bthread的时候,如果有BTHREAD_INHERIT_SPAN这个标志,就执行一次Span::CreateClientSpan,创建一个client span,让这个client span成为m->local_storage.rpcz_parent_span。 这样做的 优势在于,创建span仍然是能够完全规避了线程竞争,所以对性能应该很友好。 缺点在于,会增加一些span的数量。 实现难度很低,但是也会有个问题,就是需要在bthread层面调用Span::CreateClientSpan,但是Span::CreateClientSpan是在brpc这个层面上,代码调用关系可能有些不合理。
> > 优势在于,创建span仍然是能够完全规避了线程竞争,所以对性能应该很友好。 > > 这个修改没有想象中那么简单,至少还涉及了rpcz相关的代码。这里会出现多个trace id,span id一样的span对象。 那么存入leveldb时,可能要考虑是否合并到一起。 如果不合并则要考虑rpcz的展示需要做一些修改。 > > 所以,加一个锁,或者一个lockfree的队列会来的更快。 > > 另外还注意到TRACEPRINTF这个宏其实可能也有线程安全问题,最终其实是调用到Span::Annotate这个函数。 如果是多个线程同时写,则显然需要一个锁。 > > 所以总的来说,除非trace部分整体重新设计一遍,否则,使用锁是一个看上去更清晰的方案。 单线程调用内部多次调用createClientSpan,这个应该不会造成重复spanId吧,多线程调用Annotate相当于多线程并发处理一个请求?
> > 实现难度很低,但是也会有个问题,就是需要在bthread层面调用Span::CreateClientSpan,但是Span::CreateClientSpan是在brpc这个层面上,代码调用关系可能有些不合理。 > > 这个可以让bthread开放一个set_create_span_func的方法,然后在brpc代码里将真正实现的方法设置进去 #2519