学校自己做的网站需要买服务器吗建设部网站上标准合同
2026/6/10 3:15:34 网站建设 项目流程
学校自己做的网站需要买服务器吗,建设部网站上标准合同,logo免费自动生成器,怎么看网站有没有被收录大家好#xff0c;我是煎鱼。今天给大家分享的是 Go1.26 即将引入的一个重磅特性—— Goroutine 调度指标。这个特性看似不起眼#xff0c;但对生产环境的可观测性来说#xff0c;非常重要。值得升级。背景说起 Go 的 runtime/metrics 包#xff0c;相信做过性能调优的同学…大家好我是煎鱼。今天给大家分享的是 Go1.26 即将引入的一个重磅特性—— Goroutine 调度指标。这个特性看似不起眼但对生产环境的可观测性来说非常重要。值得升级。背景说起 Go 的 runtime/metrics 包相信做过性能调优的同学都不陌生。这个包从 Go1.16 就开始提供各种运行时的统计数据像内存分配、GC 情况等。很无奈的是这么多年过去了关于 Goroutine 调度器的 metrics 指标一直是空白的。一些痛点我们来看看实际开发中的痛点。如果线上服务突然变慢了打开 Grafana 监控一看CPU 使用率正常。内存也没问题。GC 次数也在合理范围。问题出在哪很可能是 Goroutine 调度出了问题从而引发了一些异常点。 但你没法直接观测到到底创建了多少个 Goroutine有多少 Goroutine 在排队等待执行有没有 Goroutine 卡在系统调用里出不来线程数是不是爆了“新” 提案这就很尴尬了。早在 2016 年就有开发者在 issue #15490 中提出这个需求。在即将 2026 年倒是实现了。描述的需求很简单“MemStats 提供了一种监控内存分配和 GC 的方式我们也需要一个类似的工具来监控 Goroutine 调度器。”简单来讲提案的诉求就是需要能看到总共创建了多少 Goroutine。当前有多少 Goroutine。启动了多少线程。Goroutine 从就绪到运行的延迟情况。这个提案一提就是快 10 年Go 核心团队终于在 Go1.26 要把它落地了。新的 Goroutine 调度指标接下来我们看下具体新增了哪些指标。Go1.26 在 runtime/metrics 包中新增了 6 个关于 Goroutine 和线程的指标:从程序启动到现在总共创建的 Goroutine 数量/sched/goroutines-created:goroutines。处于系统调用或 cgo 调用中的 Goroutine 数量(近似值)/sched/goroutines/not-in-go:goroutines。已就绪但还没执行的 Goroutine 数量(近似值)/sched/goroutines/runnable:goroutines。正在执行的 Goroutine 数量(近似值)/sched/goroutines/running:goroutines。等待某个资源的 Goroutine 数量(近似值)例如等 I/O/sched/goroutines/waiting:goroutines。当前 Go runtime 拥有的活跃线程数/sched/threads/total:threads。这里有几个点需要注意:1、按状态统计的 Goroutine 数量都标注了近似值。为什么是近似的因为 Goroutine 的状态切换非常频繁Go runtime 不可能为了统计精确值而加锁那样会严重影响性能。所以这些数字可能有一点点偏差但对监控来说已经足够了。2、按状态分类的数量加起来不一定等于当前存活的 Goroutine 总数(/sched/goroutines:goroutines)。这也是因为采样时机的问题。3、所有指标都使用 uint64 类型的计数器。使用例子后面新版本发布后我们来看下怎么用这些新指标。假设我们写了一个简单的程序启动了一些 Goroutine 做各种事情package main import ( fmt runtime/metrics time ) func main() { // 启动一些 Goroutine 模拟真实场景 go work() // 等待 100ms 让 Goroutine 跑一会儿 time.Sleep(100 * time.Millisecond) // 打印 Goroutine 相关指标 fmt.Println(Goroutine 调度指标:) printMetric(/sched/goroutines-created:goroutines, 累计创建) printMetric(/sched/goroutines:goroutines, 当前存活) printMetric(/sched/goroutines/not-in-go:goroutines, 系统调用/CGO) printMetric(/sched/goroutines/runnable:goroutines, 等待执行) printMetric(/sched/goroutines/running:goroutines, 正在执行) printMetric(/sched/goroutines/waiting:goroutines, 等待资源) // 打印线程相关指标 fmt.Println(\n线程指标:) printMetric(/sched/gomaxprocs:threads, 最大 P 数量) printMetric(/sched/threads/total:threads, 当前线程数) } func printMetric(name string, descr string) { sample : []metrics.Sample{{Name: name}} metrics.Read(sample) // 这里为了演示简化了错误处理 // 实际生产环境要检查 sample[0].Value.Kind fmt.Printf( %s: %v\n, descr, sample[0].Value.Uint64()) } func work() { // 这里省略具体的工作逻辑 // 可能是网络请求、计算任务等 }运行后输出大概是这样:Goroutine 调度指标: 累计创建: 52 当前存活: 12 系统调用/CGO: 0 等待执行: 0 正在执行: 4 等待资源: 8 线程指标: 最大 P 数量: 8 当前线程数: 4可以看到程序累计创建了 52 个 Goroutine当前还存活 12 个。其中 4 个正在执行8 个在等待某些资源(可能是 channel、锁、或者 I/O)没有 Goroutine 卡在系统调用里也没有 Goroutine 在排队等待执行。读取这些指标的方式和之前的runtime/metrics完全一样都是通过metrics.Read来获取。使用上基本没有难度。总结这个提案从 2016 年提出到现在社区一直呼声很高。Go 核心团队成员 Michael Knyszek 最终在 2024 年底推动了这个特性的实现相关的 CL(Change List)已经提交。这个特性虽然 API 很简单但对生产环境的可观测性意义重大。有了这些指标我们终于能直接观测到 Goroutine 的调度状态不用再猜来猜去了。等 Go1.26 正式发布后大家可以第一时间把这些指标用起来相信会对大家定位生产问题有不小的帮助。关注和加煎鱼微信一手消息和知识拉你进技术交流群你好我是煎鱼出版过 Go 畅销书《Go 语言编程之旅》再到获得 GOPGo 领域最有观点专家荣誉点击蓝字查看我的出书之路。日常分享高质量文章输出 Go 面试、工作经验、架构设计加微信拉读者交流群和大家交流原创不易 点赞支持

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询