Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
 Re: Утечка памяти?  [new]
o-o
Guest
[quot aleksrovкак тогда правильно работать с ООООЧЕНЬ большими индексами (в 100 гигов к примеру), как их правильно ребилдить, чтобы не навредить системе в целом (+ если у нас еще AlwaysOn или репликация транзпкций), как быть? Пускай 2 варианта: в первом индекс секционирован, во втором нет.
Правдв интересно, никогда не работал с таким обьемом.[/quot]
наверное реорганайзить, когда активность поменьше, и прерывать.
потом снова реорганайзить.
---
у нас никаких alwaysON, модель простая
и хватило бы ребилдить последнюю партицию,
остальные все равно не меняются.
но шиш, все ребилдят.
потому что скрипт на все базы один и не предвидит ребилд партиций

так что и секционирование тут тоже только ради секционирования
27 окт 16, 13:12    [19827987]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Mind

А что вернет вот этот запрос?

DECLARE @ServiceName NVARCHAR(100)
SET @ServiceName = CASE WHEN @@SERVICENAME = 'MSSQLSERVER'
                            THEN 'SQLServer:'
                        ELSE 'MSSQL$' + @@SERVICENAME + ':'
                        END
select RTRIM(counter_name) AS counter_name, cntr_value from sys.dm_os_performance_counters 
WHERE (object_name = @ServiceName + 'Memory Manager')
AND counter_name like '%(KB)%'


К сообщению приложен файл. Размер - 33Kb
27 окт 16, 13:32    [19828128]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
o-o
[quot aleksrovкак тогда правильно работать с ООООЧЕНЬ большими индексами (в 100 гигов к примеру), как их правильно ребилдить, чтобы не навредить системе в целом (+ если у нас еще AlwaysOn или репликация транзпкций), как быть? Пускай 2 варианта: в первом индекс секционирован, во втором нет.
Правдв интересно, никогда не работал с таким обьемом.

наверное реорганайзить, когда активность поменьше, и прерывать.
потом снова реорганайзить.
---
у нас никаких alwaysON, модель простая
и хватило бы ребилдить последнюю партицию,
остальные все равно не меняются.
но шиш, все ребилдят.
потому что скрипт на все базы один и не предвидит ребилд партиций

так что и секционирование тут тоже только ради секционирования[/quot]

Хм... Как вариант. Да просто читаю сейчас https://www.sswug.org/alexanderchigrik/sql-server/some-tips-for-using-very-large-databases-in-sql-server-2014/, и вот интересно как народ выкручивается когда базы несколько ТБ, надо сделать ребилд, а индекс под 100 гигов, модель Full, переключать нельзя.
Если много мелких индексов до народ советует делать чаще BackupLog, эт понятно, а если это одна здоровая транзакция, тогда как?
27 окт 16, 13:34    [19828144]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
возвращаясь к теме топика.
Коллега нашел злодея.

К сообщению приложен файл. Размер - 54Kb
27 окт 16, 15:51    [19829171]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Сервер удаленный наших клиентов, и они сначала ребутят, а только потом жалуются...
так что текущие цифры после рестарта сервера, и пока у них ничего не падает.
27 окт 16, 15:54    [19829193]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
aleksrov
Вопрос немного не по теме: как тогда правильно работать с ООООЧЕНЬ большими индексами (в 100 гигов к примеру), как их правильно ребилдить, чтобы не навредить системе в целом (+ если у нас еще AlwaysOn или репликация транзпкций), как быть? Пускай 2 варианта: в первом индекс секционирован, во втором нет.
Правдв интересно, никогда не работал с таким обьемом.

Коллеги, вот у меня проблема встала, хочу сделать индекс по одной достаточно большой таблице(8гигов, 27млн записей), но не самой большой у нас. В индексе пара полей и штук 18 в инклюде.

Поздно вечером, когда активность юзеров низкая, срубаю все основные джобы, где может юзаться эта таблица, другие тяжелые джобы, сильно юзающие диск, делается индекс 2ч и так и не создается, висит почти постоянно в suspended c типом ожидания PAGEIOLATCH_SH. Срубаю нафиг, т.к. спать охота, а джобы надо запустить. Да и не хочется без контроля оставлять на ночь.
Так-то делал индексы на таблицах и побольше, а сами индексы с большим кол-вом полей в индексе\инклюде. В час, максимум, укладывался.
Индекс очень нужен, т.к. другой прогер эту таблицу сделал и активно ее юзает.

Подумал тут, может дело в железе: оперативки может не хватает, у нас 16 гиг на виртуалку, из них 12гб отдано MS SQL.
А я в больше по разработке, в админских делах не силен. Сейчас вот изучаю, ибо больше некому.
Есть вариант увеличить оперативку, но надо бы обосновать начальнику, да и самому хочется разобраться.
Почитал мануалы, статьи, топики, проверил счетчики:
PLE - 4294624.
Так же посмотрел счетчики по этой статье
тоже вроде как все норм.

Подскажите, в чем может быть проблема, куда копать?
27 окт 16, 23:30    [19831165]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
o-o
Guest
PAGEIOLATCH_SH=говнодиск.
наверняка на виртуалке
(пламенный привет админам винды)
можно тоже реорганайзить, когда не особо мешает,
а можно и онлайново попробовать ребилдить,
тогда рубить никого не придется.

Но лучше всего тряхнуть того, кто виртуалку настроил, потребовать нормальные диски
27 окт 16, 23:46    [19831196]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
o-o
1)PAGEIOLATCH_SH=говнодиск.
наверняка на виртуалке
(пламенный привет админам винды)
можно тоже реорганайзить, когда не особо мешает,
2)а можно и онлайново попробовать ребилдить,
тогда рубить никого не придется.

