Rumah Tutorial sistem LINUX Optimumkan operasi peruntukan memori curl

Optimumkan operasi peruntukan memori curl

Dec 27, 2023 pm 02:23 PM
linux tutorial linux Topi Merah sistem linux arahan linux pensijilan linux linux topi merah video linux

Hari ini saya membuat satu lagi perubahan kecil dalam libcurl[1] untuk menjadikannya kurang mallocs. Kali ini, fungsi senarai terpaut generik ditukar kepada kurang malloc (begitulah fungsi senarai terpaut, sebenarnya).

Penyelidikan malloc

Beberapa minggu lalu saya mula meneliti peruntukan memori. Ini mudah kerana kami mempunyai sistem penyahpepijatan dan pengelogan memori dalam curl selama bertahun-tahun. Gunakan versi nyahpepijat curl dan jalankan skrip ini dalam direktori binaan saya:

#!/bin/sh
export CURL_MEMDEBUG=$HOME/tmp/curlmem.log
./src/curl http://localhost
./tests/memanalyze.pl -v $HOME/tmp/curlmem.log
Salin selepas log masuk

Untuk curl 7.53.1, ini adalah lebih kurang 115 peruntukan memori. Adakah ini terlalu banyak atau terlalu sedikit?

Log memori adalah sangat asas. Untuk memberi anda idea, berikut adalah contoh coretan:

MEM getinfo.c:70 free((nil))
MEM getinfo.c:73 free((nil))
MEM url.c:294 free((nil))
MEM url.c:297 strdup(0x559e7150d616) (24) = 0x559e73760f98
MEM url.c:294 free((nil))
MEM url.c:297 strdup(0x559e7150d62e) (22) = 0x559e73760fc8
MEM multi.c:302 calloc(1,480) = 0x559e73760ff8
MEM hash.c:75 malloc(224) = 0x559e737611f8
MEM hash.c:75 malloc(29152) = 0x559e737a2bc8
MEM hash.c:75 malloc(3104) = 0x559e737a9dc8
Salin selepas log masuk
Semak log

Kemudian saya menggali lebih dalam ke dalam log dan saya menyedari bahawa banyak peruntukan memori kecil dibuat pada baris kod yang sama. Kami jelas mempunyai beberapa corak kod yang agak bodoh di mana kami memperuntukkan struct, kemudian menambah struct itu pada senarai terpaut atau cincang, dan kemudian kod itu kemudian menambah satu lagi struct kecil, dan seterusnya, sering melakukannya dalam gelung. (Apa yang saya katakan di sini ialah kita, bukan untuk menyalahkan sesiapa, sudah tentu sebahagian besar tanggungjawab terletak pada diri saya sendiri...)

Kedua-dua operasi peruntukan ini akan sentiasa berlaku secara berpasangan dan dikeluarkan pada masa yang sama. Saya memutuskan untuk menyelesaikan masalah ini. Melakukan peruntukan yang sangat kecil (kurang daripada 32 bait) juga membazir, kerana banyak data akan digunakan (dalam sistem malloc) untuk menjejaki kawasan memori yang kecil itu. Apatah lagi timbunan serpihan.

Jadi membetulkan cincang dan kod senarai terpaut untuk tidak menggunakan malloc ialah cara yang cepat dan mudah untuk menghapuskan lebih 20% daripada malloc untuk pemindahan "curl http://localhost" yang paling mudah.

Pada ketika ini, saya mengisih semua operasi peruntukan memori mengikut saiz dan menyemak semua operasi peruntukan terkecil. Bahagian yang menonjol adalah dalam curl_multi_wait(), iaitu fungsi yang biasanya dipanggil berulang kali dalam gelung pemindahan curl utama. Untuk kebanyakan kes biasa, saya menukar ini kepada menggunakan tindanan [2]. Adalah satu perkara yang baik untuk mengelakkan malloc dalam banyak panggilan fungsi berulang.

Bercerita

Kini, seperti yang ditunjukkan dalam skrip di atas, arahan curl localhost yang sama telah digugurkan daripada 115 operasi peruntukan dengan curl 7.53.1 kepada 80 operasi peruntukan tanpa mengorbankan apa-apa. Penambahbaikan 26% dengan mudah. Tidak teruk sama sekali!

