İletileri Message Queuing 2.0'da depolamak için kullanılan RAM ayrılan belleği aştığında hata oluştu

Bu makale, Microsoft Message Queuing 2.0'da (MSMQ 2.0) iletileri depolamak için kullanılan RAM miktarı ayrılan belleği aştığında oluşan bir sorunu çözmeye yardımcı olur.

Orijinal ürün sürümü: Microsoft Message Queuing
Özgün KB numarası: 899613

Belirtiler

Kuyruğa ileti gönderdiğinizde, MSMQ gönderdiğiniz iletiyi kabul etmez. Bunun yerine MSMQ yetersiz kaynak hata iletisi oluşturur. İleti göndermek için MSMQ 2.0 kullanan uygulamada bu hata iletisini alırsınız.

Bu sorun oluştuğunda, bir .NET Framework hizmetinin veya uygulamanın yığın izlemesinde aşağıdaki bilgiler görünebilir:

Özel Durum Türü: System.Messaging.MessageQueueException
MessageQueueErrorCode: InsufficientResources
İleti: İşlem gerçekleştirmek için yeterli kaynak yok.
ErrorCode: -2147467259
TargetSite: Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink: NULL
Kaynak: System.Messaging

Ayrıca, yukarıdaki ileti Uygulama günlüğüne kaydedilir. COM+ Kuyruğa Alınmış Bileşen (QC) uygulamasında, yukarıdaki ileti Uygulama günlüğüne kaydedilebilir. Bu sorun, aşağıdaki koşullar doğru olduğunda oluşur:

  • MSMQ'da bir ileti göndermeye çalışırsınız.

  • Şu anda hizmeti çalıştırmak ve iletileri depolamak için kullanılan ayrılan bellek 2 gigabayta (GB) ulaştı. Varsayılan olarak, Windows 2000 bir işleme 2 GB adreslenebilir bellek ayırır.

    MSMQ hizmeti yüklendikten sonra, iletileri depolamak için MSMQ 2.0'ın kullanabileceği varsayılan ayrılmış bellek miktarı 1,6 GB ile 1,8 GB arasındadır.

    Not

    3 GB anahtarını kullanırsanız, ayrılan bellek 2 GB ile 2,5 GB arasında olur.

    İleti depolama dosyaları, bellekle eşlenen dosyalardır. Bu nedenle, MSMQ Depolama klasörünün boyutunu denetleyerek sınırın aşılıp aşılmadığını görebilirsiniz. Bu klasör genellikle Depolama klasöründe bulunur %WinDir%\System32\MSMQ . Ancak, depolama klasörü başka bir konum için yapılandırılabilir. Depolama klasörünün başka bir konum için yapılandırılıp yapılandırılmadığını görmek için, Denetim Masası'daki MSMQ aracının Depolama sekmesindeki İleti Dosyaları Klasörü alanına bakın.

Neden

Bu sorun, aşağıdaki bir veya birkaç nedenden dolayı oluşabilir:

  • Kuyruklara gelen iletileri okuyan ve işleyen uygulama sorunlarla karşılaşıyor. Ancak iletiler, uygulamanın iletileri okuyup işleyebildiği hızdan daha hızlı bir şekilde kuyruklara gelmeye devam eder.

  • Günlük kaydı kuyruklarda etkinleştirilir. Ancak, iletilerin birikmesine neden olan veriler silinmemiştir.

  • Deadlettering kuyruklarda etkinleştirilir. Ayrıca, geçersiz iletileri depolamak için kullanılabilir ayrılan bellek miktarına ulaşıldı veya aşıldı.

  • Hedef kuyruk kullanılamadığından giden kuyrukta iletiler birikti.

Çözüm

Bu sorunu çözmek için kullandığınız yöntem MSMQ hizmetinin geçerli durumuna bağlıdır. Bu sorunu çözebilmeniz için önce kuyruklara yazan hizmetleri veya uygulamaları durdurmanız gerekir.

MSMQ çalışıyorsa

Hangi kuyruklarda birikmiş iletiler olduğunu belirleyin. Bunu yapmak için aşağıdaki yöntemlerden birini kullanın:

  • MSMQ arabirimini kullanarak kuyrukları el ile inceleyin. MSMQ arabirimi Bilgisayar Yönetimi konsolunda bulunur.

  • Performans İzleyicisi'da MSMQ QUEUE performans nesnesindeki tüm sayaçları ayarlayın. Ardından Rapor görünümü'nü seçin. Rapor görünümünde, her kuyruktaki iletilerin sayısını görebilirsiniz.

Hangi kuyrukların birikmiş iletileri olduğunu belirledikten sonra, iletilerin neden biriktiğini belirlemeniz gerekir. İletilerin kuyruklarda birikmesi için çeşitli olası nedenler vardır. Bu nedenler şunlardır:

  • Giden ileti kuyruğundaki iletiler hedeflerine ulaşamaz. İletiler hedeflerine ulaşamıyorsa, hedef bilgisayarın iletileri almak için kullanılabilir olduğundan emin olun. Bu iletiler güncel değilse veya değeri yoksa kuyruğu temizleyin.

  • İleti alması gereken uygulama durduruldu veya bir hata koşulu girdi. Bu koşullardan biri doğruysa, bu uygulamadaki sorunu çözün.

  • Teslim edilemeyen ileti kuyruklarındaki veya günlük kuyruklarındaki iletiler korundu. Bu iletiler kaldırılmamış veya işlenmemiş. Bu iletiler tutulduysa, bu iletileri saklama amacını belirleyin. İletileri günlüğe kaydetmek için seçeneği sıklıkla test için kullanılır.

Test tamamlandığında, bu seçenek istemeden etkinleştirilmiş olabilir. İletiler geçersizse, iletiler belirtilen süre içinde işlenmemiş veya teslim edilmemiştir. Geçersiz okuma veya günlüğe günlük kaydı açıksa, bu iletileri kuyruktan okuyan bir işlem olmalıdır. İletilerin biriktiği kuyrukları tanımladığınızda, birikmiş iletileri silebilirsiniz.

MSMQ çalışmıyorsa ve el ile başlatamıyorsanız

Not

  • MSMQ Depolama klasöründeki dosyalarda değişiklik yapmadan önce, MQbkup.exe kullanarak geçerli MSMQ ortamını yedeklemenizi öneririz. Ürün Destek Hizmetleri'nden yardım almanız gerekiyorsa bu adım çok önemlidir.

  • MSMQ kararsız bir duruma girdiği için tüm iletileri kurtaramayabilirsiniz. Aşağıdaki adımları kullanarak iletileri geri yüklerken sorun yaşıyorsanız ve veriler çok önemliyse yardım için Ürün Destek Hizmetleri'ne başvurun.

MQbkup.exe kullanarak MSMQ yapılandırmasını yedeklemek için aşağıdaki adımları izleyin.

Not

MQbkup.exe çalıştırmadan önce MSMQ dosyalarını yedekleyebileceğiniz bir klasör seçin. Bu klasör, en az 2,5 GB kullanılabilir alanı olan bir diskte bulunmalıdır.

  1. Bir Komut İstemi penceresi açın.

  2. dizinini olarak %WinDir%\System32değiştirin.

  3. Komutu çalıştırın.

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. MSMQ dosyalarını yedeklediğiniz klasörün konumunu not edin.

3 GB anahtarını kullanarak sunucuyu başlatma

Not

3 GB anahtarı yalnızca Windows 2000 Advanced Server için bir seçenektir. Windows 2000 Server ve Windows 2000 Professional için İletilerinizi el ile kurtarmak için bölümüne gidin.

Varsayılan olarak, Windows 2000 her işleme 2 GB adreslenebilir bellek ayırır. MSMQ ayırmanın tamamını kullandığından bu sorun oluşur. Bu davranış, hizmetin doğru bir şekilde yeniden başlatılmasını engeller. 3 GB anahtarını kullanırsanız, Windows 2000 Advanced Server her işleme 3 GB adreslenebilir bellek ayırır. Bu yapılandırma, sunucuyu yeniden başlattıktan sonra MSMQ'ya hizmeti ve ileti depolama dosyalarını yüklemek için yeterli adreslenebilir bellek verir. Bu anahtar MSMQ depolama alanını 2 GB ile 2,5 GB arasında artırır.

Uyarı

Bu yapılandırma sunucudaki diğer kaynakları etkileyebilir. Sorun gidermeyi tamamladıktan sonra 3 GB anahtarını kaldırmanızı öneririz. Bu yapılandırmanın sorunu kalıcı olarak çözmesi amaçlanmamıştır. Ancak, MSMQ çalışıyorsa bölümündeki adımları gerçekleştirebilmek için MSMQ'ya erişmek için bu yapılandırmayı kullanabilirsiniz.

Windows'u 3 GB'lık anahtarı kullanarak çalışacak şekilde yapılandırma hakkında daha fazla bilgi için, Windows 2000 Yardım dosyasındaki Uygulamalarınızda uygulama belleği ayarlama desteğini etkinleştirme konusuna bakın.

İletilerinizi el ile kurtarmak için

Not

  • Bu adımları yalnızca MSMQ çalışmıyor durumdaysa izleyin.
  • MSMQ kararsız bir durumda olduğundan ve başlatılmayacağından, tüm iletileri kurtaramayabilirsiniz.

Uyarı