3)Но лучше всего тряхнуть того, кто виртуалку настроил, потребовать нормальные диски

1) Точно так. :)

2) Мне не ребилдить, мне создать не удается за 2 часа. :) Впрочем, это единственный индекс, с которым проблема возникла. Но у меня уже кончились идеи, что с ним не так.

3) Нормальность в чем заключается? Какие параметры, скорость работы, свободное пространство?
27 окт 16, 23:53    [19831208]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
o-o
...
а можно и онлайново попробовать ребилдить...

Кстати эта настройка только в Enterprise версии, у нас Standart. :)
27 окт 16, 23:56    [19831211]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
o-o
PAGEIOLATCH_SH=говнодиск.

Я, к сожалению, не силен в админских делах, но начальник(в железе шарит, сам бывший прогер) говорит, что диски хорошие. :)
Может как-то связано с тем, что сервер на виртуалке, а raid-массив юзается не только под MS SQL?
28 окт 16, 00:01    [19831216]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Mike_za
возвращаясь к теме топика.
Коллега нашел злодея.
Это весьма и весьма странно. Я конечно не специалист по NUMA, но учитывая что у вас один node, не понятно откуда берется foreign memory?

Оригинальный скрипт вообще-то показывал раскладку по нодам, и там для каждого нода среди прочего еще выводится Foreign Memory, но для этого нужно либо динамку использовать, либо генерить в приложении в зависимости от количества нод на сервере. Я скрипт упростил перед тем как выкладывать и в вашем случае это вообще не должно было иметь значения, потому что у вас 1 memory node, но почему то все равно откуда то foreign memory появляется. Причем в счетчиках Buffer/Memory Manager нет Foreign Memory впринципе и нужно ее брать из Buffer/Memory Node, и чтобы узнать общее количество для всего сервера нужно просто просуммировать. Но, ставить Foreign Memory в дерево под Total Server Memory не совсем корректно. Дело в том что в стандартных случаях Foreign Memory уже включена в занятую память. Скажем на 1ом ноде Database Cache = 10Гб, из которых 4Гб это Foreign Memory. Так что если мы их просуммируем, то результат окажется больше чем Total.

+ Для большинства случаев вот этот вариант более правильный
/* Generated in SQL Explorer v.1.6.3.22869 */
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET LOCK_TIMEOUT 10000

DECLARE @ServiceName NVARCHAR(100)
SET @ServiceName = CASE WHEN @@SERVICENAME = 'MSSQLSERVER'
                            THEN 'SQLServer:'
                        ELSE 'MSSQL$' + @@SERVICENAME + ':'
                        END

