Statistik operasi baca

Spanner menyediakan tabel bawaan yang menyimpan statistik tentang pembacaan. Anda dapat mengambil statistik dari tabel SPANNER_SYS.READ_STATS* ini menggunakan pernyataan SQL.

Kapan harus menggunakan statistik baca

Statistik baca memberikan insight tentang cara aplikasi menggunakan database, dan berguna saat menyelidiki masalah performa. Misalnya, Anda dapat memeriksa bentuk bacaan yang berjalan terhadap database, seberapa sering bentuk bacaan tersebut berjalan, dan menjelaskan karakteristik performa bentuk bacaan ini. Anda dapat menggunakan statistik baca untuk database Anda guna mengidentifikasi bentuk baca yang menyebabkan penggunaan CPU tinggi. Secara umum, statistik baca akan membantu Anda memahami perilaku traffic yang masuk ke database dalam hal penggunaan resource.

Batasan

  • Alat ini paling cocok untuk menganalisis aliran pembacaan serupa yang menyumbang sebagian besar penggunaan CPU. Tidak cocok untuk menelusuri bacaan yang hanya dijalankan satu kali.

  • Penggunaan CPU yang dilacak dalam statistik ini menunjukkan penggunaan CPU sisi server Spanner, tidak termasuk penggunaan CPU pengambilan data dan beberapa overhead lainnya.

  • Statistik dikumpulkan berdasarkan upaya terbaik. Akibatnya, statistik dapat terlewat jika ada masalah pada sistem yang mendasarinya. Misalnya, jika ada masalah jaringan internal, beberapa statistik mungkin tidak tercatat.

Mengakses statistik baca

Spanner menyediakan statistik baca dalam skema SPANNER_SYS. Anda dapat menggunakan cara berikut untuk mengakses data SPANNER_SYS:

  • Halaman Spanner Studio database di konsol Google Cloud .

  • Perintah gcloud spanner databases execute-sql.

  • Metode executeSql atau executeStreamingSql.

Metode baca tunggal berikut yang disediakan Spanner tidak mendukung SPANNER_SYS:

  • Melakukan pembacaan yang kuat dari satu baris atau beberapa baris dalam tabel.
  • Melakukan pembacaan basi dari satu baris atau beberapa baris dalam tabel.
  • Membaca dari satu baris atau beberapa baris dalam indeks sekunder.

Penggunaan CPU yang dikelompokkan menurut bentuk baca

Tabel berikut melacak bentuk baca dengan penggunaan CPU tertinggi selama jangka waktu tertentu:

  • SPANNER_SYS.READ_STATS_TOP_MINUTE: Statistik bentuk baca yang digabungkan di seluruh interval 1 menit.
  • SPANNER_SYS.READ_STATS_TOP_10MINUTE: Membaca statistik bentuk yang digabungkan di seluruh interval 10 menit.
  • SPANNER_SYS.READ_STATS_TOP_HOUR: Membaca statistik bentuk yang digabungkan di seluruh interval 1 jam.

Tabel ini memiliki properti berikut:

  • Setiap tabel berisi data untuk interval waktu yang tidak tumpang-tindih dengan panjang yang ditentukan oleh nama tabel.

  • Interval didasarkan pada waktu jam. Interval 1 menit berakhir pada menit ke-1, interval 10 menit berakhir setiap 10 menit yang dimulai pada jam ke-1, dan interval 1 jam berakhir pada jam ke-1. Setelah setiap interval, Spanner mengumpulkan data dari semua server, lalu menyediakan data tersebut di tabel SPANNER_SYS tidak lama setelahnya.

    Misalnya, pada pukul 11.59.30, interval terbaru yang tersedia untuk kueri SQL adalah:

    • 1 menit: 11.58.00–11.58.59 AM
    • 10 menit: 11.40.00–11.49.59 AM
    • 1 jam: 10.00.00–10.59.59
  • Spanner mengelompokkan statistik menurut bentuk baca. Jika ada tag, FPRINT adalah hash tag. Jika tidak, nilai tersebut adalah hash dari nilai READ_COLUMNS.

  • Setiap baris berisi statistik untuk semua eksekusi bentuk baca tertentu yang statistiknya diambil oleh Spanner selama interval yang ditentukan.

  • Jika Spanner tidak dapat menyimpan informasi tentang setiap bentuk baca yang berbeda yang dijalankan selama interval, sistem akan memprioritaskan bentuk baca dengan penggunaan CPU tertinggi selama interval yang ditentukan.

Skema tabel

Nama kolom Jenis Deskripsi
INTERVAL_END TIMESTAMP Akhir interval waktu saat eksekusi baca yang disertakan terjadi.
REQUEST_TAG STRING Tag permintaan opsional untuk operasi baca ini. Untuk mengetahui informasi selengkapnya tentang cara menggunakan tag, lihat Memecahkan masalah dengan tag permintaan. Statistik untuk beberapa pembacaan yang memiliki string tag yang sama dikelompokkan dalam satu baris dengan `REQUEST_TAG` yang cocok dengan string tag tersebut.
READ_TYPE STRING Menunjukkan apakah pembacaan adalah PARTITIONED_READ atau READ. Pembacaan dengan partitionToken yang diperoleh dari PartitionRead API diwakili oleh jenis pembacaan PARTITIONED_READ dan API pembacaan lainnya oleh READ.
READ_COLUMNS ARRAY<STRING> Kumpulan kolom yang dibaca. Daftar ini diurutkan berdasarkan abjad.
FPRINT INT64 Hash nilai REQUEST_TAG jika ada; Jika tidak, hash nilai READ_COLUMNS.
EXECUTION_COUNT INT64 Jumlah Spanner menjalankan bentuk baca selama interval.
AVG_ROWS FLOAT64 Jumlah rata-rata baris yang ditampilkan oleh pembacaan.
AVG_BYTES FLOAT64 Jumlah rata-rata byte data yang ditampilkan bacaan, tidak termasuk overhead encoding transmisi.
AVG_CPU_SECONDS FLOAT64 Jumlah rata-rata detik CPU sisi server Spanner yang mengeksekusi baca, tidak termasuk CPU pengambilan data dan overhead lainnya.
AVG_LOCKING_DELAY_SECONDS FLOAT64 Jumlah rata-rata detik yang dihabiskan untuk menunggu karena penguncian.
AVG_CLIENT_WAIT_SECONDS FLOAT64 Jumlah rata-rata detik yang dihabiskan untuk menunggu karena klien tidak menggunakan data secepat yang dapat dihasilkan Spanner.
AVG_LEADER_REFRESH_DELAY_SECONDS FLOAT64 Jumlah rata-rata detik yang dihabiskan untuk menunggu konfirmasi dengan pemimpin Paxos bahwa semua penulisan telah diamati.
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT INT64 Jumlah pembacaan yang dijalankan sebagai bagian dari transaksi baca-tulis. Kolom ini membantu Anda menentukan apakah Anda dapat menghindari pertentangan konten kunci dengan memindahkan pembacaan ke transaksi hanya baca.
AVG_DISK_IO_COST FLOAT64

Biaya rata-rata kueri ini dalam hal pemuatan disk HDD Spanner .

Gunakan nilai ini untuk membuat perbandingan biaya I/O HDD relatif antara pembacaan yang Anda jalankan di database. Membuat kueri data di penyimpanan HDD akan dikenai biaya terhadap kapasitas pemuatan disk HDD instance. Nilai yang lebih tinggi menunjukkan bahwa Anda menggunakan beban disk HDD lebih banyak dan kueri Anda mungkin lebih lambat daripada jika dijalankan di SSD. Selain itu, jika beban disk HDD Anda mencapai kapasitas maksimum, performa kueri Anda mungkin akan semakin terpengaruh. Anda dapat memantau total kapasitas beban disk HDD instance sebagai persentase. Untuk menambahkan kapasitas beban disk HDD lainnya, Anda dapat menambahkan unit atau node pemrosesan lainnya ke instance Anda. Untuk mengetahui informasi selengkapnya, lihat Mengubah kapasitas komputasi. Untuk meningkatkan performa kueri, pertimbangkan juga untuk memindahkan beberapa data ke SSD.

Untuk beban kerja yang menggunakan banyak I/O disk, sebaiknya Anda menyimpan data yang sering diakses di penyimpanan SSD. Data yang diakses dari SSD tidak menggunakan kapasitas beban disk HDD. Anda dapat menyimpan tabel, kolom, atau indeks sekunder tertentu di penyimpanan SSD sesuai kebutuhan, sekaligus menyimpan data yang jarang diakses di penyimpanan HDD. Untuk mengetahui informasi selengkapnya, lihat Ringkasan penyimpanan bertingkat.

Contoh kueri

Bagian ini mencakup beberapa contoh pernyataan SQL yang mengambil statistik baca. Anda dapat menjalankan pernyataan SQL ini menggunakan library klien, gcloud spanner, atau Google Cloud console.

Mencantumkan statistik dasar untuk setiap bentuk baca dalam jangka waktu tertentu

Kueri berikut menampilkan data mentah untuk bentuk yang paling banyak dibaca dalam interval waktu 1 menit terbaru.

SELECT fprint,
       read_columns,
       execution_count,
       avg_cpu_seconds,
       avg_rows,
       avg_bytes,
       avg_locking_delay_seconds,
       avg_client_wait_seconds
FROM spanner_sys.read_stats_top_minute
ORDER BY interval_end DESC LIMIT 3;
Output kueri
fprint read_columns execution_count avg_cpu_seconds avg_rows avg_bytes avg_locking_delay_seconds avg_client_wait_seconds
125062082139 ["Singers.id", "Singers.name"] 8514387 0.000661355290396507 310.79 205 8.3232564943763752e-06 0
151238888745 ["Singers.singerinfo"] 3341542 6.5992827184280315e-05 12784 54 4.6859741349028595e-07 0
14105484 ["Albums.id", "Albums.title"] 9306619 0.00017855774721667873 1165.4 2964.71875 1.4328191393074178e-06 0

Mencantumkan bentuk baca, diurutkan berdasarkan total penggunaan CPU tertinggi

Kueri berikut menampilkan bentuk baca dengan penggunaan CPU tertinggi dalam satu jam terakhir:

SELECT read_columns,
       execution_count,
       avg_cpu_seconds,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.read_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_top_hour)
ORDER BY total_cpu DESC LIMIT 3;
Output kueri
read_columns execution_count avg_cpu_seconds total_cpu
["Singers.id", "Singers.name"] 1647 0.00023380297430622681 0.2579
["Albums.id", "Albums.title"] 720 0.00016738889440282034 0.221314999999999
["Singers.singerinfo""] 3223 0.00037764625882302246 0.188053

Statistik gabungan

SPANNER_SYS juga berisi tabel untuk menyimpan statistik baca gabungan yang diambil oleh Spanner dalam jangka waktu tertentu:

  • SPANNER_SYS.READ_STATS_TOTAL_MINUTE: Mengagregasi statistik untuk semua bentuk baca selama interval 1 menit.
  • SPANNER_SYS.READ_STATS_TOTAL_10MINUTE: Statistik gabungan untuk semua bentuk bacaan selama interval 10 menit.
  • SPANNER_SYS.READ_STATS_TOTAL_HOUR: Statistik gabungan untuk semua bentuk baca selama interval 1 jam.

Tabel statistik gabungan memiliki properti berikut:

  • Setiap tabel berisi data untuk interval waktu yang tidak tumpang-tindih dengan panjang yang ditentukan oleh nama tabel.

  • Interval didasarkan pada waktu jam. Interval 1 menit berakhir pada menit ke-1, interval 10 menit berakhir setiap 10 menit dimulai pada jam ke-1, dan interval 1 jam berakhir pada jam ke-1.

    Misalnya, pada pukul 11.59.30, interval terbaru yang tersedia untuk kueri SQL pada statistik baca gabungan adalah:

    • 1 menit: 11.58.00–11.58.59 AM
    • 10 menit: 11.40.00–11.49.59 AM
    • 1 jam: 10.00.00–10.59.59
  • Setiap baris berisi statistik untuk semua bentuk baca yang dieksekusi melalui database selama interval yang ditentukan, yang digabungkan bersama. Hanya ada satu baris per interval waktu.

  • Statistik yang dicatat dalam tabel SPANNER_SYS.READ_STATS_TOTAL_* mungkin mencakup bentuk baca yang tidak dicatat Spanner dalam tabel SPANNER_SYS.READ_STATS_TOP_*.

  • Beberapa kolom dalam tabel ini ditampilkan sebagai metrik di Cloud Monitoring. Metrik yang diekspos adalah:

    • Jumlah baris yang ditampilkan
    • Jumlah eksekusi baca
    • Waktu CPU baca
    • Penundaan penguncian
    • Waktu tunggu klien
    • Penundaan pembaruan pemimpin
    • Jumlah byte yang dikembalikan

    Untuk mengetahui informasi selengkapnya, lihat Metrik Spanner.

Skema tabel

Nama kolom Jenis Deskripsi
INTERVAL_END TIMESTAMP Akhir interval waktu saat eksekusi bentuk baca yang disertakan terjadi.
EXECUTION_COUNT INT64 Jumlah Spanner menjalankan bentuk baca selama interval.
AVG_ROWS FLOAT64 Jumlah rata-rata baris yang ditampilkan pembacaan.
AVG_BYTES FLOAT64 Jumlah rata-rata byte data yang ditampilkan oleh pembacaan, tidak termasuk overhead encoding transmisi.
AVG_CPU_SECONDS FLOAT64 Jumlah rata-rata detik CPU sisi server Spanner yang mengeksekusi baca, tidak termasuk CPU pengambilan data dan overhead lainnya.
AVG_LOCKING_DELAY_SECONDS FLOAT64 Jumlah rata-rata detik yang dihabiskan untuk menunggu karena penguncian.
AVG_CLIENT_WAIT_SECONDS FLOAT64 Jumlah rata-rata detik yang dihabiskan untuk menunggu karena pembatasan.
AVG_LEADER_REFRESH_DELAY_SECONDS FLOAT64 Jumlah rata-rata detik yang dihabiskan untuk mengoordinasikan pembacaan di seluruh instance dalam konfigurasi multi-region.
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT INT64 Jumlah pembacaan yang dijalankan sebagai bagian dari transaksi baca-tulis. Kolom ini membantu Anda menentukan apakah Anda dapat menghindari pertentangan kunci dengan memindahkan beberapa pembacaan ke transaksi hanya baca.

Contoh kueri

Bagian ini mencakup beberapa contoh pernyataan SQL yang mengambil statistik baca gabungan. Anda dapat menjalankan pernyataan SQL ini menggunakan library klien, gcloud spanner, atau Google Cloud console.

Menemukan total penggunaan CPU di semua bentuk baca

Kueri berikut menampilkan jumlah jam CPU yang digunakan oleh bentuk baca dalam satu jam terakhir:

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.read_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_total_hour);
Output kueri
total_cpu_hours
0.00026186111111111115

Menemukan total jumlah eksekusi dalam jangka waktu tertentu

Kueri berikut menampilkan jumlah total bentuk baca yang dieksekusi dalam interval 1 menit lengkap terbaru:

SELECT interval_end,
       execution_count
FROM spanner_sys.read_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_total_minute);
Output kueri
interval_end execution_count
2020-05-28 11:02:00-07:00 12861966

Retensi data

Setidaknya, Spanner menyimpan data untuk setiap tabel selama jangka waktu berikut:

  • SPANNER_SYS.READ_STATS_TOP_MINUTE dan SPANNER_SYS.READ_STATS_TOTAL_MINUTE: Interval yang mencakup 6 jam sebelumnya.

  • SPANNER_SYS.READ_STATS_TOP_10MINUTE dan SPANNER_SYS.READ_STATS_TOTAL_10MINUTE: Interval yang mencakup 4 hari sebelumnya.

  • SPANNER_SYS.READ_STATS_TOP_HOUR dan SPANNER_SYS.READ_STATS_TOTAL_HOUR: Interval yang mencakup 30 hari sebelumnya.

Memecahkan masalah penggunaan CPU yang tinggi dengan statistik baca

Statistik baca Spanner berguna jika Anda perlu menyelidiki penggunaan CPU yang tinggi di database Spanner atau saat Anda hanya mencoba memahami bentuk baca yang berat CPU di database Anda. Pemeriksaan bentuk baca yang menggunakan sejumlah besar resource database memberi pengguna Spanner cara potensial untuk mengurangi biaya operasional dan mungkin meningkatkan latensi sistem secara umum. Dengan menggunakan langkah-langkah berikut, kami akan menunjukkan cara menggunakan statistik baca untuk menyelidiki penggunaan CPU yang tinggi di database Anda.

Pilih jangka waktu yang akan diselidiki

Mulai penyelidikan Anda dengan mencari waktu saat aplikasi Anda mulai mengalami penggunaan CPU yang tinggi. Misalnya, dalam skenario berikut, masalah mulai terjadi sekitar pukul 17.20 pada 28 Mei 2020.

Mengumpulkan statistik baca untuk jangka waktu yang dipilih

Setelah memilih jangka waktu untuk memulai penyelidikan, kita akan melihat statistik yang dikumpulkan dalam tabel READ_STATS_TOTAL_10MINUTE pada waktu tersebut. Hasil kueri ini dapat memberi kita petunjuk tentang bagaimana CPU dan statistik baca lainnya berubah selama jangka waktu tersebut. Kueri berikut menampilkan statistik baca yang diagregasi dari 4:30 pm hingga 7:30 pm (inklusif).

SELECT
  interval_end,
  ROUND(avg_cpu_seconds,4) as avg_cpu_seconds,
  execution_count,
  avg_locking_delay_seconds
FROM SPANNER_SYS.READ_STATS_TOTAL_10MINUTE
WHERE
  interval_end >= "2020-05-28T16:30:00"
  AND interval_end <= "2020-05-28T19:30:00"
ORDER BY interval_end;

Data berikut adalah contoh hasil yang kita dapatkan dari kueri.

interval_end avg_cpu_seconds execution_count avg_locking_delay_seconds
2020-05-28 16:40:00-07:00 0,0004 11111421 8.3232564943763752e-06
28-05-2020 16:50:00-07:00 0,0002 8815637 8.98734051776406e-05
28-05-2020 17:00:00-07:00 0,0001 8260215 6.039129247846453e-06
28-05-2020 17:10:00-07:00 0,0001 8514387 9.0535466616680686e-07
2020-05-28 17:20:00-07:00 0,0006 13715466 2.6801485272173765e-06
2020-05-28 17:30:00-07:00 0,0007 12861966 4.6859741349028595e-07
2020-05-28 17:40:00-07:00 0,0007 3755954 2.7131391918005383e-06
2020-05-28 17:50:00-07:00 0,0006 4248137 1.4328191393074178e-06
2020-05-28 18:00:00-07:00 0,0006 3986198 2.6973481999639748e-06
2020-05-28 18:10:00-07:00 0,0006 3510249 3.7577083563017905e-06
28-05-2020 18:20:00-07:00 0,0004 3341542 4.0940589703795433e-07
2020-05-28 18:30:00-07:00 0,0002 8695147 1,9914494947583975e-05
2020-05-28 18:40:00-07:00 0,0003 11679702 1,8331461539001595e-05
2020-05-28 18:50:00-07:00 0,0003 9306619 1,2527332321222135e-05
2020-05-28 19:00:00-07:00 0,0002 8520508 6.2268448078447915e-06
2020-05-28 19:10:00-07:00 0,0006 13715466 2.6801485272173765e-06
2020-05-28 19:20:00-07:00 0,0005 11947323 3.3029114639321295e-05
2020-05-28 19:30:00-07:00 0,0002 8514387 9.0535466616680686e-07

Di sini kita melihat bahwa waktu CPU rata-rata, avg_cpu_seconds, lebih tinggi dalam interval yang ditandai. interval_end dengan nilai 2020-05-28 19:20:00 memiliki waktu CPU yang lebih tinggi, jadi kita akan memilih interval tersebut untuk diselidiki lebih lanjut pada langkah berikutnya.

Menemukan bentuk baca yang menyebabkan penggunaan CPU tinggi

Dengan menggali lebih dalam, kita sekarang membuat kueri tabel READ_STATS_TOP_10MINUTE untuk interval yang dipilih pada langkah sebelumnya. Hasil kueri ini dapat membantu menunjukkan bentuk bacaan mana yang menyebabkan penggunaan CPU tinggi.

SELECT
  read_columns,
  ROUND(avg_cpu_seconds,4) as avg_cpu_seconds,
  execution_count,
  avg_rows
FROM SPANNER_SYS.READ_STATS_TOP_10MINUTE
WHERE
  interval_end = "2020-05-28T19:20:00"
ORDER BY avg_cpu_seconds DESC LIMIT 3;

Data berikut sebagai contoh hasil yang kita dapatkan dari kueri, yang menampilkan informasi tentang tiga bentuk bacaan teratas yang diberi peringkat berdasarkan avg_cpu_seconds. Perhatikan penggunaan ROUND dalam kueri kami untuk membatasi output avg_cpu_seconds menjadi 4 angka di belakang koma.

read_columns avg_cpu_seconds execution_count avg_rows
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.score,globalTagAffinity.shares]1 0,4192 1182 11650.42216582
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.likes,globalTagAffinity.score] 0,0852 4 12784
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.score,globalTagAffinity.ugcCount] 0,0697 1140 310.7921052631

1 _exists adalah kolom internal yang digunakan untuk memeriksa apakah baris tertentu ada atau tidak.

Salah satu alasan penggunaan CPU yang tinggi mungkin karena Anda mulai menjalankan beberapa bentuk baca lebih sering (execution_count). Mungkin jumlah rata-rata baris yang ditampilkan baca telah meningkat (avg_rows). Jika tidak ada properti bentuk baca yang mengungkapkan sesuatu yang menarik, Anda dapat memeriksa properti lain seperti avg_locking_delay_seconds, avg_client_wait_seconds, atau avg_bytes.

Menerapkan praktik terbaik untuk mengurangi penggunaan CPU yang tinggi

Setelah Anda menyelesaikan langkah-langkah sebelumnya, pertimbangkan apakah menerapkan salah satu praktik terbaik ini akan membantu situasi Anda.

  • Jumlah Spanner menjalankan bentuk baca selama interval adalah contoh yang baik dari metrik yang memerlukan baseline untuk memberi tahu Anda apakah pengukuran wajar atau merupakan tanda masalah. Setelah menetapkan garis dasar untuk metrik, Anda dapat mendeteksi dan menyelidiki penyebab penyimpangan yang tidak terduga dari perilaku normal.

  • Jika Penggunaan CPU relatif konstan hampir sepanjang waktu, tetapi tiba-tiba menunjukkan lonjakan yang dapat dikorelasikan dengan lonjakan serupa yang tiba-tiba dalam permintaan pengguna atau perilaku aplikasi, hal ini mungkin merupakan indikasi bahwa semuanya berfungsi seperti yang diharapkan.

  • Coba kueri berikut untuk menemukan bentuk baca teratas yang diberi peringkat berdasarkan jumlah waktu Spanner dieksekusi untuk setiap bentuk baca:

    SELECT interval_end, read_columns, execution_count
    FROM SPANNER_SYS.READ_STATS_TOP_MINUTE
    ORDER BY execution_count DESC
    LIMIT 10;
    
  • Jika Anda mencari latensi baca serendah mungkin, terutama saat menggunakan konfigurasi instance multi-region, gunakan bacaan basi, bukan bacaan kuat untuk mengurangi atau menghapus komponen AVG_LEADER_REFRESH_DELAY_SECONDS latensi baca.

  • Jika Anda hanya melakukan pembacaan, dan Anda dapat mengekspresikan pembacaan menggunakan metode pembacaan tunggal, Anda harus menggunakan metode pembacaan tunggal tersebut. Pembacaan tunggal tidak mengunci, tidak seperti transaksi baca-tulis, jadi Anda harus menggunakan transaksi hanya baca daripada transaksi baca-tulis yang lebih mahal jika Anda tidak menulis data.

Langkah berikutnya