Saya memiliki aplikasi web Django menggunakan database PostgreSQL 9.3, yang kadang-kadang melempar kesalahan:
File "/usr/local/my_site/.env/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/my_site/.env/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
OperationalError: could not write block 2432320 of temporary file: No space left on device
HINT: Perhaps out of disk space?
Ini berjalan pada EC2 / RDS dan saya tidak dapat menemukan apa pun yang rendah pada ruang disk. Mesin virtual EC2 memiliki drive 9GB yang hanya menggunakan 38%. Basis data RDS PostgreSQL memiliki penyimpanan 20GB yang hampir 1% digunakan. Saya pikir ini mungkin masalah inode rendah pada contoh EC2, tetapi df -i
menunjukkan bahwa hanya 33% yang digunakan.
Apa yang menyebabkan kesalahan ini?
sysdig -p '%fd.name' proc.name contains WHATEVERYOURAPPISCALLED
untuk melihat apa yang terlibat dalam filepath?Jawaban:
Anda mendapatkan kesalahan ini karena PostgreSQL kehabisan ruang untuk menulis file sementara. Anda memiliki setidaknya satu permintaan yang menyebabkan database untuk sesekali menulis tabel sementara yang terlalu besar untuk ruang yang tersedia.
Secara default postgresql menggunakan string kosong untuk
temp_tablespaces
konfigurasi; yang berarti bahwa tabel sementara ditulis ke dalam tablespace default (AKA $ DATA_DIR Anda). Karena Anda menggunakan RDS Postgres, Anda harus melihat apa yang dikatakan pengaturan itu gunakanselect * from pg_settings where name='temp_tablespaces';
Mengingat posisi blok yang disebutkan dan menggunakan RDS blocksize 8192. Sepertinya Anda sedang menulis hampir 20GB tabel sementara yang tidak secara kebetulan adalah jumlah tablespace yang Anda miliki untuk cluster database itu.
Ini menyarankan bahwa Anda memiliki kueri patologis yang membuat tabel sementara yang merupakan kelipatan dari isi basis data Anda. Anda harus mencoba mencatat semua pertanyaan yang masuk ke database Anda ( lihat aws docs untuk contoh) dan lihat apakah Anda dapat melihat di mana Anda secara tidak sengaja melakukan gabungan cartesian dari dua tabel dan memfilter output (atau bentuk apa pun yang mungkin dimiliki oleh kueri buruk Anda) diambil).
Anda mungkin ingin menetapkan
temp_file_limit
batas ke nilai yang masuk akal (saya akan menggunakan 4GB) tetapi itu hanya akan membuat masalah mendasar lebih terlihat karena Anda akan mencapai batas sebelumnya.Solusi nyata untuk ini adalah menemukan dan mengisolasi kueri yang menyebabkan Anda menggunakan semua ruang sementara itu. Cara termudah adalah mendapatkannya dalam sql dan mencari tahu mengapa ORM Django memproduksi itu.
sumber