Sejak saya mengubah suai curl_multi_wait(), saya juga ingin melihat bagaimana ia sebenarnya menambah baik beberapa pemindahan yang lebih maju sedikit. Saya menggunakan kod contoh multi-double.c[3], menambah panggilan untuk memulakan rekod memori, menjadikannya menggunakan curl_multi_wait(), dan memuat turun kedua-dua URL ini secara selari:

http://www.example.com/
http://localhost/512M
Salin selepas log masuk

Fail kedua ialah 512 megabait sifar dan fail pertama ialah halaman html awam 600 bait. Ini ialah kod count-malloc.c[4].

Mula-mula, saya menggunakan 7.53.1 untuk menguji contoh di atas dan menyemak menggunakan skrip memanalyze:

Mallocs: 33901
Reallocs: 5
Callocs: 24
Strdups: 31
Wcsdups: 0
Frees: 33956
Allocations: 33961
Maximum allocated: 160385
Salin selepas log masuk

Baiklah, jadi ia menggunakan sejumlah 160KB memori dan lebih 33900 operasi peruntukan. Dan ia memuat turun lebih 512 megabait data, jadi ia mempunyai malloc setiap 15KB data. Adakah ia baik atau buruk?

Kembali ke dalam git master, ia kini versi 7.54.1-DEV - memandangkan kami tidak pasti nombor versi yang akan digunakan apabila kami mengeluarkan versi seterusnya. Ia boleh jadi 7.54.1 atau 7.55.0, ia belum disahkan lagi. Saya menyimpang, saya menjalankan contoh multi-double.c yang diubah suai sekali lagi, menjalankan memanalyze pada log memori sekali lagi, dan inilah laporannya:

Mallocs: 69
Reallocs: 5
Callocs: 24
Strdups: 31
Wcsdups: 0
Frees: 124
Allocations: 129
Maximum allocated: 153247
Salin selepas log masuk

Saya menontonnya dua kali kerana tidak percaya. Apa yang berlaku? Untuk menyemak semula, lebih baik saya jalankan semula. Tidak kira berapa kali saya menjalankannya, hasilnya tetap sama.

33961 lwn 129

Dalam pemindahan biasa curl_multi_wait() dipanggil berkali-kali, dan sekurang-kurangnya satu operasi peruntukan memori biasanya berlaku semasa pemindahan, jadi mengalih keluar operasi peruntukan kecil tunggal itu mempunyai kesan yang sangat besar pada kaunter. Pemindahan biasa juga melakukan beberapa data bergerak masuk dan keluar daripada senarai terpaut dan operasi cincang, tetapi kebanyakannya kini bebas malloc juga. Ringkasnya: operasi peruntukan yang selebihnya tidak dilakukan dalam gelung pemindahan, jadi ia tidak penting.

Keriting sebelumnya memperuntukkan 263 kali ganda bilangan operasi sebagai contoh semasa. Dalam erti kata lain: yang baharu ialah 0.37% daripada bilangan operasi peruntukan yang lama.

另外还有一点好处,新的内存分配量更少,总共减少了 7KB(4.3%)。

malloc 重要吗?

在几个 G 内存的时代里,在传输中有几个 malloc 真的对于普通人有显著的区别吗?对 512MB 数据进行的 33832 个额外的 malloc 有什么影响?

为了衡量这些变化的影响,我决定比较 localhost 的 HTTP 传输,看看是否可以看到任何速度差异。localhost 对于这个测试是很好的,因为没有网络速度限制,更快的 curl 下载也越快。服务器端也会相同的快/慢,因为我将使用相同的测试集进行这两个测试。

我相同方式构建了 curl 7.53.1 和 curl 7.54.1-DEV,并运行这个命令:

curl http://localhost/80GB -o /dev/null
Salin selepas log masuk

下载的 80GB 的数据会尽可能快地写到空设备中。

我获得的确切数字可能不是很有用,因为它将取决于机器中的 CPU、使用的 HTTP 服务器、构建 curl 时的优化级别等,但是相对数字仍然应该是高度相关的。新代码对决旧代码!

7.54.1-DEV 反复地表现出更快 30%!我的早期版本是 2200MB/秒增加到当前版本的超过 2900 MB/秒。

这里的要点当然不是说它很容易在我的机器上使用单一内核以超过 20GB/秒的速度来进行 HTTP 传输,因为实际上很少有用户可以通过 curl 做到这样快速的传输。关键在于 curl 现在每个字节的传输使用更少的 CPU,这将使更多的 CPU 转移到系统的其余部分来执行任何需要做的事情。或者如果设备是便携式设备,那么可以省电。

关于 malloc 的成本:512MB 测试中,我使用旧代码发生了 33832 次或更多的分配。旧代码以大约 2200MB/秒的速率进行 HTTP 传输。这等于每秒 145827 次 malloc - 现在它们被消除了!600 MB/秒的改进意味着每秒钟 curl 中每个减少的 malloc 操作能额外换来多传输 4300 字节。

去掉这些 malloc 难吗?

一点也不难,非常简单。然而,有趣的是,在这个旧项目中,仍然有这样的改进空间。我有这个想法已经好几年了,我很高兴我终于花点时间来实现。感谢我们的测试套件,我可以有相当大的信心做这个“激烈的”内部变化,而不会引入太可怕的回归问题。由于我们的 API 很好地隐藏了内部,所以这种变化可以完全不改变任何旧的或新的应用程序……

(是的,我还没在版本中发布该变更,所以这还有风险,我有点后悔我的“这很容易”的声明……)

注意数字

curl 的 git 仓库从 7.53.1 到今天已经有 213 个提交。即使我没有别的想法,可能还会有一次或多次的提交,而不仅仅是内存分配对性能的影响。

还有吗?

还有其他类似的情况么?

也许。我们不会做很多性能测量或比较,所以谁知道呢,我们也许会做更多的愚蠢事情,我们可以收手并做得更好。有一个事情是我一直想做,但是从来没有做,就是添加所使用的内存/malloc 和 curl 执行速度的每日“监视” ,以便更好地跟踪我们在这些方面不知不觉的回归问题。

补遗,4/23

(关于我在 hacker news、Reddit 和其它地方读到的关于这篇文章的评论)

有些人让我再次运行那个 80GB 的下载,给出时间。我运行了三次新代码和旧代码,其运行“中值”如下:

旧代码:

real    0m36.705s
user    0m20.176s
sys     0m16.072s
Salin selepas log masuk

新代码:

real    0m29.032s
user    0m12.196s
sys     0m12.820s
Salin selepas log masuk

承载这个 80GB 文件的服务器是标准的 Apache 2.4.25,文件存储在 SSD 上,我的机器的 CPU 是 i7 3770K 3.50GHz 。

有些人也提到 alloca() 作为该补丁之一也是个解决方案,但是 alloca() 移植性不够,只能作为一个孤立的解决方案,这意味着如果我们要使用它的话,需要写一堆丑陋的 #ifdef


Atas ialah kandungan terperinci Optimumkan operasi peruntukan memori curl. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

DeepSeek Web Versi Pintu Masuk Laman Web Rasmi DeepSeek DeepSeek Web Versi Pintu Masuk Laman Web Rasmi DeepSeek Feb 19, 2025 pm 04:54 PM

DeepSeek adalah alat carian dan analisis pintar yang kuat yang menyediakan dua kaedah akses: versi web dan laman web rasmi. Versi web adalah mudah dan cekap, dan boleh digunakan tanpa pemasangan; Sama ada individu atau pengguna korporat, mereka dapat dengan mudah mendapatkan dan menganalisis data besar-besaran melalui DeepSeek untuk meningkatkan kecekapan kerja, membantu membuat keputusan dan menggalakkan inovasi.

Cara Memasang DeepSeek Cara Memasang DeepSeek Feb 19, 2025 pm 05:48 PM

Terdapat banyak cara untuk memasang DeepSeek, termasuk: Menyusun dari Sumber (untuk pemaju berpengalaman) menggunakan pakej yang dikompilasi (untuk pengguna Windows) menggunakan bekas docker (untuk yang paling mudah, tidak perlu bimbang tentang keserasian) Dokumen rasmi dengan berhati -hati dan menyediakannya sepenuhnya untuk mengelakkan masalah yang tidak perlu.

Pemasangan Laman Web Rasmi Bitget (Panduan Pemula 2025) Pemasangan Laman Web Rasmi Bitget (Panduan Pemula 2025) Feb 21, 2025 pm 08:42 PM

