Saya memiliki masalah yang membingungkan. Saya memiliki perpustakaan yang menggunakan sg untuk mengeksekusi CDB yang disesuaikan. Ada beberapa sistem yang secara rutin memiliki masalah dengan alokasi memori di sg . Biasanya, driver sg memiliki batas keras sekitar 4MB, tetapi kami melihatnya pada beberapa sistem ini dengan ~ 2,3MB permintaan. Artinya, CDB sedang mempersiapkan untuk mengalokasikan untuk transfer 2.3mb. Seharusnya tidak ada masalah di sini: 2.3 <4.0.
Sekarang, profil mesin. Ini adalah CPU 64 bit tetapi menjalankan CentOS 6.0 32-bit (Saya tidak membangunnya juga tidak ada hubungannya dengan keputusan ini). Versi kernel untuk distro CentOS ini adalah 2.6.32. Mereka memiliki 16gb RAM.
Inilah tampilan penggunaan memori pada sistem (meskipun, karena kesalahan ini terjadi selama pengujian otomatis, saya belum memverifikasi apakah ini mencerminkan keadaan ketika errno ini dikembalikan dari sg ).
top - 00:54:46 up 5 days, 22:05, 1 user, load average: 0.00, 0.01, 0.21
Tasks: 297 total, 1 running, 296 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 15888480k total, 9460408k used, 6428072k free, 258280k buffers
Swap: 4194296k total, 0k used, 4194296k free, 8497424k cached
Saya menemukan artikel ini dari Linux Journal yaitu tentang mengalokasikan memori di kernel. Artikel ini bertanggal tetapi tampaknya berkaitan dengan 2.6 (beberapa komentar tentang penulis di kepala). Artikel tersebut menyebutkan bahwa kernel terbatas pada sekitar 1gb memori (meskipun tidak sepenuhnya jelas dari teks jika masing-masing 1gb untuk fisik dan virtual atau total). Saya ingin tahu apakah ini pernyataan yang akurat untuk 2.6.32. Pada akhirnya, saya bertanya-tanya apakah sistem ini mencapai batas ini.
Meskipun ini bukan jawaban untuk masalah saya, saya bertanya-tanya tentang kebenaran klaim 2.6.32. Jadi, berapa batas sebenarnya dari memori untuk kernel? Ini mungkin perlu menjadi pertimbangan untuk pemecahan masalah. Saran lain dipersilahkan. Apa yang membuat ini sangat membingungkan adalah bahwa sistem ini identik dengan banyak lainnya yang tidak menunjukkan masalah yang sama.
sumber
Saya ingin menambahkan sedikit jawaban Warren Young yang luar biasa , karena banyak hal yang sebenarnya lebih buruk daripada yang ditulisnya.
Ruang alamat kernel 1GB dibagi lagi menjadi dua bagian. 128MB untuk
vmalloc
dan 896MB untuklowmem
. Tidak peduli apa artinya itu sebenarnya. Saat mengalokasikan memori, kode kernel harus memilih yang diinginkan. Anda tidak bisa hanya mendapatkan memori dari kolam mana saja yang memiliki ruang kosong.Jika Anda memilih
vmalloc
, Anda dibatasi hingga 128MB. Sekarang 1GB tidak terlihat terlalu buruk ...Jika Anda memilih
lowmem
, Anda dibatasi hingga 896MB. Tidak jauh dari 1GB, tetapi dalam hal ini, semua alokasi dibulatkan ke kekuatan berikutnya dari 2. Jadi alokasi 2.3MB sebenarnya mengkonsumsi 4MB. Selain itu, Anda tidak dapat mengalokasikan lebih dari 4MB dalam satu panggilan saat menggunakanlowmem
.64-bit benar-benar jawaban yang tepat.
sumber