DECLARE @Perf TABLE (object_name nvarchar(20), counter_name nvarchar(128), instance_name nvarchar(128), cntr_value BIGINT, formatted_value NUMERIC(20, 2), shortname NVARCHAR(20))
INSERT INTO @Perf(object_name, counter_name, instance_name, cntr_value, formatted_value, shortname)
SELECT 
  CASE 
    WHEN CHARINDEX ('Memory Manager', object_name)> 0 THEN 'Memory Manager'
    WHEN CHARINDEX ('Buffer Manager', object_name)> 0 THEN 'Buffer Manager'
    WHEN CHARINDEX ('Plan Cache', object_name)> 0 THEN 'Plan Cache'
    WHEN CHARINDEX ('Buffer Node', object_name)> 0 THEN 'Buffer Node' -- 2008
    WHEN CHARINDEX ('Memory Node', object_name)> 0 THEN 'Memory Node' -- 2012
    WHEN CHARINDEX ('Cursor', object_name)> 0 THEN 'Cursor'
    ELSE NULL 
  END AS object_name,
  CAST(RTRIM(counter_name) AS NVARCHAR(100)) AS counter_name, 
  RTRIM(instance_name) AS instance_name, 
  cntr_value,
  CAST(NULL AS DECIMAL(20,2)) AS formatted_value,
  SUBSTRING(counter_name,  1, PATINDEX('% %', counter_name)) shortname
FROM sys.dm_os_performance_counters 
WHERE (object_name LIKE @ServiceName + 'Buffer Node%'     -- LIKE is faster than =. I have no idea why
    OR object_name LIKE @ServiceName + 'Buffer Manager%' 
    OR object_name LIKE @ServiceName + 'Memory Node%' 
    OR object_name LIKE @ServiceName + 'Plan Cache%')
  AND (counter_name LIKE '%pages %' 
    OR counter_name LIKE '%Node Memory (KB)%'
    OR counter_name = 'Page life expectancy' 
    )
    OR  (object_name = @ServiceName + 'Memory Manager'
        AND counter_name IN ('Granted Workspace Memory (KB)', 'Maximum Workspace Memory (KB)',
                                    'Memory Grants Outstanding',     'Memory Grants Pending',
                                    'Target Server Memory (KB)',     'Total Server Memory (KB)',
                                    'Connection Memory (KB)',        'Lock Memory (KB)',
                                    'Optimizer Memory (KB)',         'SQL Cache Memory (KB)',
                                    -- for 2012
                                    'Free Memory (KB)',              'Reserved Server Memory (KB)',
                                    'Database Cache Memory (KB)',    'Stolen Server Memory (KB)')
      )
    OR (object_name LIKE @ServiceName + 'Cursor Manager by Type%'
      AND counter_name = 'Cursor memory usage'
      AND instance_name = '_Total'
      )

-- Add unit to 'Cursor memory usage'
UPDATE @Perf
SET counter_name = counter_name + ' (KB)'
WHERE counter_name = 'Cursor memory usage' 

-- Convert values from pages and KB to MB and rename counters accordingly
UPDATE @Perf
SET 
  counter_name = REPLACE(REPLACE(REPLACE(counter_name, ' pages', ''), ' (KB)', ''), ' (MB)', ''), 
  formatted_value = 
  CASE 
    WHEN counter_name LIKE '%pages' THEN cntr_value/128. 
    WHEN counter_name LIKE '%(KB)' THEN cntr_value/1024. 
    ELSE cntr_value
  END

-- Delete some pre 2012 counters for 2012 in order to remove duplicates
DELETE P2008
FROM @Perf P2008
INNER JOIN @Perf P2012 ON REPLACE(P2008.object_name, 'Buffer', 'Memory') = P2012.object_name AND P2008.shortname = P2012.shortname
WHERE P2008.object_name IN ('Buffer Manager', 'Buffer Node')

-- Update counter/object names so they look like in 2012
UPDATE PC
SET 
  object_name = REPLACE(object_name, 'Buffer', 'Memory'),
  counter_name = ISNULL(M.NewName, counter_name)  
