Bazı düşük kaynakları test etmek istiyorum ve bunun için boş hafızanın% 90'ının dolu olmasına ihtiyacım var.
Bunu bir *nix
sistemde nasıl yapabilirim ?
Bazı düşük kaynakları test etmek istiyorum ve bunun için boş hafızanın% 90'ının dolu olmasına ihtiyacım var.
Bunu bir *nix
sistemde nasıl yapabilirim ?
Yanıtlar:
stres ng POSIX sistemlerinde işlemci / MEM / io / HDD stres simüle eden bir iş yükü jeneratör. Bu çağrı Linux <3.14'te hile yapmalı:
stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
Linux> = 3.14 için, MemAvailable
değiştirmeden yeni işlemler için kullanılabilir belleği tahmin etmek yerine kullanabilirsiniz :
stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
/proc/meminfo
Aramayı free(1)
/ vm_stat(1)
/ etc ile uyarlayın . taşınabilir ihtiyacınız varsa.
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
--vm 1 and --vm-keep
de sağlamak çok önemlidir. Basitçe --vm-bytes
hiçbir şey yapmaz ve ihtiyaç duyduğunuz / istediğiniz kadar bellek ayırabileceğinizi düşünerek yanlış yönlendirilmiş olabilirsiniz. 256G bellek tahsis ederek kendimi kontrol etmeye çalışıncaya kadar biraz ısırdım. Bu cevapta bir kusur değil, sadece ek bir dikkat, doğru bayrakları sağlar.
-m 1
. Strese göre manpage, -m N
--vm N
N
malloc()/free()
malloc()
İstenilen hafızaya bir C programı yazabilir ve ardından mlock()
hafızanın değiştirilmesini önlemek için kullanabilirsiniz .
Ardından programın klavye girişi için beklemesine izin verin, belleğin kilidini açın, belleği boşaltın ve çıkın.
calloc
Aynı problemle karşılaşacaksınız IIRC. Tüm bellek sadece aynı salt okunur sıfırlanmış sayfaya işaret edecektir. Siz yazmaya yazmaya başlayıncaya kadar aslında tahsis edilmeyecek (salt okunur olduğu için çalışmayacak). Gerçekten bildiğimden emin olmanın tek yolu, memset
tampondan bir tane yapmak. Daha fazla bilgi için aşağıdaki cevaba bakınız. Stackoverflow.com/a/2688522/713554
Sınırlı belleğe sahip bir VM çalıştırmayı ve bunun içindeki yazılımı test etmeyi öneririm, ana makinedeki belleği doldurmaya çalışmaktan daha etkili bir test olur.
Bu yöntemin avantajı, düşük bellek durumunun başka yerlerde OOM hatalarına neden olması ve tüm işletim sistemini askıya alması durumunda, üzerinde çalışmakta olduğunuz diğer yararlı işlemlerin olabileceği makinenize değil, yalnızca test ettiğiniz VM'yi asmanızdır.
Ayrıca, testiniz CPU veya IO yoğun değilse, testlerin örneklerini çeşitli düşük bellek boyutlarına sahip bir VM ailesi üzerinde eşzamanlı olarak çalıştırabilirsiniz.
Bu HN yorumundan: https://news.ycombinator.com/item?id=6695581
/ Dev / shm komutunu dd veya benzeri bir dosyayla doldurmanız yeterlidir.
swapoff -a dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k
pv
yüklü, bu sayısını görmek için yardımcı olur:dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
mem=nn[KMG]
çekirdek önyükleme parametresi(Ayrıntılar için linux / Documentation / kernel-parameters.txt dosyasına bakın).
Eğer temel GNU araçları (varsa sh
, grep
, yes
ve head
) bunu yapabilirsiniz:
yes | tr \\n x | head -c $BYTES | grep n
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily
Bu, grep'in RAM'deki tüm veri hattını yüklediği için işe yarıyor (bunu bir disk görüntüsünü çizerken talihsiz bir şekilde öğrendim). Tarafından üretilen çizgi, yes
yerini satırbaşıyla, sonsuz uzun olacak, ama sınırlıdır head
için $BYTES
bayt, böylece grep bellekte $ BYTES yükleyecektir. Grep benim için 100-200KB gibi kullanıyor, daha kesin bir miktar için onu çıkarmanız gerekebilir.
Ayrıca bir zaman kısıtlaması eklemek isterseniz, bu işlem oldukça kolay bir şekilde yapılabilir bash
(çalışmaz sh
):
cat <(yes | tr \\n x | head -c $BYTES) <(sleep $NumberOfSeconds) | grep n
Bu <(command)
şey az bilinen gibi görünüyor ancak burada son derece yararlı, burada daha fazla bilgi bulabilirsiniz: http://tldp.org/LDP/abs/html/process-sub.html
Daha sonra, kullanım için cat
: cat
girdilerin çıkana kadar tamamlanmasını bekleyecek ve borulardan birini açık tutup, hayatta kalmaya devam edecektir.
Eğer varsa pv
ve yavaş yavaş RAM kullanımını artırmak istiyor:
yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n
Örneğin:
yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n
Saniyede 1 MB hızında gigabayt'a kadar kullanacaktır. Ek bir bonus olarak, pv
geçerli kullanım oranını ve şu ana kadar toplam kullanım miktarını gösterecektir. Tabii ki bu daha önceki değişkenlerle de yapılabilir:
yes | tr \\n x | head -c $BYTES | pv | grep n
Sadece | pv |
parçanın yerleştirilmesi mevcut durumu gösterecektir (verim ve toplam, varsayılan olarak, sanırım - aksi halde man (ual) sayfasını görün).
Neden başka bir cevap? Kabul edilen cevap bir paket kurulmasını önerir (İddiaya girerim bir paket yöneticisine ihtiyaç duymadan her yonga seti için bir sürüm vardır); En iyi oylanan cevap, bir C programının derlenmesini önerir (hedef platformunuz için derlemek için kurulmuş bir derleyicim veya araç zincirim yoktu); ikinci en iyi oylama yanıtı, uygulamanın bir VM'de çalıştırılmasını önerir (evet, bu telefonun dahili sd kartını usb veya başka bir şey üzerinden yapmama izin ver ve sanal kutu görüntüsü oluşturmama izin ver); Üçüncüsü, önyükleme sırasındaki RAM'i istenen şekilde doldurmayan bir şeyi değiştirmenizi önerir; dördüncüsü sadece / dev / shm mountpoint (1) var olduğu ve (2) büyük olduğu sürece çalışır (remounting root root); beşinci, yukarıdakilerin çoğunu örnek kod olmadan birleştirir; Altıncı büyük bir cevap ama benim kendi yaklaşımımı bulmadan önce bu cevabı görmedim. bu yüzden kendi kendime ekleyeceğimi düşündüm, çünkü memblob çizgisinin aslında maddenin kaygısı olduğunu görmüyorsanız hatırlamak veya yazmak daha kısadır; yedinci soruya cevap vermiyor (bunun yerine süreci sınırlamak için ulimit kullanıyor); sekizinci, python yüklemenizi sağlamaya çalışır; Dokuzuncu, hepimizin çok yaratıcı olmadığını düşünüyor ve nihayetinde onuncu, C + programını yazdı;
set -e
, bu yüzden bir şey öğrendim :)
time yes | tr \\n x | head -c $((1024*1024*1024*10)) | grep n
(10 GiB belleği kullanın) 1 dakika 46 saniye sürer. Julman99'ın eatmemory programını github.com/julman99/eatmemory adresinde çalıştırmak 6 saniye sürer. ... Eh, artı indirme ve derleme zamanı, ancak RHEL6.4 makinemde hiç sorun yaşamadan ... ve çok hızlı bir şekilde derlendi. Yine de bu çözümü sevdim. Neden tekerleği yeniden icat ettin?
Nokta dosyalarımda benzer bir şey yapmak için bir işleve sahibim. https://github.com/sagotsky/.dotfiles/blob/master/.functions#L248
function malloc() {
if [[ $# -eq 0 || $1 -eq '-h' || $1 -lt 0 ]] ; then
echo -e "usage: malloc N\n\nAllocate N mb, wait, then release it."
else
N=$(free -m | grep Mem: | awk '{print int($2/10)}')
if [[ $N -gt $1 ]] ;then
N=$1
fi
sh -c "MEMBLOB=\$(dd if=/dev/urandom bs=1MB count=$N) ; sleep 1"
fi
}
Basit bir python çözümü ne kadar abount?
#!/usr/bin/env python
import sys
import time
if len(sys.argv) != 2:
print "usage: fillmem <number-of-megabytes>"
sys.exit()
count = int(sys.argv[1])
megabyte = (0,) * (1024 * 1024 / 8)
data = megabyte * count
while True:
time.sleep(1)
sysctl vm.swappiness=0
ve daha da küçük bir sayıya, belki de 1024'e ayarlayabilirdi. Daha önce denemedim, ancak doktorlar bunun değiş tokluğunun nasıl kontrol edildiğini söylüyor ... Makinenizde bir OOM durumuna neden olan noktaya kadar onu gerçekten yavaşlatabilir. Bkz. Kernel.org/doc/Documentation/sysctl/vm.txt ve kernel.org/doc/gorman/html/understand/understand005.html
Eğer varsa ramfs'a ne dersiniz? Takın ve büyük bir dosya üzerine kopyalayın? Eğer /dev/shm
hiçbir ramfs yoksa ve yok - Sanırım bazı girdi değerlerine dayanan büyük bir malloc yapan küçük bir C programı var mı? Çok fazla hafızası olan 32 bit bir sistemde birkaç defada çalıştırmanız gerekebilir.
Belirli bir işlemi sınırlı hafıza ile test etmek istiyorsanız ulimit
, ayrılabilir hafızanın miktarını sınırlandırmak için kullanmaktan daha iyi olabilirsiniz .
man setrlimit
:RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
Bence bu, en yaratıcı cevap için yarışan insanlar tarafından yanlış soruyu sorma ve akıl sağlığını boğma durumu. Yalnızca OOM koşullarını simüle etmeniz gerekiyorsa, belleği doldurmanız gerekmez. Sadece özel bir tahsisatçı kullanın ve belirli sayıda tahsisattan sonra başarısız olmasını sağlayın. Bu yaklaşım SQLite için yeterince iyi çalışıyor gibi görünüyor .
Bunun için bu küçük C ++ programını yazdım: https://github.com/rmetzger/dynamic-ballooner
Bu uygulamanın avantajı, hafızayı boşaltması veya yeniden tahsis etmesi gerekip gerekmediğini periyodik olarak denetlemektir.