Kami menjalankan situs (Moodle) yang saat ini ditemukan lambat oleh pengguna. Saya pikir saya telah melacak masalah ke MySQL membuat tabel sementara pada disk. Saya menonton variabel created_tmp_disk_tables
dalam administrasi server Mysql Workbench dan jumlahnya meningkat sekitar 50 tabel / s. Setelah penggunaan sehari, created_tmp_disk_tables
adalah> 100rb. Selain itu, memori sepertinya tidak akan dirilis. Penggunaan terus meningkat hingga sistem menjadi cukup banyak tidak dapat digunakan dan kita harus memulai kembali MySQL. Saya harus memulai kembali hampir setiap hari dan itu dimulai dengan menggunakan sekitar 30-35% memori yang tersedia dan menyelesaikan hari dengan 80%.
Saya tidak memiliki gumpalan dalam database dan tidak memiliki kontrol atas permintaan sehingga saya tidak dapat mencoba untuk mengoptimalkannya. Saya juga telah menggunakan Wisaya Confirguration Wizard untuk menghasilkan file konfigurasi tetapi my.ini juga tidak menyelesaikan masalah saya.
Pertanyaan
Apa yang harus saya ubah untuk menghentikan MySQL dari membuat tabel sementara pada disk? Apakah ada pengaturan yang perlu saya ubah? Haruskah saya membuang lebih banyak memori padanya?
Bagaimana saya bisa menghentikan MySQL dari memakan memori saya?
Edit
Saya mengaktifkan slow_queries
log dan menemukan bahwa kueri SELECT GET_LOCK()
dicatat sebagai lambat. Pencarian cepat mengungkapkan bahwa saya telah mengizinkan koneksi persisten dalam konfigurasi PHP ( mysqli.allow_persistent = ON
). Saya mematikan ini. Ini mengurangi tingkat di mana MySQL mengkonsumsi memori. Ini masih membuat tabel sementara.
Saya juga memeriksa key_buffer size
apakah ukurannya cukup besar. Saya melihat variabelnya key_writes
. Ini harus nol. Jika tidak, tambah. key_buffer_size
Saya punya nol key_reads
dan nol key_writes
jadi saya berasumsi bahwa key_buffer_size
itu cukup besar.
Saya meningkatkan tmp_table_size
dan max-heap-table-size
menjadi 1024M karena peningkatan Created_tmp_disk_tables dapat mengindikasikan bahwa tabel tidak dapat masuk dalam memori. Ini tidak menyelesaikannya.
Ref: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-turnal-tables/
Edit 2
Jika Anda melihat banyak sort_merge_passes
per detik di SHOW GLOBAL STATUS output, Anda dapat mempertimbangkan untuk meningkatkan sort_buffer_size
nilainya. Saya punya 2 sort_merge_passes
dalam satu jam jadi saya anggap sort_buffer_size
cukup besar.
Ref: Manual Mysql aktif sort_buffer_size
Edit 3
Saya telah memodifikasi pengurutan dan bergabung dengan buffer seperti yang disarankan oleh @Rando_MySQLDBA. Hasilnya ditampilkan dalam tabel di bawah ini tetapi saya pikir created_tmp_tables_on_disk
masih tinggi. Saya me-restart server mysql setelah saya mengubah nilainya dan memeriksa created_tmp_tables_on_disk
setelah sehari (8 jam) dan menghitung rata-rata. Ada saran lain? Sepertinya saya ada sesuatu yang tidak muat di dalam semacam wadah tapi saya tidak tahu apa itu.
+---------------------+-------------+-------------+--------------------+
| Tmp_table_size, | Sort_buffer | Join_buffer | No of created |
| max_heap_table_size | | | tmp_tables on disk |
+---------------------+-------------+-------------+--------------------+
| 125M | 256K | 256K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 512K | 512K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 1M | 1M | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 4M | 4M | 100k/h |
+---------------------+-------------+-------------+--------------------+
Ini adalah konfigurasi saya:
+-----------------------+-----------------------+
|DATABASE SERVER |WEB SERVER |
+-----------------------+-----------------------+
|Windows Server 2008 R2 |Windows Server 2008 R2 |
+-----------------------+-----------------------+
|MySQL 5.1.48 |IIS 7.5 |
+-----------------------+-----------------------+
|4 Core CPU |4 Core CPU |
+-----------------------+-----------------------+
|4GB RAM |8GB RAM |
+-----------------------+-----------------------+
Informasi tambahan
+--------------------+---------+
|PARAM |VALUE |
+--------------------+---------+
|Num of tables in Db |361 |
+--------------------+---------+
|Size of database |2.5G |
+--------------------+---------+
|Database engine |InnoDB |
+--------------------+---------+
|Read/write ratio |3.5 |
|(Innodb_data_read/ | |
|innodb_data_written)| |
+--------------------+---------+
|Avg table size |15k rows |
+--------------------+---------+
|Max table size |744k rows|
+--------------------+---------+
Pengaturan ini diberikan kepada saya sehingga saya memiliki kontrol terbatas atasnya. Server web menggunakan sangat sedikit CPU dan RAM jadi saya telah mengecualikan mesin itu sebagai hambatan. Mayoritas pengaturan MySQL berasal dari alat pembuatan-otomatis konfigurasi.
Saya telah memonitor sistem menggunakan PerfMon selama beberapa hari yang representatif. Dari itu, saya menyimpulkan bahwa bukan OS yang bertukar ke disk.
My.ini
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/DBs/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=125
query_cache_size=350M
table_cache=1520
tmp_table_size=125M
table-definition-cache= 1024
max-heap-table-size= 32M
thread_cache_size=38
MyISAM Specific options
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=125M
key_buffer_size=55M
read_buffer_size=1024K
read_rnd_buffer_size=256K
sort_buffer_size=1024K
join_buffer_size=1024K
INNODB Specific options
innodb_data_home_dir="D:/DBs/"
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_buffer_pool_size=2G
innodb_log_file_size=407M
innodb_thread_concurrency=8