FROM @Perf PC
  LEFT JOIN
  (
    SELECT 'Free' AS OldName, 'Free Memory' AS NewName UNION ALL
    SELECT 'Database', 'Database Cache Memory' UNION ALL
    SELECT 'Stolen', 'Stolen Server Memory' UNION ALL
    SELECT 'Reserved', 'Reserved Server Memory' UNION ALL
    SELECT 'Foreign', 'Foreign Node Memory'
  ) M ON M.OldName = PC.counter_name
  AND NewName NOT IN (SELECT counter_name FROM @Perf WHERE object_name = 'Memory Manager') 
WHERE object_name IN ('Buffer Manager', 'Buffer Node')


-- Build Memory Tree
DECLARE @MemTree TABLE (Id int, ParentId int, counter_name nvarchar(128), formatted_value NUMERIC(20, 2), shortname NVARCHAR(20))

-- Level 5
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, shortname)
SELECT
  Id = 1226,
  ParentId = 1225,
  instance_name as counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Plan Cache' 
  AND counter_name IN ('Cache')
  AND instance_name <> '_Total'

-- Level 4
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, shortname)
SELECT
  Id = 1225,
  ParentId = 1220,
  'Plan ' + counter_name as counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Plan Cache' 
  AND counter_name IN ('Cache')
  AND instance_name = '_Total'

UNION ALL

SELECT
  Id = 1222,
  ParentId = 1220,
  counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Cursor'
  OR (object_name = 'Memory Manager' AND shortname IN ('Connection', 'Lock', 'Optimizer', 'SQL')) 

UNION ALL

SELECT
  Id = 1112,
  ParentId = 1110,
  counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Memory Manager' 
  AND shortname IN ('Reserved')
UNION ALL
SELECT
  Id = P.ParentID + 1,
  ParentID = P.ParentID,
  'Used Workspace Memory' AS counter_name,
  SUM(used_memory_kb)/1024. as formatted_value,
  NULL AS shortname
FROM sys.dm_exec_query_resource_semaphores 
  CROSS JOIN (SELECT 1220 AS ParentID UNION ALL SELECT 1110) P
GROUP BY P.ParentID

-- Level 3
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, shortname)
SELECT
  Id = CASE counter_name 
           WHEN 'Granted Workspace Memory' THEN 1110 
           WHEN 'Stolen Server Memory' THEN 1220 
           ELSE 1210
         END,
  ParentId = CASE counter_name 
               WHEN 'Granted Workspace Memory' THEN 1100 
               ELSE 1200 
             END,
  counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Memory Manager' 
  AND counter_name IN ('Stolen Server Memory', 'Database Cache Memory', 'Free Memory', 'Granted Workspace Memory')

-- Level 2
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, shortname)
SELECT
  Id = CASE WHEN counter_name = 'Maximum Workspace Memory' THEN 1100 ELSE 1200 END,
  ParentId = 1000,
  counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Memory Manager' AND 
  counter_name IN ('Total Server Memory', 'Maximum Workspace Memory') 
UNION ALL
SELECT 
  Id = 1150,
  ParentId = 1000,
  counter_name = 'Foreign Node Memory', 
  formatted_value = SUM(formatted_value),
  shortname = 'Foreign'
FROM @Perf
WHERE object_name = 'Memory Node' AND 
  counter_name IN ('Foreign Node Memory')
HAVING SUM(formatted_value) > 0

-- Level 1
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, shortname)
SELECT 
  Id = 1000,
  ParentId = NULL,
  counter_name, 
  formatted_value,
  shortname
FROM @Perf
WHERE object_name = 'Memory Manager' AND 
  counter_name IN ('Target Server Memory')

-- Level 4 -- 'Other Stolen Server Memory' = 'Stolen Server Memory' - SUM(Children of 'Stolen Server Memory')
INSERT @MemTree(Id, ParentId, counter_name, formatted_value, shortname)
SELECT
  Id = 1222,
  ParentId = 1220,
  counter_name = '<Other Memory Clerks>', 
  formatted_value = (SELECT SSM.formatted_value FROM @MemTree SSM WHERE Id = 1220) - SUM(formatted_value),
  shortname = 'Other Stolen'
FROM @MemTree 
WHERE ParentId = 1220

-- Results:

-- PLE and Memory Grants
SELECT
    [Counter Name] = P.counter_name + ISNULL(' (Node: ' + NULLIF(P.instance_name, '') + ')', ''), 
    cntr_value as Value,
    RecommendedMinimum = 
        CASE 
            WHEN P.counter_name = 'Page life expectancy' AND R.Value <= 300 -- no less than 300
                THEN 300
            WHEN P.counter_name = 'Page life expectancy' AND R.Value > 300 
                THEN R.Value
            ELSE NULL 
        END
FROM @Perf P
LEFT JOIN -- Recommended PLE calculations
    (
        SELECT 
            object_name, 
            counter_name, 
            instance_name, 
            CEILING(formatted_value/4096.*5) * 60 AS Value -- 300 per every 4GB of Buffer Pool memory or around 60 seconds (1 minute) per every 819MB
        FROM @Perf PD
        WHERE counter_name = 'Database Cache Memory'
    ) R ON R.object_name = P.object_name 
       AND R.instance_name = P.instance_name
WHERE 
  (P.object_name = 'Memory Manager' 
  AND P.counter_name IN ('Memory Grants Outstanding', 'Memory Grants Pending', 'Page life expectancy')
  )
    OR -- For NUMA
  (
    P.object_name = 'Memory Node' AND P.counter_name = 'Page life expectancy'
    AND (
        SELECT COUNT(DISTINCT instance_name)
        FROM @Perf 
        WHERE object_name = 'Memory Node'
    ) > 1
  )
ORDER BY P.counter_name DESC, P.instance_name

-- Get physical memory
-- You can also extract this information from sys.dm_os_sys_info but the column names have changed starting from 2012
IF OBJECT_ID('tempdb..#msver') IS NOT NULL DROP TABLE #msver
CREATE TABLE #msver(ID int, Name  sysname, Internal_Value int, Value nvarchar(512))
INSERT #msver EXEC master.dbo.xp_msver 'PhysicalMemory'

-- Physical memory, config parameters and Target memory
SELECT 
  min_server_mb = (SELECT CAST(value_in_use AS DECIMAL(20, 2)) FROM sys.configurations WHERE name = 'min server memory (MB)'),
  max_server_mb = (SELECT CAST(value_in_use AS DECIMAL(20, 2)) FROM sys.configurations WHERE name = 'max server memory (MB)'),
  target_mb = (SELECT formatted_value FROM @Perf WHERE object_name = 'Memory Manager' AND counter_name IN ('Target Server Memory')),
  physical_mb = CAST(Internal_Value AS DECIMAL(20, 2))
FROM #msver

-- Memory tree
;WITH CTE
AS
(
SELECT 0 as lvl, counter_name, formatted_value, Id, NULL AS ParentId, shortname, formatted_value as TargetServerMemory, CAST(NULL AS DECIMAL(20,4)) As Perc, CAST(NULL AS DECIMAL(20,4)) As PercOfTarget
FROM @MemTree
WHERE ParentId IS NULL
UNION ALL
SELECT CTE.lvl+1,
  CAST(REPLICATE(' ', 6*(CTE.lvl)) + NCHAR(124) + REPLICATE(NCHAR(183), 3) + MT.counter_name AS NVARCHAR(128)), 
  MT.formatted_value, MT.Id, MT.ParentId, MT.shortname, CTE.TargetServerMemory,
  CAST(ISNULL(1.0*MT.formatted_value/NULLIF(CTE.formatted_value, 0),0) AS DECIMAL(20,4)) AS Perc,
  CAST(ISNULL(1.0*MT.formatted_value/NULLIF(CTE.TargetServerMemory, 0),0) AS DECIMAL(20,4)) AS PercOfTarget
FROM @MemTree MT
  INNER JOIN CTE ON MT.ParentId = CTE.ID
)
SELECT 
  counter_name AS [Counter Name], CASE WHEN formatted_value > 0 THEN formatted_value ELSE NULL END AS [Memory MB], Perc AS [% of Parent], CASE WHEN lvl >= 2 THEN PercOfTarget ELSE NULL END AS [% of Target]
