-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 64 期深入浅出Golang Runtime-yifhao #492
Comments
mark |
期待 |
請問GPM的P,上面所謂的資源是什麼意思 |
希望能夯实一下基础,昨天的分享干货好多,硬核好多~ 我是野生程序猿! |
干货太多,希望大佬多分享一些Runtime相关知识。 |
有没有回放视频呢 |
https://www.bilibili.com/video/av73297683 可以关注、订阅。 |
Q: 腾讯现在用go的多吗?多, 至少 2000 人的级别了,对go的接受度挺高的,使用人数在迅速增加,当然大部分团队还是 cpp。 Q: 腾讯 NOW 直播 go 开发占比多少?我们都是从其他语言转的,cpp,java->golang,一开始就写 go 的比较少。基本上学习一下,一个星期就可以开始写线上 go 服务了。目前新服务都是 go。 Q: 线程切换的开销线程切换大概在几微妙级别,协程切换大概在百 ns 级别。 线程切换过程:
协程切换不需要进入和退出系统调用, 在进行上下文切换时也更轻量, 只需要切换几个寄存器, 协程 可参考进程/线程上下文切换会用掉你多少CPU? 协程究竟比线程能省多少开销? Q: 为啥是边缘触发, 而不是水平触发的方式?因为网络操作 ready 和未 ready 对于协程来说就是状态的切换。 Q: 内存什么时候释放?内存释放分两步 Q: 0.1+13+0.3ms 三个时间的意思?
Q: []byte 于 string 的黑魔法底层数据共享,减少数据拷贝。 Q: 之前说的 netpoll,被 gopark 挂起的 G 扔哪了,怎么找到对应的 G,然后又怎么扔给对应的 M 的 runQ 的?并没有扔哪里去,也没放在哪个队列。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
}; go 在 epoll_event 中的 epoll_data_t 放了一个指针值,该指针指向一个包含 runtime.g 的结构体。 不需要再放回对应的 M 的 runq 中,目前是通过 injectglist 放在全局的 runq 中. 至于为什么是放到全局runq, 对于sysmon, gc这块比较好解释,因为本来就没和特定P绑定, 放到全局会比较好一些. 而对于findrunnable来说, 有两次netpoll. 第一次在local和global都没有任务时, 去poll, 放到全局应该是为了均衡吧. poll没有再去其他P steal, 如果其他P也没有steal到, 也没有gc任务, 那表明真没任务了, 这时候还会做一次netpoll, 这次一定是为了均衡, 因为其他P都没有, 你这里有, 那应该放到全局, 让其他P去获取. |
@Frank-hust 请问一下,在MarkTermination阶段,已经STW了,为啥还需要写屏障呢 |
这个问题很复杂, 我也没太搞清楚. 按照目前简略的GC流程来看, 在stw阶段貌似是不需要写屏障的.
|
更正一个错误, ppt最后面的一个有趣的问题排查, 有讲到gctrace日志打到磁盘阻塞gc完成, 并不是因为gc没完成而导致其他协程不能运行, 而是后续gc无法开启, 导致实质上的stw. 打印gc trace日志时, 已经start the world了, 其他协程可以开始运行了. 但是在打印gctrace日志时, 还保持着开启gc需要的锁, 所以, 打印gc trace日志一直没完成, 而gc又比较频繁, 比如0.1s一次, 这样会导致下一次gc开始时无法获取锁, 每一个进入gc检查的p阻塞, 实际上就造成了stw. |
Q: 调度器在遇到协程阻塞时(4种阻塞),为什么分成2类情况来处理,以及如何处理
TODO: 如何理解3,4其实都是锁。 |
【Go 夜读】 深入浅出Golang Runtime
本次分享对go runtime的调度, 内存分配, gc做一些细节上的讲解, 需要参与者对runtime有一些初步了解. (在2019.08.17 深圳Gopher Meetup的分享)
大纲
分享者自我介绍
郝以奋, yifhao, 腾讯NOW直播后台开发, 负责NOW直播 CPP+JAVA双栈 -> Golang转型: 框架协同建设, 业务功能定制, Go Mod引入, 服务模板, RPC协议Go Mod化, 服务模板, Golang培训, 文档等.
目前后台有300多个Go服务.
分享时间
2019-10-24 21:00 UTC+8
分享地址
https://zoom.us/j/6923842137
Slides
https://github.com/Frank-Hust/share
参考资料
备注
针对此次分享的 QA 请分享者在分享之后,整理同步到此 issues 后面。
The text was updated successfully, but these errors were encountered: