Goプログラムのホットスイッチ機能をよりかっこよく実装する方法
新しいソリューションを紹介する前に、Go プログラムで pprof がどのように実行されるかを確認しましょう。
インターフェイス呼び出し
プログラムのパフォーマンス サンプリングは、そのサービス機能に影響を与える可能性があります。したがって、オンライン サンプリングは通常、指定された短い時間範囲内で実行され、効果的なスイッチ制御が必要です。
これを実現するために、通常、net/http/pprof パッケージ (その init 関数はルーティング関数関数にバインドされています) をコードに導入します。指定ポートのHTTPサービスに外部からアクセスするとサンプリング機能がオンになり、サンプリング時間が経過すると収集がオフになります。
実装コードは以下の通りです
package main import ( "net/http" _ "net/http/pprof" ) func main() { go func() { _ = http.ListenAndServe(":8080", nil) }() ... }
もちろんこのやり方でも問題ありません。これを学習して、他のスイッチ機能を HTTP サービスに組み込むことができます。しかし、他にもっとクールな方法はあるでしょうか?
信号通知
在信号处理与 Go 程序的优雅退出一文中,我们谈论过信号机制,它用以向应用程序发送某种事件通知。
我们可以将基于接口触发的方式改为信号通知。
首先,构造采样功能函数(对应于 net/http/pprof 包下 init 函数中绑定的路由功能函数)。
func RegisterSignalForProfiling(sig os.Signal) { ch := make(chan os.Signal) started := false signal.Notify(ch, sig) go func() { var memoryProfile, cpuProfile, traceProfile *os.File for range ch { if started { pprof.StopCPUProfile() trace.Stop() pprof.WriteHeapProfile(memoryProfile) memoryProfile.Close() cpuProfile.Close() traceProfile.Close() started = false } else { cpuProfile, _ = os.Create("cpu.pprof") memoryProfile, _ = os.Create("memory.pprof") traceProfile, _ = os.Create("runtime.trace") pprof.StartCPUProfile(cpuProfile) trace.Start(traceProfile) started = true } } }() }
在上述函数中,我们定义了接收信号通道<span style="font-size: 15px;">ch</span>
,通过<span style="font-size: 15px;">signal.Notify(ch, sig)</span>
将指定的通知信号<span style="font-size: 15px;">sig</span>
与<span style="font-size: 15px;">ch</span>
进行绑定。<span style="font-size: 15px;">for range ch</span>
将阻塞等待外部信号<span style="font-size: 15px;">sig</span>
,随着<span style="font-size: 15px;">sig</span>
信号的到来,交替进入开启或关闭采样的逻辑。
在<span style="font-size: 15px;">main</span>
函数中,就可以这样替代<span style="font-size: 15px;">http.ListenAndServe(":8080", nil)</span>
了。
package main import ( "syscall" ... ) func main() { RegisterSignalForProfiling(syscall.Signal(31)) ... }
在 linux 系统,可以通过<span style="font-size: 15px;">kill -signal_number pid</span>
命令向程序发送指定信号。
如上代码所示,我们硬编码指定的采样开关信号值是 31。因此,当程序运行起来后,我们在控制台输入<span style="font-size: 15px;">kill -31 pid</span>
命令,即可开启采样,再次输入<span style="font-size: 15px;">kill -31 pid</span>
命令,就关闭了采样。
依葫芦画瓢,我们再来一个打印 goroutine 堆栈信息的热开关函数,是不是很酷?
func RegisterSignalForPrintStack(sig os.Signal) { ch := make(chan os.Signal) signal.Notify(ch, sig) go func() { for range ch { buffer := make([]byte, 1024*1024*4) runtime.Stack(buffer, true) fmt.Println(string(buffer)) } }() }
总结
热开关是一个很简单常用的功能,无非是选择何种触发与等待方式。基于接口的调用更适合于远程控制,基于信号则便于本地控制。
以上がGoプログラムのホットスイッチ機能をよりかっこよく実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









開発中、サーマル スイッチが必要になることがよくあります。つまり、プログラムの実行中に適切なタイミングで特定の機能をオンまたはオフにすることができます。たとえば、パフォーマンス分析で使用される pprof サンプリングは、典型的なサーマル スイッチです。この記事では、このサーマル スイッチを冷却する方法について説明します。

アプリケーションの実行メトリクスを取得すると、アプリケーションが実際にどのように動作しているかをより深く理解できるようになります。これらのインジケーターをprometheusやzabbixなどの監視システムと接続することで、アプリケーションを継続的に検出し、タイムリーな異常の警告や対処が可能になります。

Go は、他のプログラミング言語と比べてコンパイルが速く、メモリ消費量が少ない人気のプログラミング言語です。ただし、依存関係が欠落しているために Go プログラムがコンパイルに失敗することがあります。では、なぜこのようなことが起こるのでしょうか?まず、Go コンパイルの原則を理解する必要があります。 Go は静的にコンパイルされる言語です。つまり、プログラムはコンパイル中にマシンコードに変換され、直接実行されます。動的にコンパイルされる言語と比較すると、使用するすべてのパッケージをコンパイル前に変換する必要があるため、Go のコンパイル プロセスはより複雑です。

最近、GoQUIC を使用して Web アプリケーションを構築する人が増えています。 GoQUIC は、その効率的な伝送パフォーマンスと信頼性により、多くのプロジェクトの最初の選択肢となっています。しかし、実際の使用中に、一部の開発者は、Go プログラムが GoQUIC ライブラリを正しく使用できないことに気づきました。次に、Go プログラムが GoQUIC ライブラリを正常に使用できない原因を分析してみましょう。 1. バージョンの問題 まず、GoQUIC のバージョンが最新であることを確認する必要があります。 GoQUIC は頻繁に更新されます。

会社が発展し続けるにつれて、最初は大規模なユニットがほとんどで、変化は遅く、倉庫は10年以上使用され、倉庫の規模は基本的に継続的に増加するプロセスです。

Golang (Go) は、エラーと例外の処理に非常に優れた言語です。他の言語とは異なり、Go はシンプルかつ効果的なエラー処理メカニズムを通じて例外を処理します。 Go のエラー処理メカニズムは非常に強力で柔軟ですが、一部のプログラマーは依然としてエラー処理をプログラムに実装するのに苦労しています。この記事は、Go プログラムの例外処理が機能しない理由と、例外状況を正しく処理する方法についての質問に対処するのに役立つことを目的としています。 Go での非効果的な例外処理は、通常、プログラマーがエラーを正しく処理しなかったり、間違いを犯したりすることが原因で発生します。

Go は、メモリ管理のための特別なメカニズムを提供する効率的なプログラミング言語です。ただし、この言語を使用している場合でも、「メモリ不足」エラーなどの問題が発生する可能性があります。では、なぜ Go プログラムでこのエラーが発生するのでしょうか?メモリ リーク メモリ リークは一般的な問題であり、Go 言語にも存在します。メモリ リークは、Go プログラムが大量のメモリを割り当て、特定の操作の実行後にメモリを完全に解放しない場合に発生します。メモリリークが発生した場合

Go言語を使って開発を進めていくと、様々なエラーが発生することは避けられません。一般的なエラーの 1 つは「コアダンプ」であり、このエラー メッセージは一部の開発者にとって混乱を招く可能性があります。この記事では、このエラーの原因と修正方法について説明します。 「コアダンプ」の意味 Linux オペレーティング システムでは、「コアダンプ」は、実行中にプロセスが予期せず終了し、いわゆる「コア」ファイルが生成されたことを示すエラー メッセージです。これ