FROM CTE
ORDER BY ISNULL(ID, 10000), formatted_value DESC
28 окт 16, 00:04    [19831219]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Mind, Почитал немножко про NUMA. Я ну совсем к настройке корпоративных железок отношения не имею и это слово сегодня впервые услышал))
Если я правильно понял, то при кривой выделении процессоров и памяти на виртуалку на которой крутится sql, он может получить несколько нод. Далее буферный кеш же общий и данные в не дублируются. Получается, что процессор начинает выполнять некий запрос, и часть кеша в более быстрой памяти чем другая?
28 окт 16, 00:14    [19831226]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Megabyte
висит почти постоянно в suspended c типом ожидания PAGEIOLATCH_SH
Из темы топика не понятно разве? Утечка памяти же!

А на какой базе то ждет? Может tempdb? Посмотрите resource_description из sys.dm_os_waiting_tasks или wait_resource из sys.dm_exec_requests.

Там нету LOB-ов в INCLUDE случайно?
28 окт 16, 00:23    [19831231]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
[quot Megabyte]
c типом ожидания PAGEIOLATCH_SH[quot]

Тока тока дочитал Troubleshooting SQL Server A Guide for the Accidental DBA By Jonathan Kehayias and Ted Krueger (на сайте Red Gate можно бесплатно скачать), там в самом начале этот тип ожидания в качетсве примера и берется:
This happens when lots of sessions, or maybe one session in particular, are requesting a lot of data pages that are not available in the buffer pool (and so physical I/O is needed to retrieve them). SQL Server must allocate a buffer page for each one, and place a latch on that page while it's retrieved from disk. The bottleneck here is disk I/O; the disk subsystem simply can't return pages quickly enough to satisfy all of the page requests, and so sessions are waiting for latches, and performance is suffering. However, this does not necessarily mean that a slow disk subsystem is the cause of the bottleneck; it may simply be the victim of excessive I/O caused by a problem elsewhere in the system
Типа проблема может и не в дисках быть, а в корявых запросах которые насилуют I/O.
Если брать именно пример в книге автор пришел к выводу что это были корявые запросы и мало оперативы (плохой запрос помещает в буфер много лишних страниц, увеличивается нагрузка на I/O, т.к. мало оперативы данные оттуда вымываются и система опять обращается к диску а не к оперативе)
28 окт 16, 05:07    [19831405]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
o-o
Guest
[quot aleksrov] Если брать именно пример в книге автор пришел к выводу что это были корявые запросы и мало оперативы (плохой запрос помещает в буфер много лишних страниц, увеличивается нагрузка на I/O, т.к. мало оперативы данные оттуда вымываются и система опять обращается к диску а не к оперативе)
Предлагаете затребовать от MS новую команду создания индекса?
Нынешняя, о боже, сканит таблицу, это очень корявый запрос
Про лобы хорошая мысль, у нас таблица в 6гиг переливается 40 минут только потому, что там ntext.
Поганое дерево дниннючих блобов
28 окт 16, 07:10    [19831485]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
aleksrov
Member

Откуда:
Сообщений: 948
[quot o-o]
aleksrov
Если брать именно пример в книге автор пришел к выводу что это были корявые запросы и мало оперативы (плохой запрос помещает в буфер много лишних страниц, увеличивается нагрузка на I/O, т.к. мало оперативы данные оттуда вымываются и система опять обращается к диску а не к оперативе)
Предлагаете затребовать от MS новую команду создания индекса?
Нынешняя, о боже, сканит таблицу, это очень корявый запрос
Про лобы хорошая мысль, у нас таблица в 6гиг переливается 40 минут только потому, что там ntext.
Поганое дерево дниннючих блобов


Да это просто отступление про этот тип ожидания было, можт пригодится кому :)
По теме проблема с созданием большого индекса актуальна, гугл много ответов дает
http://www.sql-server-performance.com/forum/threads/create-index-on-huge-table.31937/
28 окт 16, 08:02    [19831566]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
o-o
Guest
Megabyte
o-o
PAGEIOLATCH_SH=говнодиск.

Я, к сожалению, не силен в админских делах, но начальник(в железе шарит, сам бывший прогер) говорит, что диски хорошие. :)
Может как-то связано с тем, что сервер на виртуалке, а raid-массив юзается не только под MS SQL?

