Pengaturan ColdFusion untuk unggahan file besar

8

Saya mencoba menyiapkan server coldfusion untuk menerima unggahan file besar, dan saya menghadapi beberapa batasan. Inilah yang saya amati sejauh ini:

Ada dua pengaturan di ColdFusion Administrator yang membatasi ukuran unggahan: "Ukuran maksimum data kiriman" dan "Minta Memori Throttle". Jika ukuran unggahan Anda (termasuk overhead HTTP) lebih besar dari salah satu dari pengaturan itu, unggahan ditolak. Saya tidak tahu mengapa kita membutuhkan 2 ini; mana yang lebih tinggi tidak memiliki efek sejauh yang saya tahu. Yang lebih rendah menang.

Ketika seseorang mencoba mengunggah file yang terlalu besar, mereka tidak mendapatkan pesan kesalahan yang bagus. Upload hanya hang selamanya setelah mengirim sekitar 1 data nilai jendela TCP. Dan itu tergantung dengan cara yang sangat buruk. Bahkan setelah klien menyerah dan terputus, utas apache terkait masih terikat (saya bisa melihat ini menggunakan mod_status). Utas yang macet terus bertambah hingga tidak ada lagi yang tersisa untuk menerima permintaan baru dan server harus dimulai ulang.

"Permintaan Throttle" adalah hal yang saya benar-benar tidak mengerti. Semua dokumentasi tentangnya berbicara tentang itu sebagai ukuran wilayah memori. Jika memang seperti itu, maka saya tidak dapat melihat bagaimana ini terkait dengan ukuran file. Ini mengisyaratkan sesuatu yang saya tidak ingin percaya: bahwa ColdFusion menghirup seluruh file yang diunggah ke dalam memori sebelum menulis semua itu ke disk. Tidak ada orang waras yang akan melakukan itu, ketika loop pengunggahan (membaca blok berukuran sedang, tulis ke disk, ulangi sampai selesai) sangat mudah. (Saya tahu struktur posting HTTP multipart / formulir-data membuatnya sedikit lebih sulit tapi ... pasti perusahaan besar seperti Adobe dengan produk pengembangan web bisa melakukan ini dengan benar ... bukan?)

Jika slurping seluruh file sebenarnya yang terjadi, bagaimana mereka mengharapkan kita untuk memilih batas ukuran yang bisa diterapkan? Izinkan satu gigabyte dan beberapa pengguna secara bersamaan dapat kehabisan memori tanpa mencoba. Dan apa yang akan kita lakukan, tidak mengizinkan unggahan gigabyte? Orang memiliki video untuk dikirim dan tidak ada waktu untuk mengeditnya!

INFO TAMBAHAN

Berikut ini beberapa nomor versi.

Server web:

Server: Apache/2.2.24 (Win64) mod_jk/1.2.32

ColdFusion:

Server Product           ColdFusion
Version                  ColdFusion 10,285437
Tomcat Version           7.0.23.0
Edition                  Enterprise
Operating System         Windows Server 2008 R2
OS Version               6.1
Update Level             /E:/ColdFusion10/cfusion/lib/updates/chf10000011.jar
Adobe Driver Version     4.1 (Build 0001)

INFO TAMBAHAN # 2

Saya tidak tahu mengapa Anda ingin tahu nilai apa yang saya masukkan di bidang batas, tetapi keduanya ditetapkan untuk 200 MB untuk sementara waktu. Saya meningkatkan "Ukuran maksimum data posting" menjadi 2000 MB dan tidak berpengaruh. Saya sudah tahu bahwa jika saya meningkatkan "Permintaan Memori Throttle" menjadi 2000 MB, itu akan memungkinkan unggahan yang lebih besar. Apa yang saya cari di sini bukanlah "barang dalam jumlah yang lebih besar di sana!" menjawab, tetapi penjelasan terperinci tentang apa sebenarnya pengaturan ini dan apa implikasinya terhadap penggunaan memori server.

Mengapa utas server berhenti selamanya alih-alih mengembalikan pesan kesalahan ketika batas terlampaui bisa menjadi pertanyaan terpisah. Saya berasumsi ini akan menjadi masalah yang terkenal. Mungkin saya harus bertanya dulu apakah ada yang bisa mereproduksi. Saya belum pernah melihat pesan kesalahan "file terlalu besar" yang dikembalikan ke klien dari ColdFusion. Apakah seharusnya punya?

INFO TAMBAHAN # 3 Beberapa eksperimen telah mengarahkan saya pada jawaban parsial. Hal pertama yang saya lewatkan adalah "Request Throttle Memory" (RTM) melakukan sesuatu yang bermanfaat jika diset lebih tinggi dari "Ukuran maksimum data posting" (MSOPD). Dalam tes putaran pertama saya, tanpa petunjuk tentang hubungan di antara mereka, saya sebaliknya. Dengan pemahaman baru saya, saya dapat melihat bahwa rasio RTM / MSOPD adalah jumlah unggahan simultan yang akan diizinkan jika semuanya mendekati ukuran maksimum.

Dengan asumsi bahwa "Permintaan Memori Throttle" sebenarnya adalah buffer memori, dan bukan file sementara, ini berarti bahwa ketakutan terburuk saya adalah benar. Setiap file disimpan sepenuhnya dalam memori selama durasi penuh dari unggahannya. Tidak ada yang mengatakan apa pun untuk membuat saya percaya sebaliknya (meskipun saya juga tidak melihat ada yang melompat untuk mengatakan "ya, mereka melakukan hal bodoh ini")

