AWS RDS MySQL 隨著時間的推移變慢
我已經閱讀了很多關於這個主題的文章,但沒有一篇是關於 AWS RDS MySQL 數據庫的。從三天前開始,我在 AWS EC2 實例中執行一個 python 腳本,該腳本在我的 AWS RDS MySQL 數據庫中寫入行。我必須寫 3500 萬行,所以我知道這需要一些時間。我定期檢查數據庫的性能,三天后(今天)我意識到數據庫正在變慢。開始時,前 100,000 行僅在 7 分鐘內寫入(這是我正在使用的行的範例)
0000002178-14-000056 AccountsPayableCurrent us-gaap/2014 20131231 0 USD 266099000.0000
三天后,數據庫已經寫入了 5,385,662 行,但現在寫 100,000 行需要將近 3 個小時。怎麼了?
我正在執行的 EC2 實例是 t2.small。如果需要,您可以在此處查看規格:EC2 SPECS 。我正在執行的 RDS 數據庫是 db.t2.small。在此處查看規格:RDS SPECS
我將在此處附上一些關於數據庫和 EC2 實例性能的圖表: Db CPU / Db Memory / Db Write IOPS / Db Write Throughput / EC2 Network in (bytes) / EC2 Network out (bytes)
如果你能幫助我,那就太好了。非常感謝。
編輯 1:我如何插入行? 正如我之前所說,我有一個在 EC2 實例上執行的 python 腳本,該腳本讀取文本文件,使用這些值進行一些計算,然後將每個“新”行寫入數據庫。這是我的一小段程式碼。 我如何閱讀文本文件?
for i in path_list: notify("Uploading: " + i) num_path = "path/" + i + "/file.txt" sub_path = "path/" + i + "/file.txt" try: sub_dict = {} with open(sub_path) as sub_file: for line in sub_file: line = line.strip().split("\t") sub_dict[line[0]] = line[1] # Save cik for every accession number sub_dict[line[1] + "-report"] = line[25] # Save report type for every CIK sub_dict[line[1] + "-frecuency"] = line[28] # Save frecuency for every CIK with open(num_path) as num_file: for line in num_file: num_row = line.strip().split("\t") # Reminder: sometimes in the very old reports, cik and accession number does not match. For this reason I have to write # the following statement. To save the real cik. try: cik = sub_dict[num_row[0]] except: cik = num_row[0][0:10] try: # If there is no value, pass value = num_row[7] values_dict = { 'cik': cik, 'accession': num_row[0][10::].replace("-", ""), 'tag': num_row[1], 'value': value, 'valueid': num_row[6], 'date': num_row[4] } sql = ("INSERT INTO table name (id, tag, value_num, value_id, endtime, cik, report, period) " "VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}')".format( values_dict['cik'] + values_dict['accession'] + values_dict['date'] + values_dict['value'].split(".")[0] + "-" + values_dict['tag'], values_dict['tag'], float(values_dict['value']), values_dict['valueid'], values_dict['date'], int(values_dict['cik']), sub_dict[values_dict['cik'] + "-report"], sub_dict[values_dict['cik'] + "-frecuency"] )) cursor.execute(sql) connection.commit()
我知道沒有什麼
except:
可以try
表達的,但這只是腳本的一部分。我認為重要的部分是我如何插入每一行。如果我不需要使用這些值進行計算,我將使用Load Data Infile
將文本文件寫入數據庫。我只是意識到commit
每次插入一行時可能不是一個好主意。我將嘗試在 10,000 行左右之後送出。
T2 和 T3 實例(包括 db.t2 db.t3 實例)使用CPU Credit系統。當實例空閒時,它會累積 CPU 積分,然後它可以使用這些積分在短時間內更快地執行 -突增性能。一旦你耗盡積分,它就會減慢到基線性能。
一種選擇是在您的 RDS 配置中啟用T2/T3 Unlimited設置,這將使實例在需要時全速執行,但您需要為所需的額外積分付費。
另一種選擇是將實例類型更改為 db.m5 或其他支持一致性能的非 T2/T3 類型。
以下是對 CPU 積分及其累積和使用方式的更深入解釋:關於澄清 t2 和 t3 工作條件?
希望有幫助:)