Bu makalede mssql server error loglarında aşağıda bulunan mesajı neden kaynaklandığını ne gibi işlemlerin yapılması gerektiğini ele alacağız..
There have been X misaligned log IOs which required falling back to synchronous IO. The current IO is on file L:\LOG\XXX.ldf.
Hata mesajında Transaction log dosyasına yaptığım IO istekleri(512 bytes), fiziksel sektör yapısıyla aynı olmadığı belirtilmektedir. Bu yüzden hızlı (asenkron) log yazımı yapamıyorum, yavaş olan fiziksel sektör IO değerine düştüğünü belirtmektedir.
Aşağıdaki resimde sql server error loglarında alınan mesaj görülmektedir.

İlk olarak veritabanımızın bulunduğu log dosyasının ve data dosyasının hangi fiziksel diske yazıldığını veritabanı files bölümünden gözlemleyelim.

Data ve Log dosylarının yazıldığı disklerimizin Physical sector size değerini gözlemleyelim.
fsutil fsinfo ntfsinfo L:\
Log diskinin Physical sector size değerinin 4096 Bytes olduğu görülmektedir.

Data dosyalarının yazıldığı Physical sector size değeri görülmektedir. Data diskinde ilgili değerin 512 olması bu hatanın önüne geçmiştir.
fsutil fsinfo ntfsinfo M:\SAHIS

Yukarı resimlerde dikkat edilirse log diskinin Physical sector size uyumsuzluğu, log tarafındaki hatanın doğrudan sebebi oluyor.
Detaylı bir şekilde açıklayalım:
İlk olarak sql server’ın verileri nasıl aldığı disk üzerinde bulunan Physical sector size değeriyle bağlantısını ele alalım. Daha sonra detaylı bir şekilde asıl sorunumuza gelelim.
SQL Server DATA dosyalarında 64 KB isteyebilir, ama disk bunu her zaman 64 KB sektör olarak görmez. SQL Server data dosyası için mantıksal IO (logical IO) işlemi yapar. Storage engine derki bana istediğim veriyi getir buraya yaz der. Bu işlemi 64 KB’lık extentler şeklinde almaktadır. Sql server’ın talebini disk nasıl algılar. Sql server windows IO stack yapar. 64 KB isteğini Physical sector size değeri 4 KB ise 16 tane fiziksel sektör yapmaktadır. Yani sıralı bir şekilde 4K:4K:4K:4K:4K………. alır. Dikkat edilirse tam bölünme ve hizalı bölünme olmaktadır. Bu sebepten aşağıdaki resimde görülen log diskimizin fiziksel sektör değerinde bir sorun yaşanmaz. Aynı sorun data diskimizin olduğu disktede(M:\SAHIS) bulunmamaktadır. Bu arada 4KB ve 512 Byte değerinin sıkıntı olmamasının sebebi tam bölünmesinden dolayıdır. Şunu da belirtmek gerekir ki sql server tarafında diske 64 KB’lık extend şeklinde yazıldığında sektör ne ise o sayıda sektöre bölümleyerek yazmaktadır. Tam bölümleme olduğu için ortada kalan byte yok. Sector ortasına yazma yok. Read-Modify-Write yok. Genellikle 4096 olması tercih edilir.

Hata mesajında log diskinden hata neden kaynaklanıyor. Üst resimde dikkat ederseniz 4096 herhangi bir sıkıntı olmaması lazım. Burada ldf dosyası üzerine yazım işlemi nasıl olmaktadır. İlk olarak ld dosyası sona yazar(Append-only) Çok küçük 512 Byte’lık IO’lar şeklinde yapmaktadır Çakışma tam olarak burada başlamaktadır. 512 Byte’lık değerler 4 Kb lık sektörlere yazıldığı için sektör içerisinde çakışmalara sebep olmaktadır. Bu yapıda Misaligned IO ,Read-Modify-Write ve Senkron IO düşüşlerine sebep olmaktadır. Tersten düşünürsek daha anlaşılır olacaktır. 512/4096 sektör içi çakışmalara ve yavaşlamaya sebep olmaktadır.
Bytes Per Cluster değerinin 64 KB olmasının rolü ise. NTFS parçalanmanın olmaması, Fragmentation azalmaktadır. SQL için best practice olarak kabul edilmektedir.
Microsoft bu sorunun önüne geçmek için -T1800 Trace Flag eklenmesini önermektedir. Bu flag set edildiğinde sql server log IO’larının 4KB’a hizalayarak göndermektedir. Bu işlemin bizlere olan artısı Misaligned IO mesajlarının error log’lara düşmesinin önüne geçmiş oluruz. IO anlamında senkronizasyonu minimize etmektedir. Bu işlem geçici bir çözümdür. Performans garantisi yoktur. Sadece yukarıda belirtildiği gibi Misaligned IO mesajı kesilir.
Asıl önerilen LOG diskinin 512 Byte ile uyumlu olacak şekilde yeniden oluşturulması gerekmektedir.
Özetle:
Log diski yukarıdaki resimde görüldüğü gibi 4KB fiziksel sektörlü, SQL Server ise log yazımını 512 byte hizalı yapıyor. Bu uyumsuzluk yüzünden SQL Server asenkron IO’yu kapatıp senkron IO’ya düşüyor ve bu uyarıyı yazıyor. -T1800 geçici bir bastırma yöntemidir; kalıcı ve doğru çözüm log diskin 512’e uyumlu şekilde yeniden oluşturulması gerekmektedir.
DBCC TRACEON ile trace flag 1800’ü etkinleştirebilirsiniz. Sql server’a hemen set edilmektedir.
dbcc traceon (1800, -1)
İzleme bayrağının etkin olup olmadığını DBCC Tracestatus (-1) çalıştırarak doğrulayabilirsiniz ve sunucuda çalışan tüm trace flagları görebilirsiniz.
DBCC Tracestatus(-1)
Yukarıda bulunan Trace Flag eklendikten sonra sql servisinin restart edilmesi gerekmektedir.
Bu işlemlerle uğraşmak istemiyorum yeni bir 512 byte’lık fiziksel sektör istiyorum dersen bunun için storage tarafında ilgili log diski için bu değerin set edilmesi gerekmektedir. Windows tarafında bu değer set edilmez.
Bu makalede sql server error loglarında alınan Misaligned log IOs which required falling back to synchronous IO mesajının neden kaynaklandığını tüm ince detaylarıyla görmüş olduk.
Başka makalede görüşmek dileğiyle..
“İman edenler, Allah’ı en çok sevenlerdir.” (Bakara 165)