标准答案
- G 保存 goroutine 的栈、状态和待执行函数。
- M 是承载执行的系统线程,P 持有本地运行队列并把 G 调度到 M。
- GOMAXPROCS 影响 Go 代码的并行执行度,不等于 goroutine 总数或线程总数。
- 阻塞系统调用、网络轮询、抢占和工作窃取会影响实际调度行为。
题目解析
G 表示 goroutine,M 是承载执行的 OS 线程,P 提供执行 Go 代码所需的调度资源和本地队列。GOMAXPROCS 控制同时执行 Go 代码的并行度,不是 goroutine 或线程总数。
阻塞系统调用、网络轮询、抢占和工作窃取会改变实际调度。调大 GOMAXPROCS 可能提升 CPU 并行,也可能增加竞争、GC 和下游请求压力。
配置应结合 CPU profile、调度/阻塞 trace、请求 P99、数据库连接和外部配额验证,不能用请求并发或机器核数机械替代。
常见误区
- 误区:把 GOMAXPROCS 设置成请求并发数。改正:它控制 Go 代码的并行执行能力,请求并发由队列、连接和业务限流控制。
- 误区:认为 goroutine 数量受 GOMAXPROCS 限制。改正:goroutine 可以等待在队列中,真正执行的并行度才受 P 和 CPU 影响。
- 误区:只看 CPU 使用率。改正:结合调度、阻塞、GC、锁和下游等待判断。