Golang ialah bahasa pengaturcaraan moden berprestasi tinggi yang digunakan secara meluas dalam perkhidmatan rangkaian, pengkomputeran awan, analisis data dan bidang lain. Golang ialah bahasa merentas platform dengan prestasi serentak yang sangat baik, dan mekanisme penyelarasan lalainya juga sangat berkuasa. Secara lalai, Golang menggunakan coroutine Goroutine untuk mencapai konkurensi dan boleh mengendalikan beribu-ribu sambungan serentak dengan mudah. Walau bagaimanapun, jika anda perlu menjalankan program Golang pada CPU berbilang teras, anda perlu membuat beberapa tetapan tambahan.
Artikel ini akan memperkenalkan cara menyediakan berbilang teras di Golang untuk meningkatkan prestasi serentak program.
1. Apakah tetapan berbilang teras?
Tetapan berbilang teras (atau tetapan berbilang pemproses) bermakna apabila menjalankan program Golang pada CPU berbilang teras, dengan menetapkan beberapa parameter pengendalian, program boleh menggunakan sepenuhnya kuasa pemprosesan berbilang CPU -teras, dengan itu meningkatkan prestasi serentak program.
Secara lalai, mekanisme konkurensi Golang hanya akan menggunakan satu teras. Ini kerana penjadual (Scheduler) yang digunakan oleh Golang adalah berdasarkan penjadualan koperasi (Cooperative Scheduling), iaitu hanya apabila Goroutine semasa secara aktif melepaskan pemproses, ia akan bertukar kepada Goroutine lain, sekali gus memastikan hanya terdapat satu Goroutine. pada masa yang sama. Walaupun mekanisme ini mudah dan cekap, ia hanya boleh menggunakan satu teras dan tidak dapat menggunakan sepenuhnya kelebihan prestasi CPU berbilang teras.
Oleh itu, apabila membuat tetapan berbilang teras, beberapa tetapan khas diperlukan untuk membolehkan penjadual Golang menjadualkan Goroutine pada berbilang teras dan mengimbangi beban pada teras yang berbeza, dengan itu meningkatkan prestasi program.
2. Bagaimana untuk menyediakan berbilang teras?
Tetapan berbilang teras di Golang memerlukan penggunaan panggilan sistem terutamanya terdapat tiga fungsi:
Fungsi ini digunakan untuk menetapkan bilangan maksimum teras CPU yang digunakan semasa kod berjalan. Nilai lalainya ialah 1, yang hanya menggunakan satu teras. Jika ditetapkan kepada nilai yang lebih besar daripada 1, Golang akan menjalankan Goroutine pada pemproses berbilang teras. Contohnya:
runtime.GOMAXPROCS(4) //Gunakan 4 teras untuk menjalankan program
Fungsi ini ialah digunakan untuk Goroutine semasa dikunci pada benang semasa, menghalang penjadual daripada menukarnya untuk dijalankan pada benang lain, dengan itu mengurangkan overhed penukaran benang. Contohnya:
func loop() {
runtime.LockOSThread() //锁定当前协程到当前线程 //进行一些处理
}
Fungsi ini digunakan untuk tukar Goroutine semasa dibuka kunci daripada benang semasa supaya ia boleh ditukar oleh penjadual untuk dijalankan pada benang lain. Contohnya:
func loop() {
//进行一些处理 runtime.UnlockOSThread() //解锁当前协程
}
Jika fungsi UnlockOSThread tidak dipanggil, coroutine semasa tidak akan dapat beralih keluar daripada thread semasa .
3. Bagaimana untuk menilai kesan tetapan berbilang teras?
Sebelum membuat tetapan berbilang teras, anda perlu menilai prestasi program semasa dalam persekitaran teras tunggal dan berbilang teras, supaya anda boleh meningkatkan prestasi program melalui tetapan berbilang teras.
Untuk menilai prestasi program, anda boleh menggunakan alat analisis prestasi Go sendiri pprof. pprof boleh menganalisis CPU dan penggunaan memori program untuk mengetahui kesesakan prestasi dalam kod.
Mula-mula anda perlu memasang pprof:
pergi dapatkan -u github.com/google/pprof
2. Jalankan pprof
Untuk menggunakan pprof untuk menganalisis prestasi atur cara, anda perlu menambah kod pemprofilan pada program dan menghidupkannya:
pakej utama
import (
"math/rand" "os" "runtime/pprof" "time"
)
func main() {
pprofFile, err := os.Create("cpu.prof") if err != nil { panic(err) } pprof.StartCPUProfile(pprofFile) defer pprof.StopCPUProfile() rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { go func() { for { num := rand.Intn(1000000000) _ = num * num } }() } time.Sleep(10 * time.Second)
}
Selepas program dijalankan, fail cpu.prof akan dijana dalam direktori semasa, yang mengandungi penggunaan CPU bagi Syarat program. Anda boleh menggunakan arahan berikut untuk analisis:
pprof -http=:9999 cpu.prof
Arahan ini akan memulakan pelayan web, yang boleh diakses dalam penyemak imbas melalui http:// localhost:9999 /access. Pada halaman web, anda boleh melihat penggunaan CPU program, perhubungan panggilan fungsi dan masa panggilan untuk mengenal pasti kesesakan prestasi.
3. Bandingkan prestasi teras tunggal dan berbilang teras
Dengan alat pprof, anda boleh menjalankan program dalam persekitaran teras tunggal dan berbilang teras dan membandingkan prestasinya.
Untuk membandingkan prestasi teras tunggal dan berbilang teras, anda perlu menetapkan parameter GOMAXPROCS semasa menjalankan program:
pergi lari -race -p=1 main.go //Single- core running
go run -race -p=4 main.go //Four-core running
Gunakan pprof untuk melakukan analisis prestasi pada program berjalan dua kali dan bandingkan penggunaan CPU dan bilangan panggilan fungsinya. Dengan membandingkan hasil analisis prestasi, kesesakan prestasi dalam program boleh ditemui dan dioptimumkan.
4. Ringkasan
Golang menjalankan Goroutine pada satu teras secara lalai, yang tidak dapat menggunakan sepenuhnya kuasa pemprosesan CPU berbilang teras. Menjalankan program Golang pada CPU berbilang teras memerlukan tetapan berbilang teras, termasuk menetapkan parameter GOMAXPROCS dan menggunakan fungsi LockOSThread dan UnlockOSThread.
Untuk menilai kesan tetapan berbilang teras, anda boleh menggunakan pprof alat analisis prestasi Go sendiri untuk mengetahui kesesakan prestasi dalam program dan mengoptimumkannya.
Melalui tetapan berbilang teras, anda boleh menggunakan sepenuhnya kuasa pemprosesan CPU berbilang teras, dengan itu meningkatkan prestasi serentak program.
Atas ialah kandungan terperinci tetapan berbilang teras golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!