Juga dengan pemahaman baru ini, unggahan yang macet masuk akal. Server tidak memiliki memori yang tersedia untuk menerima unggahan, jadi itu tidak membaca dari soket. Buffer TCP terisi, ukuran jendela menjadi 0, dan klien menunggu untuk membuka lagi, yang akan terjadi segera setelah server mulai membaca permintaan. Tetapi dalam kasus saya, untuk beberapa alasan, itu tidak pernah terjadi. Server lupa tentang permintaan sepenuhnya sehingga hanya tinggal.

Kasus "Ukuran maksimum data kiriman" yang dipukul masih sedikit menjadi misteri. Permintaan yang mencapai batas yang sulit tidak boleh diantrikan, hanya ditolak. Dan saya mendapatkan pesan penolakan ( "Post Ukuran melebihi batas maksimum 200 MB.") Di server.log. Tetapi sekali lagi dalam kasus ini server sepertinya melupakan permintaan tanpa pernah mengirim kesalahan kepada klien.


sumber
Dua pertanyaan: 1. Apakah Anda yakin itu Cold Fusion, dan bukan server web itu sendiri? dan 2. Sudahkah Anda melihat batas waktu permintaan?
Katherine Villyard
1
Saya yakin. Tidak ada batas waktu (unggahan mengisi satu jendela TCP dan kemudian berhenti. Terbukti dengan wireshark. Memotong beberapa byte dari akhir file dan mengirimkannya dalam 13 detik.) Dan saya dapat memposting unggahan ke halaman HTML statis dan mengirimkannya baik-baik saja (itu tidak bisa disimpan di mana pun karena tidak ada yang memproses data formulir, tetapi intinya adalah tidak macet.)

Jawaban:

1

Saya juga akan mencoba menjelaskan pengaturan untuk penyetelan: -

  • Jumlah maksimum parameter permintaan POST - Ini mengacu pada jumlah maksimum atribut / parameter yang dikirim melalui permintaan tertentu. Terutama digunakan, saat memposting data pada formulir.
  • Ukuran maksimum data posting - Ini adalah data maksimum yang dapat diposting di server. Ini adalah jumlah semua data dalam bentuk tertentu selama permintaan POST.
  • Ambang Batas Throttle Permintaan - ColdFusion dapat mencekik (secara paksa memperlambat) permintaan yang masuk jika diperlukan. Namun, permintaan yang sangat kecil (yang memiliki muatan kecil) dapat diizinkan melalui terlepas dari kondisi throttle. Untuk memungkinkan permintaan kecil diproses, tentukan ukuran maksimum yang diizinkan (standarnya adalah maksimum 4 MB).
  • Request Throttle Memory - Untuk membatasi permintaan, tentukan jumlah maksimum memori yang dialokasikan untuk throttle. Jika total memori tidak cukup, Antrian ColdFusion meminta hingga cukup memori kosong (standarnya adalah 200 MB). Itu tidak akan menyimpan memori untuk Req1, karena lebih rendah dari Threshold.

Pertimbangkan bahwa ada tiga permintaan simultan Req1 (3 MB), Req2 (6 MB) dan Req3 (9 MB). Dengan pengaturan standar, Ambang Batas Throttle Permintaan diatur ke 4MB, ColdFusion akan mencadangkan (6 + 9 = 15MB) di Memori Throttle. Demikian juga, itu akan terus menambahkan Memori Permintaan Throttle untuk semua permintaan simultan dan batasnya adalah apa yang kami tetapkan untuk Permintaan Memori Throttle (default adalah 200 MB)

Semoga ini membantu.

Anit Kumar
sumber
Ini mirip dengan semua deskripsi lain yang saya temukan melalui google. Semuanya menghilangkan satu hal yang perlu saya ketahui: bahwa Memori Permintaan Throttle seharusnya lebih besar dari ukuran maksimum data posting. Dan saya juga hanya menebak bahwa Memori Permintaan Throttle harus lebih kecil dari Ukuran JVM Heap, sehingga tidak mungkin untuk mengunggah file yang benar-benar besar (dekat atau lebih besar dari RAM server Anda) secara paralel. Namun demikian, ini adalah jawaban terbaik sejauh ini, jadi saya mengambilnya dan saya akan menerimanya jika tidak ada yang terjadi sebelum hadiah naik
1

Anda dapat menggunakan cftry-catch untuk menangkap kesalahan dan menampilkan pesan khusus kepada pengguna Anda. Karena itu, apa saja nilai yang ditetapkan untuk jumlah maksimum parameter permintaan POST, ukuran maksimum data posting, Permintaan Throttle Threshold dan Permintaan Throttle Memory . Apakah Anda menggunakan CF Std atau Ent dan apa versi ColdFusion?

Anit Kumar
sumber
Tidak mungkin untuk menangkap kesalahan dengan cftry. Sambungan hang tanpa pernah mengeksekusi baris pertama dari cfm. (Saya meletakkan cflog di sana untuk mencari tahu apakah sudah sejauh itu dan tidak.) Saya akan menambahkan beberapa informasi versi ke pertanyaan.
Pesan kesalahan "File terlalu besar" biasanya dilemparkan oleh server web, bukan ColdFusion. Jika Anda tidak menemukan apa pun di log CF, silakan periksa log Peraga Peristiwa. Pasti akan ada beberapa referensi untuk kesalahan tersebut. Apakah Anda mencoba "LimitRequestBody" dari Apache . Anda dapat menentukan ukuran file di server web juga.
Anit Kumar