2013-04-16 23 views
6

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 filesthis 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/sysreadsyswrite 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?

cevap

3

Kullanım DTrace veya strace ya da her türlü eşdeğer sisteminizde olduğunu ve dosyalar açılıyor tam olarak ne olduğunu öğrenmek.

Bunların soket olabileceğini unutmayın.

Yapıştırdığınız kodun, bu soruna, en azından, oldukça tuhaf bir eşzamanlılık hatası olmadan da, bu yeteneğe sahip görünmüyor gibi görünüyor.

+0

'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. –

İlgili konular