Ich arbeite an einem Import nach Discourse über einen Bulk-Importer. Dies funktioniert für Themen und Beiträge sehr gut, aber aktuell ist der langsame Teil die Dateien. Wir haben etwa 50.000 Benutzer mit Avataren, und während die Benutzerdaten in nur wenigen Sekunden in die Datenbank importiert werden, dauert der Import der Avatare Stunden. Es werden nur etwa ein Upload pro Sekunde verarbeitet.
Gibt es eine Möglichkeit, dies zu beschleunigen? Ich bin mir nicht sicher, welcher Teil dieses Prozesses am langsamsten ist. Wenn keine Avatar-Datei gefunden wird (photo_filename existierte nicht), läuft es sehr schnell ab, aber ich komme etwas durcheinander, wenn ich versuche, in die UploadCreator-Klasse einzudringen, die letztendlich von diesem Importer-Code aufgerufen wird.
Wir haben über 600.000 Anhänge, daher bin ich sehr besorgt, wie lange der Import mit demselben create_upload-Aufruf dauern wird.
upload = create_upload(u.id, photo_filename, File.basename(photo_filename))
if upload.persisted?
u.import_mode = false
u.create_user_avatar
u.import_mode = true
u.user_avatar.update(custom_upload_id: upload.id)
u.update(uploaded_avatar_id: upload.id)
else
puts "Fehler: Upload für #{u.username} #{photo_real_filename} wurde nicht gespeichert!"
end
Hast du eine Idee dazu, @neounix, da du mal einen großen Bulk-Importer ausgeführt hast?
Dank des Bulk-Importers haben wir 26 Millionen Beiträge von einer Woche auf etwa zwei Stunden reduziert. Das Problem sind nun die Anhänge, die mehrere Tage in Anspruch nehmen.
Ich habe die Discourse-Skripte nicht verwendet, um die eigentlichen Dateien zu übertragen.
Stattdessen haben wir normale Dateiübertragungstools wie tar, gzip, sftp, rsync usw. eingesetzt.
Um ehrlich zu sein, haben wir verschiedene Teile unterschiedlicher Discourse-Migrationsskripte genutzt, aber am Ende mehr als die Hälfte des gesamten Codes, den wir bei der Migration verwendet haben, selbst geschrieben. Der Grund dafür war, dass wir monatelang gsub()-Code geschrieben haben, um die Jahrzehnte alten „Coding“-Beiträge zu bereinigen und zu überprüfen. Diese Beiträge wurden von Moderatoren verfasst, die im Laufe der Jahre viel Code gepostet hatten, und alle wollten, dass ihr Code perfekt ist – ohne einzige Syntaxfehler!
Wir waren der Meinung, dass die von Discourse bereitgestellten Skripte ein hervorragender Ausgangspunkt waren, und haben sie intensiv genutzt. Gleichzeitig haben wir auch viel eigenen Code basierend auf diesen Skripten entwickelt.
Es tut mir leid, vielleicht wurde meine Frage übersehen. Wir benötigen keine Anweisungen dazu, wie Dateien in die Serverumgebung verschoben werden, in der der Import stattfindet. Wir haben ein Bulk-Importer-Skript, das @Ghan entwickelt, und wir versuchen herauszufinden, wie man Anhänge schneller verarbeiten kann. Der Wechsel vom normalen Importer zum Bulk-Importer hat bewirkt, dass der Import von Beiträgen von einer Woche auf etwa zwei Stunden verkürzt wurde. Ich hatte gehofft, dass jemand mir eine Richtung aufzeigen könnte, wie man Anhänge ordnungsgemäß importiert.
Entschuldigung, falls ich Ihre Frage falsch verstanden habe und meine Antwort nicht hilfreich war.
Jedenfalls bin ich sicher, dass Sie es herausfinden werden. Es ist keine Raketenwissenschaft (es ist nur Software) und Sie sind kluge Leute.
Viel Glück. Entschuldigung, dass ich nicht hilfreicher war. Wir haben unsere Migration im 2. Quartal 2020 abgeschlossen, und diese Aufgabe (die Migrationsaufgabe) liegt längst hinter uns.
Ich glaube nicht, dass es eine ähnliche Allzwecklösung gibt. Da die Uploads nicht darauf angewiesen sind, dass vorherige Beiträge verarbeitet wurden, könnten Sie mehrere Prozesse starten (z. B. jeweils für einen anderen Datumsbereich), um die Zeit um den Faktor der Anzahl der CPUs zu verkürzen, die Sie einsetzen können (vorausgesetzt, die Datenbank und das Dateisystem sind nicht der Flaschenhals).
Es scheint so, als würden beim Verarbeiten von Beiträgen für Anhänge eine Reihe von Sidekiq-Jobs gestartet, um weitere Verarbeitungsschritte an diesen Beiträgen durchzuführen. Selbst ein einzelner Prozess, der an der Importierung von Anhängen arbeitet, führt dazu, dass die Serverlast langsam auf über 40 steigt, obwohl 8 Kerne vorhanden sind. (Ich habe die Anzahl der Sidekiq-Worker erhöht, um die Last zu bewältigen.)
Ich könnte den Unicorn-Dienst eventuell bis zum Abschluss des Imports stoppen, doch das würde die Last lediglich auf einen späteren Zeitpunkt verschieben. Es scheint, als müsste die Verarbeitung auf die eine oder andere Weise stattfinden.