Bu işlem, bir uygulamanın işlem iletilerini iletilerin ilk geldiği sıraylan farklı bir sırayla almasına neden olabilir.

  1. İleti depolama dosyalarınızı tutmak için geçici bir klasör oluşturun. Bu klasörü MSMQ klasörüne koymayın.

  2. Yalnızca .mq dosya adı uzantısına sahip dosyaları seçin.

    Uyarı

    MSMQ Depolama klasöründe bulunan bazı dosyalar MSMQ'un düzgün çalışması için kritik öneme sahiptir. Yalnızca .mq dosya adı uzantısına sahip dosyaları seçtiğinizden emin olun.

  3. Seçili dosyaları 1. adımda oluşturduğunuz klasöre taşıyın.

  4. MSMQ Veri Erişim Sürücüsünün başlatılmadığından emin olun. Bunu yapmak için komut isteminde aşağıdaki komutu çalıştırın:

    Net Stop MQAC /y
    
  5. MSMQ hizmetini başlatın. Bunu yapmak için komut isteminde aşağıdaki komutu çalıştırın:

    Net Start MSMQ
    

    Not

    İletilerdeki veriler önemli değilse ve yalnızca MSMQ'yu yeniden çevrimiçi yapmak istiyorsanız, burada durabilirsiniz.

  6. Hizmetin artık başlatılacağını doğruladıktan sonra hizmeti durdurun. Bunu yapmak için komut isteminde aşağıdaki komutu çalıştırın:

    Net Stop MQAC /y
    

    Bu komut hem MSMQ hizmetini hem de Veri Erişimi sürücüsünü durdurur.

  7. 5. adımda ileti depolama dosyalarını taşıdığınız klasörde, bazı dosya adlarının p Number.mq biçimine ve bazı dosya adlarının lNumber.mq biçimine sahip olduğuna dikkat edin. Bu dosyalar çift olarak depolanır. Her p dosyasının karşılık gelen bir l dosyası vardır.

    Dosyaların değiştirildiği tarihlere dikkat edin. En eski p dosyasını ve karşılık gelen l dosyasını seçin. Bu dosyaları özgün MSMQ Depolama klasörüne taşıyın.

  8. MSMQ hizmetini başlatmak için 5. adımda komutunu çalıştırın. Hizmet başlatılırsa, iletilerin hangi kuyruklarda biriktiğini ve iletilerin nasıl işleneceğini belirlemek için MSMQ çalışıyorsa bölümündeki adımları izleyin.

  9. Kuyruklardan biriken iletileri kaldırdıktan sonra, tüm ileti dosyalarını MSMQ Depolama klasörüne döndürene ve kuyruklardan tüm biriktirilen iletileri kaldırana kadar 6 ile 8 arasındaki adımları yineleyin.

    Not

    Aynı anda 1,6 GB'tan fazla veriyi MSMQ Depolama klasörüne geri taşımayın. Bunu yaparsanız hizmet başlatılamayabilir.

Sorunu yeniden oluşturma adımları

Windows 2000 Server çalıştıran bir bilgisayarda, iletileri göndermek için kullandığınız uygulama 0x00e0027 özel durum hatası alana kadar iletileri yerel kuyruğa gönderin.

MSMQ 2.0, iletileri belleğe eşlenmiş dosyalarda depolar. Windows 2000 Server çalıştıran bir bilgisayarda MSMQ 2.0 için varsayılan ayrılan bellek miktarı 2 GB'tır. MSMQ 2.0 bileşenleri bilgisayara yüklendikten sonra MSMQ 2.0 için kullanılabilir ayrılan bellek miktarı yaklaşık 1,6 GB ile 1,8 GB arasında bir boyuta indirilir.

Boot.ini dosyasında 3 GB anahtarını etkinleştirirseniz, MSMQ 2.0 için kullanılabilir ayrılan bellek miktarı 3 GB'a yükselir. MSMQ 2.0 bileşenleri bilgisayara yüklendikten sonra MSMQ 2.0 için kullanılabilir ayrılan bellek miktarı 2,7 GB'a düşürüldü.

Ancak, ayrılan ek bellek de çekirdekten yaklaşık 1 GB ayrılmış bellek alır. Bu davranış sistem performansını etkileyebilir ve dosya G/Ç gerçekleştiren uygulamaları etkileyebilir.

3 GB'lık anahtarı yalnızca MSMQ 2.0 için kullanılabilir ayrılan bellek miktarını artırmak için kullanmanızı önermeyiz. Bunun yerine, Belirtiler bölümünde bahsedilen sorunu önlemek için bir bilgisayar kotası ayarlamanızı öneririz.

Daha fazla bilgi için bkz. Microsoft Message Queuing'de bilgisayar kotalarını ve kuyruk kotalarını ayarlama.