I'm working on an application which performs a lot of inserts in 2 large
tables.
Previously we didn't know about lwlocks, but we're now testing in Amazon RDS
Aurora - PostgreSQL (9.6.3).
In previous load tests, both local servers and classic Amazon RDS, there was
some scalability limit we couldn't find - CPU / memory / IO were all low,
but still there was contention that wasn't visible in PostgreSQL views.
Now with Aurora it shows that most of the sessions are blocking on
LWLock:buffer_content.
I would like some insights, as we have 2 tables with ~35 million rows each,
and they have several indexes (shown below).
This request is a crucial operation for our system, and each application
request must insert on those 2 large tables in a single transaction, plus
some other selects.
I've searched a lot and found nothing on how to mitigate this issue. Just
found that it might be related to inserts.
Any tips?
For reference, here are the descriptions of both tables:
\d transactions Tabela
"public.transactions" Coluna | Tipo
| Modificadores
---------------------------------------------------+-----------------------------+-------------------------------------------------------------------id
| bigint
| não nulo valor padrão de nextval('transactions_id_seq'::regclass)subclass |
charactervarying(31)
| amount | numeric
| não nuloauthorization_status | character varying(255)
| date | timestamp without time
zone | não nulodescription | text
| transaction_feedback_expiration_notified | boolean
| transaction_feedback_expiration_reminder_notified | boolean
| transaction_feedback_reminder_notified | boolean
| by_id | bigint
| channel_id | bigint
| não nulofeedback_id | bigint
| from_user_id | bigint
| next_authorization_level_id | bigint
| to_user_id | bigint
| type_id | bigint
| não nuloorder_id | bigint
| status | character varying(255)
| received | boolean
| principal_type_id | bigint
| access_client_id | bigint
| original_transfer_id | bigint
| show_to_receiver | boolean
| expiration_date | timestamp without time
zone | scheduled | boolean
| first_installment_immediate | boolean
| installments_count | integer
| process_date | timestamp without time
zone | comments | text
| transaction_id | bigint
| sms_code | character varying(255)
| external_principal_value | character varying(255)
| external_principal_type_id | bigint
| received_by_id | bigint
| from_name | character varying(255)
| to_name | character varying(255)
| next_occurrence_date | timestamp without time
zone | occurrences_count | integer
| occurrence_interval_amount | integer
| occurrence_interval_field | character varying(255)
| last_occurrence_failure_id | bigint
| last_occurrence_success_id | bigint
| by_self | boolean
| from_system | boolean
| to_system | boolean
| ticket_number | character varying(255)
| cancel_url | character varying(255)
| success_url | character varying(255)
| transaction_number | character varying(255)
| expiration_date_comments | text
|
Índices: "transactions_pkey" PRIMARY KEY, btree (id) "ix_external_principal_value" btree (external_principal_value)
WHERE
external_principal_value IS NOT NULL "ix_recurring_next_occurrence_date" btree (next_occurrence_date) WHERE
next_occurrence_date IS NOT NULL "ix_ticket_number" btree (lower(ticket_number::text)) WHERE
ticket_number IS NOT NULL "ix_transactions_amount" btree (amount) "ix_transactions_date" btree (date)
"ix_transactions_fk_transactions_access_client_id"btree
(access_client_id) WHERE access_client_id IS NOT NULL "ix_transactions_fk_transactions_by_id" btree (by_id) WHERE
by_idIS NOT
NULL "ix_transactions_fk_transactions_channel_id" btree (channel_id)
"ix_transactions_fk_transactions_external_principal_type_id"btree
(external_principal_type_id) WHERE external_principal_type_id IS NOT NULL
"ix_transactions_fk_transactions_feedback_id"btree (feedback_id) WHERE
feedback_id IS NOT NULL "ix_transactions_fk_transactions_from_user_id" btree (from_user_id)
WHERE from_user_id IS NOT NULL "ix_transactions_fk_transactions_last_occurrence_failure_id" btree
(last_occurrence_failure_id) WHERE last_occurrence_failure_id IS NOT NULL
"ix_transactions_fk_transactions_last_occurrence_success_id"btree
(last_occurrence_success_id) WHERE last_occurrence_success_id IS NOT NULL
"ix_transactions_fk_transactions_next_authorization_level_id"btree
(next_authorization_level_id) WHERE next_authorization_level_id IS NOT NULL
"ix_transactions_fk_transactions_order_id"btree (order_id) WHERE
order_id IS NOT NULL "ix_transactions_fk_transactions_original_transfer_id" btree
(original_transfer_id) WHERE original_transfer_id IS NOT NULL "ix_transactions_fk_transactions_principal_type_id"
btree
(principal_type_id) WHERE principal_type_id IS NOT NULL "ix_transactions_fk_transactions_received_by_id" btree
(received_by_id)
WHERE received_by_id IS NOT NULL "ix_transactions_fk_transactions_to_user_id" btree (to_user_id) WHERE
to_user_id IS NOT NULL "ix_transactions_fk_transactions_transaction_id" btree (transaction_id)
WHERE transaction_id IS NOT NULL "ix_transactions_fk_transactions_type_id" btree (type_id)
"ix_transactions_subclass"btree (subclass) "ix_transactions_transaction_number" btree
(lower(transaction_number::text)) WHERE transaction_number IS NOT NULL "next_occurrence_date" btree
(next_occurrence_date)
Restrições de chave estrangeira: "fk_transactions_access_client_id" FOREIGN KEY (access_client_id)
REFERENCES access_clients(id) "fk_transactions_by_id" FOREIGN KEY (by_id) REFERENCES users(id)
"fk_transactions_channel_id"FOREIGN KEY (channel_id) REFERENCES
channels(id) "fk_transactions_external_principal_type_id" FOREIGN KEY
(external_principal_type_id) REFERENCES principal_types(id) "fk_transactions_feedback_id" FOREIGN KEY (feedback_id)
REFERENCES
refs(id) "fk_transactions_from_user_id" FOREIGN KEY (from_user_id) REFERENCES
users(id) "fk_transactions_last_occurrence_failure_id" FOREIGN KEY
(last_occurrence_failure_id) REFERENCES failed_payment_occurrences(id) "fk_transactions_last_occurrence_success_id"
FOREIGNKEY
(last_occurrence_success_id) REFERENCES transfers(id) "fk_transactions_next_authorization_level_id" FOREIGN KEY
(next_authorization_level_id) REFERENCES authorization_levels(id) "fk_transactions_order_id" FOREIGN KEY (order_id)
REFERENCES
ad_orders(id) "fk_transactions_original_transfer_id" FOREIGN KEY
(original_transfer_id) REFERENCES transfers(id) "fk_transactions_principal_type_id" FOREIGN KEY (principal_type_id)
REFERENCES principal_types(id) "fk_transactions_received_by_id" FOREIGN KEY (received_by_id) REFERENCES
users(id) "fk_transactions_to_user_id" FOREIGN KEY (to_user_id) REFERENCES
users(id) "fk_transactions_transaction_id" FOREIGN KEY (transaction_id) REFERENCES
transactions(id) "fk_transactions_type_id" FOREIGN KEY (type_id) REFERENCES
transfer_types(id)
Referenciada por: TABLE "amount_reservations" CONSTRAINT
"fk_amount_reservations_external_payment_id" FOREIGN KEY
(external_payment_id) REFERENCES transactions(id) TABLE "amount_reservations" CONSTRAINT
"fk_amount_reservations_scheduled_payment_id" FOREIGN KEY
(scheduled_payment_id) REFERENCES transactions(id) TABLE "amount_reservations" CONSTRAINT
"fk_amount_reservations_transaction_id" FOREIGN KEY (transaction_id)
REFERENCES transactions(id) TABLE "failed_payment_occurrences" CONSTRAINT
"fk_failed_payment_occurrences_recurring_payment_id" FOREIGN KEY
(recurring_payment_id) REFERENCES transactions(id) TABLE "refs" CONSTRAINT "fk_refs_transaction_id" FOREIGN KEY
(transaction_id) REFERENCES transactions(id) TABLE "scheduled_payment_installments" CONSTRAINT
"fk_scheduled_payment_installments_scheduled_payment_id" FOREIGN KEY
(scheduled_payment_id) REFERENCES transactions(id) TABLE "transaction_authorizations" CONSTRAINT
"fk_transaction_authorizations_transaction_id" FOREIGN KEY (transaction_id)
REFERENCES transactions(id) TABLE "transaction_custom_field_values" CONSTRAINT
"fk_transaction_custom_field_values_owner_id" FOREIGN KEY (owner_id)
REFERENCES transactions(id) TABLE "transactions" CONSTRAINT "fk_transactions_transaction_id" FOREIGN
KEY (transaction_id) REFERENCES transactions(id) TABLE "transfers" CONSTRAINT "fk_transfers_transaction_id" FOREIGN
KEY
(transaction_id) REFERENCES transactions(id) TABLE "voucher_packs" CONSTRAINT "fk_voucher_packs_buy_id" FOREIGN KEY
(buy_id) REFERENCES transactions(id) TABLE "vouchers" CONSTRAINT "fk_vouchers_redeem_id" FOREIGN KEY
(redeem_id) REFERENCES transactions(id)
------------------------------------------------------------------
\d transfers Tabela
"public.transfers" Coluna | Tipo |
Modificadores
----------------------------------+-----------------------------+----------------------------------------------------------------id
| bigint | não nulo
valor padrão de nextval('transfers_id_seq'::regclass)subclass | character varying(31) |
amount | numeric | não nulodate | timestamp
withouttime zone | não nuloemission_date | timestamp without time zone | expiration_date
| timestamp without time zone | from_id | bigint | não nuloparent_id
| bigint | to_id | bigint |
nãonulotype_id | bigint | não nulocharged_back_by_id |
bigint | user_account_fee_log_id | bigint | chargeback_of_id
| bigint | transaction_id | bigint |
scheduled_payment_installment_id| bigint | transfer_fee_id | bigint
| number | integer | by_id | bigint
| transaction_number | character varying(255) |
Índices: "transfers_pkey" PRIMARY KEY, btree (id) "ix_transfers_amount" btree (amount) "ix_transfers_date" btree
(date) "ix_transfers_fk_transfers_by_id" btree (by_id) WHERE by_id IS NOT NULL
"ix_transfers_fk_transfers_chargeback_of_id"btree (chargeback_of_id)
WHERE chargeback_of_id IS NOT NULL "ix_transfers_fk_transfers_charged_back_by_id" btree
(charged_back_by_id) WHERE charged_back_by_id IS NOT NULL "ix_transfers_fk_transfers_from_id" btree (from_id)
"ix_transfers_fk_transfers_parent_id"btree (parent_id) WHERE parent_id
IS NOT NULL "ix_transfers_fk_transfers_scheduled_payment_installment_id" btree
(scheduled_payment_installment_id) WHERE scheduled_payment_installment_id IS
NOT NULL "ix_transfers_fk_transfers_to_id" btree (to_id) "ix_transfers_fk_transfers_transaction_id" btree
(transaction_id)WHERE
transaction_id IS NOT NULL "ix_transfers_fk_transfers_transfer_fee_id" btree (transfer_fee_id)
WHERE transfer_fee_id IS NOT NULL "ix_transfers_fk_transfers_type_id" btree (type_id)
"ix_transfers_fk_transfers_user_account_fee_log_id"btree
(user_account_fee_log_id) WHERE user_account_fee_log_id IS NOT NULL "ix_transfers_transaction_number" btree
(lower(transaction_number::text)) WHERE transaction_number IS NOT NULL
Restrições de chave estrangeira: "fk_transfers_by_id" FOREIGN KEY (by_id) REFERENCES users(id)
"fk_transfers_chargeback_of_id"FOREIGN KEY (chargeback_of_id)
REFERENCES transfers(id) "fk_transfers_charged_back_by_id" FOREIGN KEY (charged_back_by_id)
REFERENCES transfers(id) "fk_transfers_from_id" FOREIGN KEY (from_id) REFERENCES accounts(id)
"fk_transfers_parent_id"FOREIGN KEY (parent_id) REFERENCES
transfers(id) "fk_transfers_scheduled_payment_installment_id" FOREIGN KEY
(scheduled_payment_installment_id) REFERENCES
scheduled_payment_installments(id) "fk_transfers_to_id" FOREIGN KEY (to_id) REFERENCES accounts(id)
"fk_transfers_transaction_id"FOREIGN KEY (transaction_id) REFERENCES
transactions(id) "fk_transfers_transfer_fee_id" FOREIGN KEY (transfer_fee_id) REFERENCES
transfer_fees(id) "fk_transfers_type_id" FOREIGN KEY (type_id) REFERENCES
transfer_types(id) "fk_transfers_user_account_fee_log_id" FOREIGN KEY
(user_account_fee_log_id) REFERENCES user_account_fee_logs(id)
Referenciada por: TABLE "account_balances" CONSTRAINT "fk_account_balances_transfer_id"
FOREIGN KEY (transfer_id) REFERENCES transfers(id) TABLE "failed_payment_occurrences" CONSTRAINT
"fk_failed_payment_occurrences_transfer_id" FOREIGN KEY (transfer_id)
REFERENCES transfers(id) TABLE "transactions" CONSTRAINT
"fk_transactions_last_occurrence_success_id" FOREIGN KEY
(last_occurrence_success_id) REFERENCES transfers(id) TABLE "transactions" CONSTRAINT
"fk_transactions_original_transfer_id"
FOREIGN KEY (original_transfer_id) REFERENCES transfers(id) TABLE "transfer_status_logs" CONSTRAINT
"fk_transfer_status_logs_transfer_id" FOREIGN KEY (transfer_id) REFERENCES
transfers(id) TABLE "transfers" CONSTRAINT "fk_transfers_chargeback_of_id" FOREIGN KEY
(chargeback_of_id) REFERENCES transfers(id) TABLE "transfers" CONSTRAINT "fk_transfers_charged_back_by_id" FOREIGN
KEY (charged_back_by_id) REFERENCES transfers(id) TABLE "transfers" CONSTRAINT "fk_transfers_parent_id" FOREIGN KEY
(parent_id) REFERENCES transfers(id) TABLE "transfers_transfer_status_flows" CONSTRAINT
"fk_transfers_transfer_status_flows_transfer_id" FOREIGN KEY (transfer_id)
REFERENCES transfers(id)
--
Sent from: http://www.postgresql-archive.org/PostgreSQL-performance-f2050081.html
--
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance