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.