ben yakut (2.0.0 p39474) çok hızlı dosya erişimi gerçekleştirmek veYakut dosya tanıtıcısı yönetimi (çok fazla açık dosya)
Too many open files
this thread baktı istisna almaya devam ediyorum, here ve diğer çeşitli kaynaklardan , OS sınırlarını çok iyi biliyorum (sistemimde 1024
'a ayarla).
erişim mutexed bu dosyayı gerçekleştirir ve biçimini alır benim kod parçası: filename
bölüm çağıran iş parçacığı bağlı olarak hızlı değişime tabidir
File.open(filename, 'w'){|f| Marshal.dump(value, f) }
. Anladığım kadarıyla bu form bloktan sonra dosya tanıtıcısından feragat ediyor.
ObjectSpace.each_object(File)
kullanarak açık olan File
nesnesinin sayısını doğrulayabilirim. Bu, bellekte en fazla 100 kişinin bulunduğunu, ancak beklendiği gibi yalnızca bir kişinin açık olduğunu bildiriyor. Ayrıca, istisna kendisi ObjectSpace
tarafından bildirilen yalnızca 10-40 File
nesnenin olduğu bir zamanda atılır. Ayrıca, sleep
çağrıları ekleyerek komut dosyamı yavaşlatır gibi, el ile çöp toplama bu sayımların herhangi birini geliştirmek için başarısız olur.
Sorum nedenle geçerli:
-
mıyım temelde bir sürecin bütün ömrünü kapsamaz --- OS sınırı doğasını yanlış anlama?-
Eğer öyleyse, nasıl web sunucularıulimit -n
dosyalar üzerinde eriştikten sonra dışarı çökmesini kaçınabilirim? -
Ruby dosya tanıtıcısını nesne sistemi dışında tutuyor mu, yoksa çekirdek aynı anda 'eşzamanlı' erişim sayılıyor mu?
-
Düzenleme 20130417: strace
yakut dönen ve bunu yapmadan önce muteksi bırakmadan, dosyaya ilişkin tüm veriler yazmaz olduğunu gösterir. Bu şekilde, dosya işletim sistemi sınırına kadar yığınları işler. Bunu düzeltmek için bir girişimde
, G/sysread
syswrite
uyumlu modu kullanılır ve close
önce flush
çağrıda bulundular. Bu yöntemlerin hiçbiri işe yaramadı.
Soruma göre revizyon şu adreste bulunur: Neden ruby dosya tanıtıcılarını kapatma başarısız oluyor ve bunu nasıl yapabilirim?
'strace', ruby'nin dosyayı açtığını, ardından işlevin yazılmasından önce muteks bırakarak, işlevden döndürdüğünü belirtir. Bazı durumlarda, temizleme işlemi bile yapılmaz ve istisnadan sonra kaynakları kapatırken (yani kapatma sırasında) diske yazma işlemini sonlandırır. –