Jump to content

IIS Yüksek İşlemci Kullanımı Hakkında


İbrahim TELCİ

Recommended Posts

Merhabalar; Aşağıda özellikleri yazılı bir server sunucuda IIS üzerinden hazırladığım uygulamayı yayınlıyorum. Uygulamada Server Module üzerinde çalışan bir ThreadTimer ve Main Form üzerinde çalışan bir Timer nesnem var. Server module üzerinde çalışan ThreadTimer veritabanını kontrol ediyor ve MainModule içerisindeki Boolean bir değişkeni tetikliyor. Mainform üzerindeki Timer bu değişkeni kontrol ediyor ve eğer true gelirse sayfa üzerindeki bilgileri yenileyip değişkeni tekrar False konumuna çekiyor. Sürekli çalışan bir kod yok. Sadece kontrol ediyor. Ama aşağıda verdiğim ekran görüntülerinde 181 sayfa açık ve işlemci kullanımı %50 lerin üzerinde. Bir türlü düşüremedim. Nedeni ne olabilir acaba.

Sunucu Özellikleri

Windows server 2016

IIS 10.0

8 Çekirdek (Xenon E5-2650 2.3 ghz) işlemci

8 gb ram

ServerModule üzerinde çalışan ThreadTimer içerisindeki kod (interval =2000)

// TÜM WEB EKRANLARA AİT YENİ ÇAĞRI VARILARI KONTROL ET
          Q_Yeni_Cagri.Close;
          Q_Yeni_Cagri.SQL.Clear;
          Q_Yeni_Cagri.SQL.Add('SELECT * FROM CAGRI_VIEW_WEB WHERE (ISLEM_DURUMU=0) AND (EKRAN_TURU=''WEB'') '
          +' AND (CONVERT(datetime,KAYIT_ZAMANI,121)>=CONVERT(datetime,dateadd(SS,-'+CAGRI_KONTROL_SURESI+',getdate()),121))'
          +' ORDER BY KAYIT_ZAMANI ASC');
          Q_Yeni_Cagri.Open;

          Bilgi:='9';
          // YENİ ÇAĞRILAR VAR İSE
          if Q_Yeni_Cagri.RecordCount>0 then
          Begin

             S := UniServerModule.SessionManager.Sessions;
             // YENİ ÇAĞRI LİSTESİNİ DÖNGÜYE SOK
             while not Q_Yeni_Cagri.Eof do
             Begin
                //UniServerModule.Logger.AddLog('YENİ ÇAĞRI VAR ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ');
                // eğer yeni çağrı bulunur ise aktif sessionların listesini al
                 Bilgi:='10';
                  S.Lock;
                try
                  Bilgi:='11';
                  //Aktif_Sessions.Filtered:=false;
                  //Aktif_Sessions.EmptyDataSet;
                  // SESSİON SAYISI KADAR DÖN çağrının ait olduğu sessiona çağrıyı gönder
                  for I := 0 to S.SessionList.Count - 1  do
                  begin
                    Bilgi:='12';
                    U := S.SessionList[I];
                    if U.UniMainModule <> nil then
                    if ((U.UniMainModule as TM_Module).EKRAN_ID<>'Close')
                    AND ((U.UniMainModule as TM_Module).EKRAN_ID=Q_Yeni_Cagri.FieldByName('EKRAN_ID').AsString)  then
                    Begin
                       Bilgi:='13';
                       (U.UniMainModule as TM_Module).CAGRI_ID:=Q_Yeni_Cagri.FieldByName('CAGRI_ID').AsInteger ;

                    End ;

                  end;
                finally
                  Bilgi:='14'+Bilgi;
                  S.Unlock; // ... and finally don't forget to release lock!
                  //UniServerModule.Logger.AddLog('1-Oturum listesi alındı.' );

                end;
                Q_Yeni_Cagri.next;
                Bilgi:='15';
             End;

          End

