Apabila VPS anda menjalankan berbilang aplikasi perkhidmatan, tetapi salah satu daripadanya kadangkala mengambil semua sumber, menjadikannya mustahil untuk mengakses pelayan melalui ssh. Anda beralih kepada menggunakan kluster Kubernetes dan tetapkan had untuk semua aplikasi. Kami kemudian melihat beberapa aplikasi dimulakan semula apabila pembunuh OOM membetulkan isu "kebocoran" memori.
Sudah tentu, OOM tidak selalu menjadi masalah kebocoran, ia juga boleh menjadi sumber berlebihan. Masalah kebocoran kemungkinan besar disebabkan oleh ralat program Topik yang kita bicarakan hari ini ialah bagaimana untuk mengelakkan situasi ini.
Penggunaan sumber yang berlebihan merugikan dompet, ini bermakna kita perlu mengambil tindakan segera.
Sekarang mari kita bercakap tentang pengoptimuman. Mudah-mudahan anda boleh memahami mengapa kami tidak perlu mengoptimumkan lebih awal!
Kini kami memberikan beberapa cadangan praktikal mengikut klasifikasi entiti standard dalam Go.
Cuba gunakan parameter ketiga: <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #000000;background: rgba(14, 210, 247, 0.15);"><span style="font-size: 15px;">make([]T, 0, len)</span>
make([]T, 0, len)
Jika bilangan elemen yang tepat tidak diketahui dan hirisan adalah jangka pendek Ya, anda boleh memperuntukkan saiz yang lebih besar untuk memastikan bahawa hirisan tidak berkembang semasa masa jalan.
Jangan lupa gunakan salinanCuba jangan gunakan append semasa menyalin, seperti apabila menggabungkan dua atau lebih kepingan.
Lelaran yang betulSekeping yang mengandungi banyak elemen atau elemen besar, gunakan untuk mendapatkan satu elemen. Dengan cara ini pertindihan yang tidak perlu akan dielakkan.
Multiplexing SlicesJika beberapa operasi dilakukan pada kepingan masuk dan mengembalikan hasil yang diubah suai, kami boleh mengembalikannya. Ini mengelakkan peruntukan memori baharu.
🎜Jika anda perlu memotong sekeping kecil dari hirisan dan menggunakannya sahaja, bahagian utama hirisan juga akan disimpan. Pendekatan yang betul ialah menggunakan salinan baharu kepingan kecil ini dan buang kepingan lama ke GC.
Jika rentetan penyambungan boleh dilakukan dalam satu pernyataan, maka gunakan <code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #000000;background: rgba(14, 210, 247, 0.15);"><span style="font-size: 15px;">+</span>
操作符。如果需要在循环中执行此操作,使用 <span style="font-size: 15px;">string.Builder</span>
,并使用它的 <span style="font-size: 15px;">Grow</span>
方法预先指定 <span style="font-size: 15px;">Builder</span>
的大小,减少内存分配次数。
string 和 []byte 在底层结构上非常相近,有时这两种类型之间可以通过强转换来避免内存分配。
可以池化字符串,从而帮助编译器只存储一次相同的字符串。
我们可以使用 map(级联)而不是复合键,我们可以使用字节切片。尽量不使用 <span style="font-size: 15px;">fmt</span>
+ operator. Jika anda perlu melakukan ini dalam satu gelung, gunakan
🎜string.Builder🎜
🎜 dan gunakan 🎜🎜Grow🎜
🎜 kaedah adalah pra-ditetapkan🎜🎜Builder🎜
🎜 saiz, mengurangkan bilangan peruntukan memori. 🎜🎜🎜Pengoptimuman penukaran🎜🎜🎜rentetan dan []bait sangat serupa dalam struktur asas, dan kadangkala penukaran yang kuat boleh digunakan antara kedua-dua jenis ini untuk mengelakkan peruntukan memori. 🎜🎜🎜String resident🎜🎜🎜 boleh mengumpulkan rentetan, sekali gus membantu pengkompil menyimpan rentetan yang sama sekali sahaja. 🎜🎜🎜Elak peruntukan🎜🎜🎜Kita boleh menggunakan map(cascade) dan bukannya kekunci komposit, kita boleh menggunakan kepingan bait. Cuba jangan gunakan 🎜🎜 fmt 🎜
🎜 pakej, kerana semua kaedahnya menggunakan refleksi. 🎜🎜Kami faham bahawa struktur kecil tidak lebih daripada 4 medan dan tidak lebih daripada satu saiz perkataan mesin.
Beberapa senario salinan biasa
Pembatalan rujukan adalah mahal dan kita harus melakukannya sesedikit mungkin, terutamanya dalam gelung. Ia juga kehilangan keupayaan untuk menggunakan daftar pantas.
Mengendalikan struktur kecilKerja ini dioptimumkan oleh editor, yang bermaksud ia murah.
Gunakan penjajaran untuk mengurangkan saiz strukturKita boleh mengurangkan saiz struktur itu sendiri dengan menjajarkan struktur (susun mengikut susunan yang betul mengikut saiz medan). . Ini benar terutamanya untuk laluan panas.
Namakan nilai pulangan
Simpan hasil perantaraan
Gunakan tangguh dengan berhati-hati
Bantu laluan panas
5 Peta
Peruntukkan memori terlebih dahulupeta hanya boleh membesar, tidak mengecut. Apabila kita perlu menetapkan semula peta, memadamkan semua elemennya tidak akan membantu.
Jika peta tidak mengandungi penunjuk, maka GC tidak akan membuang masa yang berharga di atasnya. Rentetan juga menggunakan penunjuk, jadi anda harus menggunakan tatasusunan bait dan bukannya rentetan sebagai kunci.
Sekali lagi, kami tidak mahu menggunakan penunjuk, tetapi kami boleh menggunakan gabungan peta dan kepingan, menyimpan kekunci dalam peta dan nilai dalam kepingan. Dengan cara ini kita boleh menukar nilai tanpa sekatan. . Kuncinya ialah menyalin. Ternyata kos tinju dan membuka kotak antara muka akan lebih kurang sama dengan peruntukan saiz struktur.
Elakkan peruntukan memori
Seperti di tempat lain, cuba elakkan peruntukan yang tidak perlu. Contohnya memberikan satu antara muka kepada yang lain dan bukannya bertinju dua kali.Gunakan hanya apabila diperlukan
Elakkan menggunakan antara muka dalam parameter fungsi yang sering dipanggil dan kembalikan hasil. Kami tidak memerlukan operasi pembongkaran tambahan. Kurangkan kekerapan menggunakan panggilan kaedah antara muka kerana ia menghalang sebaris.7. Penunjuk, Saluran, Semakan Had
Terutamanya dalam gelung kerana ia ternyata terlalu mahal. Penyahrujukan adalah sesuatu yang kami tidak mahu lakukan dengan perbelanjaan kami sendiri.
Penyegerakan saluran adalah lebih perlahan daripada kaedah primitif penyegerakan yang lain. Di samping itu, lebih banyak kes dalam pilihan, lebih perlahan program kami. Walau bagaimanapun, pilih, huruf besar tambah lalai telah dioptimumkan.
Ini juga mahal dan kita harus mengelakkannya. Sebagai contoh, semak (dapatkan) indeks hirisan maksimum sekali sahaja, bukan beberapa kali. Sebaiknya cuba dapatkan pilihan yang melampau sekarang.
Sepanjang artikel ini, kami melihat beberapa peraturan pengoptimuman yang sama.
Bantu penyusun membuat keputusan yang betul dan ia akan berterima kasih kepada anda. Peruntukkan memori pada masa penyusunan, gunakan hasil perantaraan dan cuba pastikan kod anda boleh dibaca.
Saya mengulangi bahawa untuk pengoptimuman tersirat, penanda aras adalah wajib. Jika sesuatu yang berfungsi semalam tidak akan berfungsi esok kerana pengkompil berubah terlalu cepat antara versi, dan sebaliknya.
Jangan lupa untuk menggunakan alat analisis dan penjejakan terbina dalam Go.
Atas ialah kandungan terperinci Pergi: Nota pengoptimuman mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!