Оно.
Кстати, у нас было то же самое до последнего времени.
Сейчас всех разгоняют, админов в том числе.
Они внезапно услышали жалобы на диски,
так у нас внезапно ВСЕ ускорилось в 2 раза.
Разумеется, никто никуда ничего не переносил.
Вы в еррорлоге наблюдаете сообщения о несправляющихся дисках?
Их надо заслать вашим сисадминам и потребовать разобраться
под угрозой, что найдете лучших.
28 окт 16, 08:26    [19831602]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8300
Виртуалки в неумелых руках (а таких 90%) страшное зло, IO падает до смехотворого 1 мб/сек, не сбалансирована нагрузка по ядрам, "пережимание", полная вакханалия.
28 окт 16, 10:04    [19832034]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
[quot aleksrov]Тока тока дочитал Troubleshooting SQL Server A Guide for the Accidental DBA By Jonathan Kehayias and Ted Krueger (на сайте Red Gate можно бесплатно скачать), там в самом начале этот тип ожидания в качетсве примера и берется:
This happens when lots of sessions, or maybe one session in particular, are requesting a lot of data pages that are not available in the buffer pool (and so physical I/O is needed to retrieve them). SQL Server must allocate a buffer page for each one, and place a latch on that page while it's retrieved from disk. The bottleneck here is disk I/O; the disk subsystem simply can't return pages quickly enough to satisfy all of the page requests, and so sessions are waiting for latches, and performance is suffering. However, this does not necessarily mean that a slow disk subsystem is the cause of the bottleneck; it may simply be the victim of excessive I/O caused by a problem elsewhere in the system
Типа проблема может и не в дисках быть, а в корявых запросах которые насилуют I/O.
Если брать именно пример в книге автор пришел к выводу что это были корявые запросы и мало оперативы (плохой запрос помещает в буфер много лишних страниц, увеличивается нагрузка на I/O, т.к. мало оперативы данные оттуда вымываются и система опять обращается к диску а не к оперативе)
Я это прочитал на хабре в статье про типы ожиданий сервера.
Если тормоза на каком-то ином запросе, то ищу проблему в кривом запросе. Но, согласитесь, оптимизировать создание индекса проблематично. :)
Исходя из написанного я и начал думать, что проблема может быть в нехватке оперативки.
28 окт 16, 10:23    [19832150]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
Mind
Megabyte
висит почти постоянно в suspended c типом ожидания PAGEIOLATCH_SH
Из темы топика не понятно разве? Утечка памяти же!

А на какой базе то ждет? Может tempdb? Посмотрите resource_description из sys.dm_os_waiting_tasks или wait_resource из sys.dm_exec_requests.

Там нету LOB-ов в INCLUDE случайно?

Я, честно, прочитал весь топик, но многое для меня пока темный лес. :)
LOB нет, не используем. Да и текстовых полей вроде не много, 3шт.

На какой базе ждет, хз. Но я прочитал, что tempdb сильно юзается при создании индекса.
"resource_description из sys.dm_os_waiting_tasks или wait_resource из sys.dm_exec_requests" - это надо смотреть во время выполнения создания индекса? Ок, попробую.
28 окт 16, 10:24    [19832155]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
o-o
Megabyte
пропущено...

Я, к сожалению, не силен в админских делах, но начальник(в железе шарит, сам бывший прогер) говорит, что диски хорошие. :)
Может как-то связано с тем, что сервер на виртуалке, а raid-массив юзается не только под MS SQL?

Оно.
Кстати, у нас было то же самое до последнего времени.
Сейчас всех разгоняют, админов в том числе.
Они внезапно услышали жалобы на диски,
так у нас внезапно ВСЕ ускорилось в 2 раза.
Разумеется, никто никуда ничего не переносил.
Вы в еррорлоге наблюдаете сообщения о несправляющихся дисках?
Их надо заслать вашим сисадминам и потребовать разобраться
под угрозой, что найдете лучших.

я не могу, этим мой начальник занимается. Админ только закупает железо, он с базами не дружит.
Я тут главный по бд, но хорошо разбираюсь только в разработке и оптимизации.
Бэкапирование и зеркало настроил один товарищ, который уже ушел.

з.ы. объясните, как победили-то, что изменили?
28 окт 16, 10:29    [19832172]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
o-o
Guest
Megabyte
з.ы. объясните, как победили-то, что изменили?

я вообще в железе не понимаю,
но если у меня на ноуте код вида
set nocount on 
go 
create table dbo.TestWriteDisk ( i int ) 
go 
  
declare @i int 
set @i = 0 
while @i <= 10000 
begin 
  set @i = @i + 1 
  insert into TestWriteDisk ( i ) values ( @i ) 
end 
go 
  
drop table TestWriteDisk 
go

выполняется 3 секунды,
а на их сервере 30,
то это ни в какие ворота не лезет.
это на сервере с обычной активностью,
в промежутке между их бесконечными бэкапами.
и в еррорлог регулярно капает.
и сказано это было начальству 100 лет назад.
а теперь у них тут все меняют, всех разгоняют,
сказали, этих тоже сменят и вообще сервер перенесут в облако.
они что-то засуетились и всю эту неделю у нас ну все ускорилось,
и не на минуты, а в 2 раза ровно.
а сервер-то 2 недели, как не перегружали.
вывод? они на своей виртуалке что-то подкрутили по части дисков.
ибо объемы у нас только растут.
---
сейчас тот же тест за 16 секунд выполняется.
тоже много, но все те же 2 раза
28 окт 16, 10:58    [19832346]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
o-o
Guest
Megabyte
Исходя из написанного я и начал думать, что проблема может быть в нехватке оперативки.

PAGEIOLATCH_SH
он ждет, когда же прочтутся данные с диска
28 окт 16, 11:10    [19832412]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
o-o
Megabyte
пропущено...

Я, к сожалению, не силен в админских делах, но начальник(в железе шарит, сам бывший прогер) говорит, что диски хорошие. :)
Может как-то связано с тем, что сервер на виртуалке, а raid-массив юзается не только под MS SQL?


Вы в еррорлоге наблюдаете сообщения о несправляющихся дисках?

Это в студии: управление->журналы SQL Server?

Их пока никто не смотрит, я начал только недавно. :) У нас вообще DBA нет, как такового.

Как будет выглядеть сообщение о несправляющихся дисках?
Пока ничего не вижу, там в основном про бэкапы сообщения...
28 окт 16, 11:16    [19832448]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти?  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4972
o-o
Megabyte
з.ы. объясните, как победили-то, что изменили?

я вообще в железе не понимаю,
но если у меня на ноуте код вида
set nocount on 
go 
create table dbo.TestWriteDisk ( i int ) 
go 
  
declare @i int 
set @i = 0 
while @i <= 10000 
begin 
  set @i = @i + 1 
  insert into TestWriteDisk ( i ) values ( @i ) 
end 
go 
  
drop table TestWriteDisk 
go

выполняется 3 секунды,
а на их сервере 30,
то это ни в какие ворота не лезет.
это на сервере с обычной активностью,
в промежутке между их бесконечными бэкапами.
и в еррорлог регулярно капает.
и сказано это было начальству 100 лет назад.
а теперь у них тут все меняют, всех разгоняют,
сказали, этих тоже сменят и вообще сервер перенесут в облако.
они что-то засуетились и всю эту неделю у нас ну все ускорилось,
и не на минуты, а в 2 раза ровно.
а сервер-то 2 недели, как не перегружали.
вывод? они на своей виртуалке что-то подкрутили по части дисков.
ибо объемы у нас только растут.
---
сейчас тот же тест за 16 секунд выполняется.
тоже много, но все те же 2 раза

Мдя, запустил ваш скрипт, все печально. Сразу впал в suspended, сначала с типом ожидания sleep_task, потом PAGEIOLATCH_SH.

Но, в общем-то, а целом жалоб на работу сервера нет, за исключением отдельных моментов.

з.ы. Когда я сюда пришел, здесь вообще пипец творился: сервак мог внезапно виснуть, и начальник просто тупо перегружал его. А у нас простой критичен(колл-центр). С индексами(куча ненужных и отсутствие нужных) и кривыми запросами просто беда была.
Основное исправил, правда народ регулярно пишет новое г..., не анализируя наличие нужных индексов. :)
28 окт 16, 11:36    [19832549]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить