Come posso ottimizzare la cache dei file di Windows in modo che il file sia più veloce?

Ho un server di database di terze parti, orientato all'object in esecuzione su una macchina Windows Server 2003 x64 con 24 GB di RAM. Tranne alcuni processi di sistema e strumenti di monitoraggio, il server di database è l'unica cosa in esecuzione su questa macchina. Ho aperto dieci ~ 130GB e un file di database di ~ 5GB, di cui l'ultima è accessibile più spesso ed è quello che mi sta dando problemi.

Ogni volta che il server di database esegue il stream di questo file di database, sembra che sia necessario completare per sempre. Poiché il DBMS scarta il registro delle transactions una volta che i dati sono stati scritti su disco, deve aspettare che il flush sia completato.

Ho esaminato il file IO in Monitor di process e ho visto che durante il normale funzionamento prima di sciacquare, ci sono un sacco di scritture tampone (di solito 128 byte, a volte un po 'di più) a caso un offset nel file. Ciò è da aspettarselo, in quanto piccoli pezzi di dati vengono aggiunti e aggiornati nel database senza alcun model prevedibile.

Quando il registro delle transactions è pieno e si verifica un stream, ci sono state circa 8000 scritture in multipli di 4K (la dimensione della pagina sulla macchina in questione), per un totale di circa 35 MB nell'unica istanza che ho analizzato. La scaletta richiede circa 12 secondi per completare, durante il quale il server di database si blocca. I nostri utenti di storage mi dicono che 1,5 ms per scrittura (12 secondi divisi per 8000 scritture) repesents le performance normali della SAN e non c'è niente che possa fare per accelerare questo process.

Ho letto il modo in cui il caching dei file funziona in Windows Internals 4 e menziona che il gestore di cache cercherà di scrivere le pagine sporche a disco in intervalli regolari su un thread di background anche quando l'applicazione non richiede un flush (scrittore pigro) . C'è un modo per farlo scrivere pagine su disco più velocemente, quindi quando l'applicazione chiama FlushFileBuffers , ci sono solo poche pagine sporche che l'applicazione dovrà aspettare per essere scritta su disco?

Il libro menziona anche che esiste solo una copia di qualsiasi dato file nel gestore della cache. Ciò significa che potrei scatenare un flush aprendo lo stesso file in un process separato e regolarmente chiamando FlushFileBuffers su di esso, quindi ancora una volta ci sarebbe less a sciacquare quando il server di database richiede un flush?

Esistono altri parametri operativi o di file che devo esaminare?

Una raccomandazione che ho sentito è stato quello di aumentare la dimensione della pagina nel file system, in quanto ciò migliorerà il throughput aumentando il numero di byte scritti alla SAN per IO. Dato che le pagine salvate durante un flussaggio sono non consecutive e molto lontane, dubito che ciò farà qualcosa, giusto?

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.