ukuran buffer kurang maksimal?

0

Saya mengacaukan sistem saya dan menemukan cara baru untuk menggunakan memori, tetapi tampaknya semakin sedikit perintah yang hanya menahan jumlah data terbatas sebelum menghentikan / membunuh perintah.

Untuk menguji, jalankan (hati-hati! Menggunakan banyak memori sistem dengan sangat cepat!)

$ cat /dev/zero | less

Dari pengujian saya, sepertinya perintah itu terbunuh setelah kurang mencapai 2,5 gigabytes memori, tetapi saya tidak dapat menemukan apa pun di halaman manual yang menunjukkan bahwa itu akan membatasi dengan cara seperti itu.

Selain itu, saya tidak dapat menemukan dokumentasi apa pun melalui google tentang masalah ini.

Cahaya apa pun untuk penemuan yang cukup mengejutkan ini akan luar biasa!

Informasi Sistem: Quad core intel i7, ram 8gb.

$ uname -a
Linux Tyler-Work 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

$ less --version
less 458 (GNU regular expressions)
Copyright (C) 1984-2012 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04 LTS 
Release:    14.04
Codename:   trusty

Memperbarui:

Semakin sedikit proses bertahan setelah mencapai penggunaan 2,5 GB ram, tetapi berhenti mengumpulkan input dari output proses yang disalurkan. Memeriksa nilai pengembalian menunjukkan bahwa proses cat dihabisi oleh sinyal dari less.

$ cat /dev/zero | less; echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
141 0

Status keluar 141 menunjukkan bahwa lebih sedikit yang mematikan proses kucing melalui SIGPIPE ( https://stackoverflow.com/questions/19120263/why-exit-code-141-with-grep-q#answer-19120674 )

Mengumpulkan informasi dari executable itu sendiri menunjukkan bahwa semakin sedikit binernya yang 64bit, jadi itu tidak boleh dibatasi dalam jumlah ram yang dapat digunakan:

$ file /bin/less
/bin/less: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=539cf624699477e3e069b6c4e4b33842f22be2d2, stripped

Yang tidak menjelaskan mengapa lebih sedikit mengirimkan sinyal mematikan ke proses kucing sebagai jumlah data tertentu ini.

Tyzoid
sumber
Secara teknis lebih sedikit tidak mengirim sinyal, kernel sekali melihat bahwa satu-satunya pembaca ke pipa (kurang) tidak lebih.
Rich Homolka
@RichHomolka Ya, tapi semakin sedikit proses yang terjadi setelahnya, seperti dibuktikan oleh :prompt, setelah itu menekan qmenyebabkan lebih sedikit berhenti seperti biasa.
Tyzoid

Jawaban:

1

Mungkin ada beberapa hal, kode sumber yang kurang akan memberi Anda lebih banyak wawasan tentang apa yang terjadi.

Apakah kurang dari aplikasi 32 bit? Jika demikian, maka, tergantung pada konfigurasi kernel Anda, Anda mungkin memiliki 3gb, 3,5 gb, atau (hanya di bawah) 4 gb ruang pengguna.

kurang mungkin melakukan malloc () dari memori, ke apa yang disebut heap. Apa batas tumpukan? Itu tergantung pada konfigurasi kernel dan faktor lainnya. Pada titik tertentu, kurang mungkin meminta memori dan sistem mengatakan tidak bisa mendapatkannya. Ia berpikir, "Saya tidak bisa mendapatkan memori, saya tidak bisa maju, saya benar-benar harus berhenti karena saya tidak bisa mengikuti garis".

Kenapa di 2.5G? Entahlah, kadang-kadang pengalokasian tumpukan Anda tidak sepenuhnya efisien. Anda mungkin telah mengatakan 3Gb gratis, tetapi karena Anda harus menyesuaikan potongan, Anda secara efektif mendapatkan jumlah alokasi yang lebih rendah, dengan beberapa ruang kosong ditampilkan. Saya ingat satu program yang kami miliki yang baru saja menggunakan 2GB tumpukan 3.5Gb. Alokasi kecil memecah tumpukan sehingga kami hampir tidak mendapatkan setengah dari yang kami inginkan. Ingatlah bahwa malloc harus cepat dan bagus, kadang menang cepat atas kebaikan. Ini bukan Tetris di mana ia tahu bagaimana menyesuaikan barang dengan sempurna, itu memperdagangkan efisiensi pengepakan untuk waktu. Ini akan menjadi percobaan yang menarik untuk menggunakan pengalokasi yang berbeda (tcmalloc Google tampaknya sangat tua jika Anda tahu cara menggunakannya dengan LD_PRELOAD).

Juga, apakah itu terbunuh? Atau mati? Apakah $ echo? setelah itu berakhir, dan Anda akan melihat angka <127 jika memang keluar sendiri, atau sesuatu> 128 jika sinyal membunuhnya. Jika terbunuh, mungkin memori reaper sistem Anda membunuhnya, meskipun dengan 8Gb RAM, saya akan terkejut jika sistem Anda merasa perlu.

Jadi, singkatnya, mungkin program 32 bit, + beberapa kendala kernel, + pengalokasi tidak efisien, + pola alokasi lebih sedikit. Tetapi periksa nilai kembali untuk melihat apakah mungkin mesin penuai Memori Habis membunuhnya.

Homolka yang kaya
sumber
Saya memperbarui pertanyaan awal saya dengan tanggapan atas permintaan Anda.
Tyzoid