Ssd máy chủ ssd hiệu suất chậm


7

Tôi không có ý tưởng, vì vậy tôi đang nhờ bạn giúp đỡ. Tôi có một vấn đề kỳ lạ mà tôi không thể tìm ra nguyên nhân cho dù tôi có tìm kiếm bao nhiêu trên internet.

Điều đó là, tôi có hai máy tính xách tay:

l1: Ổ cứng và SSD Kingston HyperX Fury SATA-III (240G)

l2: Ổ cứng và ổ SSD Samsung 960 evo, nvme (500G)

Và tôi có một quy trình để kiểm tra hiệu năng của cơ sở dữ liệu, trong đó chèn, chọn và xóa từ 3 bảng khác nhau, với số lượng 10.000 và 100.000.

l2 được mua sau l1 và tôi đã cố gắng di chuyển mọi thứ tôi có trên l1 sang l2, bao gồm cả cơ sở dữ liệu. Sau khi chạy thủ tục hiệu suất tôi nhận thấy một điều kỳ lạ, l2 đang chiếm nhiều hơn l1. Một ví dụ là việc chèn 10.000 dòng trong một bảng, l1 sẽ mất 1 giây, trong đó l2 sẽ mất 28 giây. Tất nhiên, tôi không đủ kiên nhẫn để thử 100.000 lần chèn vào l2, trong đó trên l1 sẽ chỉ mất 40 giây.

Vì vậy, tôi đã cố gắng tìm ra nguyên nhân của nguyên nhân. Trình quản lý tác vụ đã mở (Tôi đang sử dụng Windows 10), tab hiệu suất và phát hiện ra rằng, khi sắp chèn, SSD chỉ ghi với tốc độ 200kb / giây, trong khi SSD của l1 ghi 4,4 MB / s.

l2

nhập mô tả hình ảnh ở đây

Tất nhiên, tôi đã có khả năng SSD có thể bị lỗi nên tôi đã sử dụng 3 điểm chuẩn để xem. Cái đầu tiên tôi sử dụng là Samsung Magician, CrystalDiskMark và AS SSD Benchmark. Tất cả 3 điểm chuẩn đó đều cho biết không có vấn đề gì và SSD của tôi đang hoạt động với tốc độ mà nó sẽ hoạt động. Tôi phải lưu ý rằng tất cả các trình điều khiển của tôi đã được cập nhật và phần sụn của ssd là bản mới nhất. Tôi đã thử cài đặt lại SQL Server, tôi đã thử thay đổi các phiên bản từ Enterprise sang Developer (Nhà phát triển là phiên bản tôi sử dụng trên l1).

Một điều khác tôi đã cố gắng là, tách cơ sở dữ liệu. di chuyển nó sang ổ đĩa khác và gắn nó trở lại. Để tìm ra điều đó, nó hoạt động tốt hơn trên ssd.

Kết quả cho mỗi lần kiểm tra hiệu suất (10.000 lần chèn + chọn + xóa): (IncepeLa = StartsAt, SeIncheieLa = EndsAt)

l2 trên SSD: nhập mô tả hình ảnh ở đây

l2 trên ổ cứng: nhập mô tả hình ảnh ở đây

l1 trên SSD: nhập mô tả hình ảnh ở đây

Cuối cùng, câu hỏi là ... Tại sao SQL Server hoạt động kém hơn đáng kể trên một mảnh được cho là vượt trội so với ổ cứng?

Biên tập:

nhập mô tả hình ảnh ở đây

Chỉnh sửa 2:

Tôi đã thêm một hình ảnh khác cho thấy một điều thú vị liên quan đến thời gian gian hàng. nhập mô tả hình ảnh ở đây

Mã xấu:

declare @id_test int
declare @name_test nvarchar(50)

declare ctest cursor
for
    select CodTest, Nume from Teste;
open ctest
    fetch next from ctest into @id_test, @name_test;
    while @@FETCH_STATUS = 0 begin
        if @name_test = 'insert'
        -- @name_test TesteTabele
        begin
            declare @t_t_cte int
            declare @t_t_cta int
            declare @t_t_nr int
            declare @t_t_p int

            insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Add in table', SYSDATETIME(), null);
            declare c_t_t cursor
            for
                select * from TesteTabele
            open c_t_t
                fetch next from c_t_t into @t_t_cte, @t_t_cta, @t_t_nr, @t_t_p
                while @@FETCH_STATUS = 0 begin
                    insert into RulariTesteTabele (CodRulareTest, CodTabel, IncepeLa, SeIncheieLa) values (@t_t_cte, @t_t_cta, SYSDATETIME(), 0);
                    exec('addfields' + @t_t_cta + ' ' + @t_t_nr);
                    update RulariTesteTabele set SeIncheieLa = SYSDATETIME() where CodRulareTest = @t_t_cte and CodTabel = @t_t_cta;
                    fetch next from c_t_t into @t_t_cte, @t_t_cta, @t_t_nr, @t_t_p
                end
            close c_t_t
            deallocate c_t_t
            update RulariTeste set SeIncheieLa = SYSDATETIME() where @id_test = CodRulareTest;
        end
        else if @name_test = 'select'
        -- @name_test TesteViewuri
        begin
            declare @t_v_ct int
            declare @t_v_cv int

            insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Select view', SYSDATETIME(), null);
            declare c_t_v cursor
            for
                select * from TesteViewuri
            open c_t_v
                fetch next from c_t_v into @t_v_ct, @t_v_cv
                while @@FETCH_STATUS = 0 begin
                    insert into RulariTesteViewuri (CodRulareTest, CodView, IncepeLa, SeIncheieLa) values (@t_v_ct, @t_v_cv, SYSDATETIME(), 0);
                    select * from (select Nume from Viewuri where CodView = @t_v_cv) as aview;
                    update RulariTesteViewuri set SeIncheieLa = SYSDATETIME() where CodRulareTest = @t_v_ct and CodView = @t_v_cv;
                    fetch next from c_t_v into @t_v_ct, @t_v_cv
                end
            close c_t_v
            deallocate c_t_v
            update RulariTeste set SeIncheieLa = SYSDATETIME() where @id_test = CodRulareTest;
        end
        else if @name_test = 'delete'
        begin
            insert into RulariTeste (Descriere, IncepeLa, SeIncheieLa) values ('Delete from table', SYSDATETIME(), null);
            delete from topic_follows;
            delete from topics;
            delete from users;
            update RulariTeste set SeIncheieLa = SYSDATETIME() where CodRulareTest = (select TOP(1) CodRulareTest from RulariTeste order by CodRulareTest desc);
        end
        fetch next from ctest into @id_test, @name_test
    end
close ctest;
deallocate ctest;

Các hàm addfields được cho là thêm các trường cho các bảng, trong một thời gian.

Chỉnh sửa 3 : Để làm cho vấn đề rõ ràng hơn, đó không phải là về thuật toán được sử dụng. Tôi sẽ chứng minh bằng cách thực hiện một lúc trong đó tôi thêm 10.000 giá trị. Một lần khi db ở trên SSD và một lần khi db ở trên ổ cứng, tôi sẽ chỉ sử dụng l2 cho thử nghiệm này.

Một hình ảnh bao gồm cả hai, bởi vì đó là hình ảnh cuối cùng tôi có thể đăng (Tôi không có 10 danh tiếng để đăng hơn 8 hình ảnh) nhập mô tả hình ảnh ở đây

Như có thể nhận thấy, khi db ở trên ổ cứng, nó sẽ thực thi các thao tác chèn trong 2 giây, trong khi đó, trên ổ SSD, nó sẽ chèn chúng trong 27 giây.

Câu trả lời:


7

Bất cứ khi nào bạn gặp vấn đề về hiệu suất, hãy bắt đầu bằng cách hỏi "Loại chờ đợi hàng đầu của tôi là gì?" Thống kê chờ cho bạn biết SQL Server đang chờ gì.

Tôi thích đo lường sự chờ đợi với sp_BlitzFirst (từ chối trách nhiệm: Tôi đã viết nó.) Đó là một kịch bản được cấp phép, mã nguồn mở MIT miễn phí mà bạn có thể gọi để lấy mẫu về sự chờ đợi của mình, như thế này:

EXEC sp_BlitzFirst @Seconds = 60, @ExpertMode = 1;

Điều đó sẽ lấy một mẫu 60 giây chờ đợi của bạn. Đăng ảnh chụp màn hình của phần thống kê chờ và chúng tôi có thể giải thích những gì máy chủ đang chờ.

Cập nhật: ảnh chụp màn hình đã thêm của bạn hiển thị 2 giây WRITELOG chờ trong khoảng 60 giây. Về cơ bản, Máy chủ SQL của bạn không chờ đợi nhiều như vậy. Tôi đoán là khối lượng công việc mô phỏng của bạn liên quan đến hoạt động đơn lẻ nối tiếp: làm việc trên một hàng tại một thời điểm, chỉ từ một luồng trong công cụ tạo tải. Đó không phải là một cách tuyệt vời để mô phỏng khối lượng công việc - bạn sẽ muốn sử dụng một công cụ tạo tải đa luồng, với nhiều hoạt động xảy ra cùng một lúc và thực hiện nhiều hoạt động cùng một lúc.


Tôi không biết làm cách nào để xuất nó để đăng nó ở đây, đã thử lưu truy vấn vào tệp .rpt, nhưng có vẻ khó hiểu bất cứ điều gì. Dù sao, tôi sẽ cập nhật bài viết của tôi với nó.
Tigrex

Tôi đã cập nhật câu trả lời của mình theo nhiều cách có thể. Nếu tôi nên làm bất cứ điều gì nhiều hơn để làm cho nó dễ hiểu hơn, xin vui lòng cho tôi biết.
Tigrex

Tôi hiểu rằng đó có lẽ không phải là cách để kiểm tra hiệu năng của cơ sở dữ liệu, cách làm của tôi bị trường đại học quyết định. Và bạn nói đúng, nó hoạt động cùng một lúc, vì tôi đang sử dụng con trỏ. Điều mà tôi không thể giải thích là, tại sao ổ cứng lại hoạt động tốt hơn SSD và SSD yếu hơn hoạt động tốt hơn "SSD tốt nhất 2016" (hay bất cứ thứ gì nó được gọi). Tôi sẽ cập nhật câu trả lời của mình với thuật toán tôi sử dụng (hãy cẩn thận, nó không được sử dụng lại, bao giờ, tôi đang trong giai đoạn tìm hiểu), và có lẽ là một ảnh chụp màn hình có liên quan của gian hàng avg mà tôi thấy lạ. (Gian hàng 1s)
Tigrex

Tôi có nghĩa là con trỏ không con trỏ, xấu của tôi.
Tigrex

1
Phải, nhưng bây giờ đây là loại vượt ra ngoài một trang web Hỏi & Đáp. Bây giờ bạn đang khám phá tính hợp lệ của phương pháp thử nghiệm cũng như hiệu suất của phần cứng của bạn. Là một người máy chủ SQL, điều tốt nhất tôi có thể nói với bạn là - bạn không tải bộ nhớ kiểm tra bằng cách sử dụng một con trỏ. Nó giống như cố gắng đánh giá tốc độ của một chiếc xe hơi bằng cách tải nó bằng dưa hấu.
Brent Ozar

4

Được rồi, tôi đã giải quyết nó. Sau khi tìm kiếm xung quanh và thử nhiều thứ khác nhau, cuối cùng nó cũng kết thúc.

Tôi đã viết trong câu hỏi ban đầu rằng "tất cả các trình điều khiển của tôi đã được cập nhật", trong đó, có vẻ như đó là một lời nói dối đến từ tôi. Tôi xin lỗi vì điều đó, tôi chỉ cập nhật phần sụn và cũng có tầm nhìn cập nhật trình điều khiển.

Có vẻ như mọi thứ đã được giải quyết bằng cách cài đặt trình điều khiển mới nhất từ ​​trang web gốc của Samsung. IMHO Tôi không mong đợi những thay đổi mạnh mẽ như vậy đối với thay đổi trình điều khiển.

Trình điều khiển tôi có trước đây, như được hiển thị trong công cụ "Samsung Magician" trong Trình điều khiển NVMe, thuộc sở hữu của Microsoft. Sau khi cài đặt Driver, nó hiển thị Samsung.

Tôi một lần nữa xin lỗi vì thông tin sai lệch, và tôi cảm ơn Brent Ozar vì sự hỗ trợ, mà nếu không, tôi đã từ bỏ nhiệm vụ này từ lâu và sẽ chỉ "giải quyết".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.