MainForm üzerinde Çalışan Timer içerisindeki kod (interval=1000)

  if frm_ana.Height<> UniApplication.ScreenHeight then
    Begin
      frm_ana.Height:=UniApplication.ScreenHeight;
      frm_ana.Width:= UniApplication.ScreenWidth;
    End;

    if  M_Module.UniCon_Cagri.Connected then
    begin
      ImgDB_Var.Visible:=true;
      ImgDB_Yok.Visible:=false;
    end
    else
    begin
      ImgDB_Var.Visible:=false;
      ImgDB_Yok.Visible:=true;
    end;

    if TMR_Cagri_Kontrol.Enabled=True then
    begin
      Img_Kontrol_Var.Visible:=true;
      Img_Kontrol_Yok.Visible:=false;
    end
    else
    begin
      Img_Kontrol_Var.Visible:=false;
      Img_Kontrol_Yok.Visible:=true;
    end;

    // eğer server tarafından gönderilen ÇAĞRI ID EN SON GERÇEKLEŞTİRİLEN ÇAĞRI ID DEN BÜYÜK İSE
    // YENİ ÇAĞRI VAR DEMEKTİR. YENİ ÇAĞRIYI GERÇEKLEŞTİR.
    // eğer yan son tru ise bir çağrı gerçekleştiriliyordur. çağrı bitene kadar yeni çağrı yapma
    if (M_Module.CAGRI_ID> EN_SON_CAGRI_ID) and (Yan_Son=false) then
    Begin
      Btn_Veri_AktarClick(self);
    End;

 

Ekran Görüntüsü (71).png

Ekran Görüntüsü (72).png

Link to comment
Share on other sites

Örnek görmeden bir şeyler söyleyebilmek zor fakat yer verdiğiniz kodlardan incelediğim kadarıyla bir şey gözüme çarptı;

Quote

Q_Yeni_Cagri.SQL.Add('SELECT * FROM CAGRI_VIEW_WEB WHERE (ISLEM_DURUMU=0) AND (EKRAN_TURU=''WEB'') '
          +' AND (CONVERT(datetime,KAYIT_ZAMANI,121)>=CONVERT(datetime,dateadd(SS,-'+CAGRI_KONTROL_SURESI+',getdate()),121))'
          +' ORDER BY KAYIT_ZAMANI ASC');

Bu kod ile yeni çağrı var mı yok mu kontrol ediyorsunuz. Diyelim ki yeni bir çağrı var;

  • Yeni çağrı olduğunu anladığınız an, veritabanına evet ben çağrıyı aldım diyecek bir kod yazmamışsınız.
  • Yani veritabanını güncellemediğiniz için her 2 saniye de bir yeni çağrı varmış gibi sistem sonsuz döngüye giriyor.
  • Tüm işlemleri her 2 saniyede tekrar tekrar yaptığı için işlemci kullanımı asla düşmüyor.

Dediğim gibi bir bakışta bu gözüme çarptı. Belki de sorun başka yerdedir.

Link to comment
Share on other sites

On 11/4/2020 at 12:13 AM, kayhan said:

Örnek görmeden bir şeyler söyleyebilmek zor fakat yer verdiğiniz kodlardan incelediğim kadarıyla bir şey gözüme çarptı;

Bu kod ile yeni çağrı var mı yok mu kontrol ediyorsunuz. Diyelim ki yeni bir çağrı var;

  • Yeni çağrı olduğunu anladığınız an, veritabanına evet ben çağrıyı aldım diyecek bir kod yazmamışsınız.
  • Yani veritabanını güncellemediğiniz için her 2 saniye de bir yeni çağrı varmış gibi sistem sonsuz döngüye giriyor.
  • Tüm işlemleri her 2 saniyede tekrar tekrar yaptığı için işlemci kullanımı asla düşmüyor.

Dediğim gibi bir bakışta bu gözüme çarptı. Belki de sorun başka yerdedir.

Yeni çağrıyı yakaladığında o çağrı ile ilgili oturuma senin çağrın var diye mesaj gönderiyor. Mesaj giden oturum çağrıyı gösteriyor ve o kaydı kapatıyor. Tekrar sorguyu çalıştırana kadar oturum o çağrıyı sonlandırmış oluyor zaten.

Dönüşünüz için teşekkürler.

Link to comment
Share on other sites

  • 2 weeks later...
On 11/11/2020 at 2:43 AM, sinanaydin said:

örneğin timer 1 saniye de bir çalışıyor fakat bazen 1 saniyeden uzun sürüyorsa chainmod =true yapıldığında işlem bitmeden timer tekrar devreye girmiyor.

diğer türlü gecikmelerde üst üste çalıştığı için cpu sorununu yapıyor olabilir.

Açıklama için teşekkür ederim... 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...