Điểm:0

High CPU usage by Apache/MySQL

lá cờ cn
a b

I have a problem with CPU usage on the website that uses WordPress, Apache, and MySQL. During the day, from time to time, CPU usage by MySQL and Apache goes up to 2400% (I have 24 cores in total), the server freezes, the average load goes up to 24.

Recently, there was a little more traffic than usual, but this thing shouldn't be permanent, right? I've updated the kernel, the database, libraries, restarted many times. And still, it freezes. I've looked at the process list of the DB, but there is nothing extraordinary. In the database, there are pretty large amounts of data. Just a couple of weeks ago it worked fine, and now it doesn't. So, it shouldn't be unoptimized queries.

What can be the causes of such behavior?

Update:

the result of A) SHOW GLOBAL STATUS LIKE 'com_%r%_table';

+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Com_alter_table       | 5     |
| Com_create_table      | 34    |
| Com_drop_table        | 0     |
| Com_rename_table      | 0     |
| Com_show_create_table | 0     |
+-----------------------+-------+
5 rows in set (3.04 sec)

B) SHOW GLOBAL STATUS LIKE 'uptime%';

+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| Uptime                    | 455524 |
| Uptime_since_flush_status | 455524 |
+---------------------------+--------+
2 rows in set (0.01 sec)

C) SHOW GLOBAL STATUS LIKE '%dirty%';

+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| Innodb_buffer_pool_pages_dirty | 0     |
| Innodb_buffer_pool_bytes_dirty | 0     |
+--------------------------------+-------+
2 rows in set (0.00 sec)

p.s. I still have problems with the server. I needed to change the character set on one of the databases, and it took a little more than a day to finish, with just 400 000 rows. Before, it used to take some time, but not that much. I was wondering, could it be, that after the DDOS attack, there can be some changes to the database, so that it performs worse?

Update 2:

mysqltuner results:

[--] Skipped version check for MySQLTuner script
[OK] Logged in using credentials from Debian maintenance account.
[OK] Currently running supported MySQL version 8.0.26-0ubuntu0.20.04.2
[OK] Operating on 64-bit architecture
 
-------- Log file Recommendations ---------------------------------------------
[OK] Log file /var/log/mysql/error.log exists
[--] Log file: /var/log/mysql/error.log(0B)
[--] Log file /var/log/mysql/error.log is empty. Assuming log-rotation. Use --server-log={file} for explicit file
 
-------- Storage Engine Statistics ---------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA 
[--] Data in InnoDB tables: 262.4G (Tables: 179)
[OK] Total fragmented tables: 0
 
-------- Analysis Performance Metrics ---------------------------------------------
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.
 
-------- Security Recommendations ---------------------------------------------
[--] Skipped due to unsupported feature for MySQL 8
 
-------- CVE Security Recommendations ---------------------------------------------
[OK] NO SECURITY CVE FOUND FOR YOUR VERSION
 
-------- Performance Metrics ---------------------------------------------
[--] Up for: 5d 11h 4m 6s (15M q [31.945 qps], 191K conn, TX: 80G, RX: 2G)
[--] Reads / Writes: 99% / 1%
[--] Binary logging is enabled (GTID MODE: OFF)
[--] Physical Memory     : 31.4G
[--] Max MySQL memory    : 9.8G
[--] Other process memory: 0B
[--] Total buffers: 176.0M global + 65.1M per thread (151 max threads)
[--] P_S Max memory usage: 72B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 9.8G (31.14% of installed RAM)
[OK] Maximum possible memory usage: 9.8G (31.14% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/15M)
[!!] Highest connection usage: 100%  (151/151)
[OK] Aborted connections: 0.09%  (174/191712)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[--] Query cache have been removed in MySQL 8
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 5M sorts)
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 2M total)
[OK] Thread cache hit rate: 92% (15K created / 191K connections)
[OK] Table cache hit rate: 99% (21M hits / 21M requests)
[OK] table_definition_cache(2000) is upper than number of tables(506)
[OK] Open file limit used: 0% (6/10K)
[OK] Table locks acquired immediately: 100% (9 immediate / 9 locks)
[OK] Binlog cache memory access: 99.57% (25538 Memory / 25647 Total)
 