Bitget adalah pertukaran cryptocurrency yang menyediakan pelbagai perkhidmatan perdagangan termasuk perdagangan tempat, perdagangan kontrak dan derivatif. Ditubuhkan pada tahun 2018, pertukaran itu beribu pejabat di Singapura dan komited untuk menyediakan pengguna dengan platform perdagangan yang selamat dan boleh dipercayai. Bitget menawarkan pelbagai pasangan perdagangan, termasuk BTC/USDT, ETH/USDT dan XRP/USDT. Di samping itu, pertukaran mempunyai reputasi untuk keselamatan dan kecairan dan menawarkan pelbagai ciri seperti jenis pesanan premium, perdagangan leverage dan sokongan pelanggan 24/7.

Pakej pemasangan OUYI OKX disertakan secara langsung Pakej pemasangan OUYI OKX disertakan secara langsung Feb 21, 2025 pm 08:00 PM

Ouyi Okx, pertukaran aset digital terkemuka di dunia, kini telah melancarkan pakej pemasangan rasmi untuk menyediakan pengalaman perdagangan yang selamat dan mudah. Pakej pemasangan OKX OUYI tidak perlu diakses melalui penyemak imbas. Proses pemasangan adalah mudah dan mudah difahami.

Dapatkan Pakej Pemasangan Gate.io secara percuma Dapatkan Pakej Pemasangan Gate.io secara percuma Feb 21, 2025 pm 08:21 PM

Gate.io adalah pertukaran cryptocurrency yang popular yang boleh digunakan pengguna dengan memuat turun pakej pemasangannya dan memasangnya pada peranti mereka. Langkah -langkah untuk mendapatkan pakej pemasangan adalah seperti berikut: Lawati laman web rasmi Gate.io, klik "Muat turun", pilih sistem operasi yang sepadan (Windows, Mac atau Linux), dan muat turun pakej pemasangan ke komputer anda. Adalah disyorkan untuk mematikan perisian antivirus atau firewall sementara semasa pemasangan untuk memastikan pemasangan yang lancar. Selepas selesai, pengguna perlu membuat akaun Gate.io untuk mula menggunakannya.

Portal rasmi muat turun Ouyi Exchange Portal rasmi muat turun Ouyi Exchange Feb 21, 2025 pm 07:51 PM

Ouyi, juga dikenali sebagai Okx, adalah platform perdagangan cryptocurrency terkemuka di dunia. Artikel ini menyediakan portal muat turun untuk pakej pemasangan rasmi Ouyi, yang memudahkan pengguna memasang klien OUYI pada peranti yang berbeza. Pakej pemasangan ini menyokong sistem Windows, Mac, Android dan iOS. Selepas pemasangan selesai, pengguna boleh mendaftar atau log masuk ke akaun OUYI, mula membuat kriptografi perdagangan dan nikmati perkhidmatan lain yang disediakan oleh platform.

Pautan Pemasaran Pemasangan Pendaftaran Laman Web Gate.io Pautan Pemasaran Pemasangan Pendaftaran Laman Web Gate.io Feb 21, 2025 pm 08:15 PM

Gate.io adalah platform perdagangan cryptocurrency yang sangat terkenal yang dikenali sebagai pemilihan token yang luas, yuran transaksi yang rendah dan antara muka yang mesra pengguna. Dengan ciri -ciri keselamatan lanjutan dan perkhidmatan pelanggan yang cemerlang, Gate.io menyediakan peniaga dengan persekitaran perdagangan cryptocurrency yang boleh dipercayai dan mudah. Jika anda ingin menyertai Gate.io, sila klik pautan yang disediakan untuk memuat turun pakej pemasangan pendaftaran rasmi untuk memulakan perjalanan perdagangan cryptocurrency anda.

Bagaimana cara memasang phpmyadmin dengan nginx di Ubuntu? Bagaimana cara memasang phpmyadmin dengan nginx di Ubuntu? Feb 07, 2025 am 11:12 AM

Tutorial ini membimbing anda melalui memasang dan mengkonfigurasi nginx dan phpmyadmin pada sistem Ubuntu, berpotensi bersama pelayan Apache yang sedia ada. Kami akan meliputi penubuhan nginx, menyelesaikan potensi konflik pelabuhan dengan Apache, memasang MariaDB (

See all articles