-------- Performance schema ---------------------------------------------
[--] Memory used by P_S: 72B
[--] Sys schema is installed.
 
-------- ThreadPool Metrics ---------------------------------------------
[--] ThreadPool stat is disabled.
 
-------- MyISAM Metrics ---------------------------------------------
[--] MyISAM Metrics are disabled on last MySQL versions.
 
-------- InnoDB Metrics ---------------------------------------------
[--] InnoDB is enabled.
[--] InnoDB Thread Concurrency: 0
[OK] InnoDB File per table is activated
[!!] InnoDB buffer pool / data size: 128.0M/262.4G
[!!] Ratio InnoDB log file size / InnoDB Buffer pool size (75 %): 48.0M * 2/128.0M should be equal to 25%
[OK] InnoDB buffer pool instances: 1
[--] Number of InnoDB Buffer Pool Chunk : 1 for 1 Buffer Pool Instance(s)
[OK] Innodb_buffer_pool_size aligned with Innodb_buffer_pool_chunk_size & Innodb_buffer_pool_instances
[OK] InnoDB Read buffer efficiency: 98.29% (925392031 hits/ 941450541 total)
[!!] InnoDB Write Log efficiency: 309.39% (25100125 hits/ 8112662 total)
[!!] InnoDB log waits: 0.00% (65 waits / 33212787 writes)
 
-------- Aria Metrics ---------------------------------------------
[--] Aria Storage Engine not available.
 
-------- TokuDB Metrics ---------------------------------------------
[--] TokuDB is disabled.
 
-------- XtraDB Metrics ---------------------------------------------
[--] XtraDB is disabled.
 
-------- Galera Metrics ---------------------------------------------
[--] Galera is disabled.
 
-------- Replication Metrics ---------------------------------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: ROW
[--] XA support enabled: ON
[--] Semi synchronous replication Master: Not Activated
[--] Semi synchronous replication Slave: Not Activated
[--] This is a standalone server
 
-------- Recommendations ---------------------------------------------
General recommendations:
    Reduce or eliminate persistent connections to reduce connection usage
    Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
    Before changing innodb_log_file_size and/or innodb_log_files_in_group read this: *link*
Variables to adjust:
    max_connections (> 151)
    wait_timeout (< 28800)
    interactive_timeout (< 28800)
    innodb_buffer_pool_size (>= 262.4G) if possible.
    innodb_log_file_size should be (=16M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.
    innodb_log_buffer_size (>= 16M)

Update 3:

Today my server froze again. The process that overloaded the CPU was the apache2. I've managed to stop the service. And suddenly everything started working smoothly. I've tried to do the backup of the database, the one with a lot of rows, and it worked just fine. But, after some time it all froze again: CPU usage by some processes was at 2400%, the load average exceeded 24. So, my suggestion, that it's not the apache, that loads the CPU, not the MySQL either. Some of the processes, like htop or gzip, which I'm using for the backup, also have high CPU usage, from time to time. What could it be then? Could this be the result of a DDOS attack, and if so, how can I fix it?

Gerrit avatar
lá cờ cn
Chạy `perf top` trong những trường hợp CPU cao này có thể là một bước khởi đầu. Khả năng đọc sẽ được hỗ trợ rất nhiều bằng cách cài đặt các gói biểu tượng gỡ lỗi của Apache, PHP và Mysql cho nền tảng của bạn. Nếu sự cố nằm ở cơ sở dữ liệu, thì `mysqladmin Extended-status` có thể hữu ích. Đặc biệt xem liệu created_tmp_disk_tables hoặc sort_merge_passes có tăng lên nhiều không.
Wilson Hauck avatar
lá cờ jp
Bạn có thể đăng kết quả VĂN BẢN của A) HIỂN THỊ TÌNH TRẠNG TOÀN CẦU NHƯ 'com_%r%_table'; và B) HIỂN THỊ TRẠNG THÁI TOÀN CẦU NHƯ 'thời gian hoạt động%'; và C) HIỂN THỊ TRẠNG THÁI TOÀN CẦU NHƯ '%dirty%'; để phân tích? Có thể có manh mối trong kết quả của bạn. Chào mừng đến với lỗi máy chủ.
a b avatar
lá cờ cn
a b
@WilsonHauck Tôi đã thêm các kết quả được yêu cầu
Michael Hampton avatar
lá cờ cz
Vui lòng đăng đầu ra hoàn chỉnh của mysqltuner.pl
a b avatar
lá cờ cn
a b
@MichaelHampton đã thêm đầu ra mysqltuner
Wilson Hauck avatar
lá cờ jp
@ab Kết quả của bạn từ thông tin SHOW GLOBAL STATUS có chọn lọc giúp loại bỏ việc phá vỡ bảng DROP/CREATE có thể gây ra tình trạng đóng băng tạm thời. Không có trang DIRTY nào gây rắc rối hoặc chậm trễ. Sẽ yêu cầu thông tin bổ sung để tiếp tục xem xét dữ liệu từ phiên bản của bạn.
Wilson Hauck avatar
lá cờ jp
Yêu cầu thông tin bổ sung. Bất kỳ thiết bị SSD hoặc NVME nào trên máy chủ MySQL Host? Đăng trên pastebin.com và chia sẻ các liên kết. Từ thư mục gốc đăng nhập SSH của bạn, Kết quả văn bản của: B) HIỂN THỊ TRẠNG THÁI TOÀN CẦU; sau tối thiểu 24 giờ C) HIỂN THỊ BIẾN TOÀN CẦU; D) HIỂN THỊ ĐẦY ĐỦ QUY TRÌNH; E) TÌNH TRẠNG; không HIỂN THỊ TÌNH TRẠNG, chỉ TÌNH TRẠNG; VÀ Thông tin rất hữu ích tùy chọn, nếu có bao gồm - htop HOẶC hàng đầu cho hầu hết các ứng dụng đang hoạt động, ulimit -a cho danh sách giới hạn Linux/Unix, iostat -xm 5 3 cho IOPS theo thiết bị và số lượng lõi/cpu, để phân tích điều chỉnh khối lượng công việc của máy chủ nhằm đưa ra đề xuất.
a b avatar
lá cờ cn
a b
@WilsonHauck A) Xin lỗi, tôi thực sự không biết về điều đó và tôi không chắc cách kiểm tra. B) HIỂN THỊ TRẠNG THÁI TOÀN CẦU; https://Pastebin.com/hafPj9f3.C) HIỂN THỊ BIẾN TOÀN CẦU; https://Pastebin.com/WSEYa9EL. D) HIỂN THỊ ĐẦY ĐỦ QUY TRÌNH; https://pastebin.com/LYhVkDR6. Truy vấn audio_records là bản sao lưu của cơ sở dữ liệu. E) TÌNH TRẠNG; https://pastebin.com/ziTNcE0Z. htop - https://ibb.co/0sTy30r. ulimit -a - https://Pastebin.com/F9XnG7hZ. iostat - https://ibb.co/5YrzvbJ
a b avatar
lá cờ cn
a b
Ngoài ra, tôi vừa nhận thấy, mặc dù khi tải trung bình dưới 5 và mức sử dụng CPU tổng thể khá thấp, trang web vẫn mất nhiều thời gian hơn để trả lời so với bình thường. Một số yêu cầu đã bị hủy do hết thời gian
Wilson Hauck avatar
lá cờ jp
@ab Phân tích dữ liệu của bạn đang được xử lý. Hy vọng sẽ đăng Đề xuất trong 12 giờ tới. Cảm ơn.
Điểm:1
lá cờ jp

Tỷ lệ mỗi giây = RPS

Các đề xuất cần xem xét cho phần my.cnf [mysqld] của bạn

innodb_buffer_pool_size=22G # từ 128M để chứa 262G dữ liệu của bạn tốt hơn
max_connections=256 # từ 151 vì bạn đã sử dụng tất cả các kết nối
thread_cache_size=150 # từ 9 để giảm RPhr của thread_created xuống 111
innodb_log_file_size=4G # từ 50 triệu để hỗ trợ hơn một giờ trước khi quay
innodb_log_buffer_size=1G # từ 16 triệu để hỗ trợ ~ 30 phút trước khi ghi vào phương tiện

Hiệu suất nên được cải thiện đáng kể. Có nhiều cơ hội hơn để cải thiện hiệu suất. Xem hồ sơ để biết thông tin liên hệ và Tập lệnh tiện ích có thể tải xuống miễn phí để cải thiện hiệu suất.

a b avatar
lá cờ cn
a b
Cảm ơn về những đề nghị. Tôi đã thêm chúng và hiệu suất đã được cải thiện trong thời gian đó. Nhưng việc sử dụng bộ nhớ tăng vọt. Tôi chỉ có 32Gb bộ nhớ và mức sử dụng tối đa của MySQL là 32Gb. Khi tôi cố gắng tối ưu hóa bảng, nó đã làm quá tải bộ nhớ. Bây giờ bộ nhớ ảo của mysqld là 31,4Gb. Nhưng vấn đề vẫn như cũ. Tôi đã tìm ra cách để sao chép nó. Khi tôi cố gắng mở 6-10 trang cùng lúc, mức sử dụng CPU sẽ tăng lên. Trong danh sách quy trình có rất nhiều quy trình đang ngủ yêu cầu dữ liệu từ cơ sở dữ liệu trang web. Chúng không ở đó quá lâu, thời gian tôi thấy nhiều nhất là ~500 giây.
Wilson Hauck avatar
lá cờ jp
Bài htop của bạn mấy hôm trước hiện nhiều process thời gian hơn 1h, muốn trao đổi thì liên hệ. Nếu bất kỳ đề xuất nào là tích cực, vui lòng xem xét một upvote hoặc chấp nhận. Vui lòng gửi truy vấn mở 6-10 trang.
Wilson Hauck avatar
lá cờ jp
@ab Bạn có thể đăng kết quả TEXT lên pastebin.com kết quả hiển thị trạng thái performance_schema của công cụ không; Cảm ơn bạn.
a b avatar
lá cờ cn
a b
Đây là "hiển thị trạng thái performance_schema của động cơ;" đầu ra: https://Pastebin.com/yKjjqZPt. Sau đó, tôi đã tắt MySQL và sự cố vẫn còn đó, tôi không chắc đây có phải là sự cố DB hay không. Phải là một cái gì đó ở một mức độ sâu sắc hơn.
Wilson Hauck avatar
lá cờ jp
Dòng cuối cùng của bài đăng cho biết 228M RAM được sử dụng để lưu trữ thông tin performance_schema. Với 32G, không thành vấn đề. Khi nào bạn có thời gian để thảo luận về htop của mình với các quy trình đã chạy hàng giờ. Bạn có đang lưu trữ phần mềm zabbix trên cùng máy chủ này không? Phần mềm zabbix KHÔNG BAO GIỜ được lưu trữ trên máy chủ sản xuất.
Điểm:0
lá cờ us

Rất khó để nói, nhưng bạn đang nói rằng bạn đang chạy WordPress và mức cao nhất là 24 lõi của bạn đạt 100%, chỉ cần nhớ rằng một truy vấn không thể chỉ sử dụng 1 luồng vào một thời điểm.

Vì vậy, một cái gì đó nghe có vẻ như hiệu suất truy vấn rất tệ và không trực tiếp vào máy chủ web Apache của bạn, bạn đã thử plugin "WP Redis Cache" để lưu truy vấn của bạn vào Redis để lưu tra cứu truy vấn chưa?

Plugin tiếp theo bạn có thể thử cài đặt là "Query Monitor", nó sẽ hiển thị cho bạn các truy vấn SQL mà bạn đang gọi một cách nhanh chóng, nó là một công cụ sửa lỗi rất tốt cho WordPress.

Hãy nhớ rằng nếu bạn đang phát triển các plugin của riêng mình trong WordPress, bạn nên tự chăm sóc Redis bằng cách sử dụng các chức năng tích hợp sẵn để lưu trữ kết quả truy vấn của mình.

Và khi kết thúc cách gỡ lỗi này, tôi sẽ khuyên bạn nên bật truy vấn nhật ký chậm cho MySQL đối với mọi thứ trong hơn 1 giây, bạn có thể tìm thấy truy vấn nơi chỉ mục cho (các) cột bị thiếu/đang bị thiếu.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.