In this article I’ll write nothing new regarding monitoring, but rather how to use what SQL Server already provide us and make it as light as possible; when working in “high OLTP workload” environments monitoring should be almost “invisible”, and by “high OLTP workload” I mean a server running at 50000/60000 Batches/sec

image

with the load made almost by stored procedures in the average CPU time from few ms to few tens of ms. Just for an example, the image below shows 10 minutes sampling taken at about 1/4 maximum load of one customer, with the first column showing the CPU time of every stored procedure over the total SQL Server CPU usage; so, if for example SQL was at 40% the first sp was responsible for the 19.8% of that load, and so on..

image

The above report is obtained from a table populated every minute with a simple query over the sys.dm_exec_procedure_stats

SELECT dateadd(mi, datediff(mi, 0, getdate()), 0), sql_handle,
plan_handle, total_elapsed_time, total_worker_time,
total_logical_reads, total_logical_writes, execution_count
FROM sys.dm_exec_procedure_stats

In addition to this, on our servers we usually capture every minute a snapshot over the sys.dm_exec_requests to get a photo of the running statements, and use it also in realtime when there is something that “smells” strange Sorriso; for this purpose we initially used the famous sp_WhoIsActive, very powerfull, but sometimes, when there were several process running or some blocking conditions, it happened that it was lasting too much or, never ending.

After digging a bit into the issue it came out to be the high usage of string manipulation functions which caused heavy usage of the TempDb and CPU time, that’s why the idea of something “lighter” and with only the functionality needed for our purpose.

Basycally we use a statement like this

SELECT s.host_name, r.session_id as 'session', r.blocking_session_id as [blocked by],
CAST  (SUBSTRING(st.text, (r.statement_start_offset/2)+1,
    ((CASE r.statement_end_offset
      WHEN -1 THEN DATALENGTH(st.text)
     ELSE r.statement_end_offset
     END - r.statement_start_offset)/2) + 1) as text) AS statement_text,  ISNULL(cast(OBJECT_SCHEMA_NAME(st.objectid, st.dbid) + '.' + OBJECT_NAME(st.objectid, st.dbid) as varchar(100)), 'AdHoc Statement') as object_name,
     s.login_name,
     CASE  WHEN LEFT(s.program_name, 8) = 'SQLAgent' then
                (SELECT 'SQLAgent Job: ' + b.name from msdb.dbo.sysjobs b WHERE (SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(s.PROGRAM_NAME,30,10))
        ELSE s.program_name
    END AS [program_name],
r.start_time as request_start_time,r.last_wait_type,r.wait_time,
r.cpu_time, r.total_elapsed_time,
r.logical_reads, r.reads as physical_reads, r.status as request_status
FROM sys.dm_exec_sessions s left join sys.dm_exec_requests r on s.session_id = r.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
WHERE r.session_id > 50 and r.session_id <> @@SPID
AND last_wait_type <> 'SP_SERVER_DIAGNOSTICS_SLEEP'
ORDER BY cpu_time DESC

for cehcking in realtime what is currently running,  with an added

OUTER APPLY sys.dm_exec_text_query_plan( r.plan_handle,
r.statement_start_offset, r.statement_end_offset) tp

when we want to take a look at the Execution Plan ( CAST (tp.query_plan as xml) AS plan_xml in the fields list).

Second, we check for blocking processes with something like this

SELECT    s.session_id, r.blocking_session_id AS [blocked by], CAST(SUBSTRING(st.text, (r.statement_start_offset / 2) + 1,
                ((CASE r.statement_end_offset
                    WHEN - 1 THEN DATALENGTH(st.text)
                    ELSE r.statement_end_offset
                END - r.statement_start_offset) / 2) + 1) AS text) AS statement_text,
                ISNULL(cast(OBJECT_SCHEMA_NAME(st.objectid, st.dbid) + '.' + OBJECT_NAME(st.objectid, st.dbid)
                         AS varchar(100)), 'AdHoc Statement') AS object_name,
                s.login_name,
                CASE
                WHEN LEFT(s.program_name, 8) = 'SQLAgent' then
                        (SELECT 'SQLAgent Job: ' + b.name from msdb.dbo.sysjobs b WHERE (SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(s.PROGRAM_NAME,30,10))
                ELSE s.program_name
                END AS [program_name], r.start_time AS request_start_time, r.last_wait_type, r.cpu_time, r.total_elapsed_time, r.logical_reads,
                r.reads AS physical_reads, r.status AS request_status, r.wait_time, r.command, master.dbo.fn_varbintohexstr(r.plan_handle) AS plan_handle
        FROM sys.dm_exec_sessions s
            LEFT JOIN sys.dm_exec_requests r
            ON r.session_id = s.session_id
            OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
        Where  S.Session_ID In
            (
                 Select Blocking_Session_ID
                 From Sys.DM_Exec_Requests (READUNCOMMITTED)
                 Where Blocking_Session_ID <> 0
            )

Finally, becasue TempDb is a precious resource we introduced a check for long running transactions which can block the checkpoint process and cause a huge increase of the TLog size and, why not, exhaust the disk space. Just remember that on the TempDb the checkpoint happens when the TLog is at 70% usage and any open (long) transaction delay the process, and could start an “avalanche effect”; several times it does not depend on how much data You write in the TempDb but rather how much that transaction last

This script can also be changed for checking a different database name

SELECT  ISNULL(cast(tst.session_id as varchar),'Internal') as SessionID,
    tdt.database_transaction_log_bytes_reserved/1024 AS [TlogKB],
    tat.transaction_id AS [Transacton ID],
    tat.name      AS [TRANSACTION Name],
    tat.transaction_begin_time AS [TRANSACTION BEGIN TIME],
    DATEDIFF(mi, tat.transaction_begin_time, GETDATE()) AS [Elapsed TIME (in MIN)],
    CASE tat.transaction_type
        WHEN 1 THEN 'Read/write'
        WHEN 2 THEN 'Read-only'
        WHEN 3 THEN 'System'
        WHEN 4 THEN 'Distributed'
        END AS [TRANSACTION Type],
    CASE tat.transaction_state
        WHEN 0 THEN 'The transaction has not been completely initialized yet.'
        WHEN 1 THEN 'The transaction has been initialized but has not started.'
        WHEN 2 THEN 'The transaction is active.'
        WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
        WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
        WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
        WHEN 6 THEN 'The transaction has been committed.'
        WHEN 7 THEN 'The transaction is being rolled back.'
        WHEN 8 THEN 'The transaction has been rolled back.'
        END AS [TRANSACTION Description],
    CAST  (SUBSTRING(t.text, (r.statement_start_offset/2)+1,
    ((CASE r.statement_end_offset
        WHEN -1 THEN DATALENGTH(t.text)
        ELSE r.statement_end_offset
    END - r.statement_start_offset)/2) + 1) as text) AS statement_text
FROM sys.dm_tran_active_transactions tat
    INNER JOIN sys.dm_tran_database_transactions tdt
        on tat.transaction_id=tdt.transaction_id
    LEFT JOIN sys.dm_tran_session_transactions AS tst
        ON tdt.transaction_id = tst.transaction_id
    LEFT OUTER JOIN sys.dm_exec_requests AS r
         ON tst.session_id = r.session_id
    OUTER APPLY sys.dm_exec_sql_text(r.plan_handle) AS t
WHERE tdt.database_id=DB_ID('tempdb') and tdt.database_transaction_log_bytes_reserved > 0
ORDER BY 2 DESC     

Putting it all together I wrote a sp with 3 input parameters and named it sp_WhatIsRunning

USE master
GO
CREATE PROC [dbo].[sp_WhatIsRunning]
(
    @ShowPlan Bit = 0,
    @ShowLock Bit = 0,
    @ShowTempLog Bit = 0
)
AS
BEGIN
    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    IF (@ShowPlan = 0)
    BEGIN
        SELECT s.host_name, r.session_id as 'session', r.blocking_session_id as [blocked by],
        CAST  (SUBSTRING(st.text, (r.statement_start_offset/2)+1,
            ((CASE r.statement_end_offset
             WHEN -1 THEN DATALENGTH(st.text)
            ELSE r.statement_end_offset
        END - r.statement_start_offset)/2) + 1) as text) AS statement_text,  ISNULL(cast(OBJECT_SCHEMA_NAME(st.objectid, st.dbid) + '.' + OBJECT_NAME(st.objectid, st.dbid) as varchar(100)), 'AdHoc Statement') as object_name,
        s.login_name,
        CASE  WHEN LEFT(s.program_name, 8) = 'SQLAgent' then
                    (SELECT 'SQLAgent Job: ' + b.name from msdb.dbo.sysjobs b WHERE (SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(s.PROGRAM_NAME,30,10))
            ELSE s.program_name
        END AS [program_name],
        r.start_time as request_start_time,r.last_wait_type,r.wait_time,
        r.cpu_time, r.total_elapsed_time,
        r.logical_reads, r.reads as physical_reads, r.status as request_status
        FROM sys.dm_exec_sessions s left JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
        WHERE r.session_id > 50 AND r.session_id <> @@SPID
        AND last_wait_type <> 'SP_SERVER_DIAGNOSTICS_SLEEP'
        ORDER BY cpu_time DESC
    END
    ELSE
    BEGIN
    SELECT s.host_name, r.session_id as 'session', r.blocking_session_id as [blocked by],
    CAST  (SUBSTRING(st.text, (r.statement_start_offset/2)+1,
        ((CASE r.statement_end_offset
         WHEN -1 THEN DATALENGTH(st.text)
        ELSE r.statement_end_offset
        END - r.statement_start_offset)/2) + 1) as text) AS statement_text,  ISNULL(cast(OBJECT_SCHEMA_NAME(st.objectid, st.dbid) + '.' + OBJECT_NAME(st.objectid, st.dbid) as varchar(100)), 'AdHoc Statement') as object_name,
        s.login_name,
             CASE  WHEN LEFT(s.program_name, 8) = 'SQLAgent' then
                        (SELECT 'SQLAgent Job: ' + b.name from msdb.dbo.sysjobs b WHERE (SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(s.PROGRAM_NAME,30,10))
                ELSE s.program_name
            END AS [program_name],         r.start_time as request_start_time,r.last_wait_type,r.wait_time,
        r.cpu_time, r.total_elapsed_time,
        r.logical_reads, r.reads as physical_reads, r.status as request_status,
        CAST (tp.query_plan as xml) AS plan_xml
        from sys.dm_exec_sessions s left join sys.dm_exec_requests r on s.session_id = r.session_id
        CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
        OUTER APPLY sys.dm_exec_text_query_plan( r.plan_handle, r.statement_start_offset, r.statement_end_offset) tp
        WHERE r.session_id > 50 and r.session_id <> @@SPID
        AND last_wait_type <> 'SP_SERVER_DIAGNOSTICS_SLEEP'
        ORDER BY cpu_time DESC
    END

    IF (@ShowLock=1)
    BEGIN
        SELECT        s.session_id, r.blocking_session_id AS [blocked by], CAST(SUBSTRING(st.text, (r.statement_start_offset / 2) + 1, ((CASE r.statement_end_offset WHEN - 1 THEN DATALENGTH(st.text)
                         ELSE r.statement_end_offset END - r.statement_start_offset) / 2) + 1) AS text) AS statement_text, ISNULL(cast(OBJECT_SCHEMA_NAME(st.objectid, st.dbid) + '.' + OBJECT_NAME(st.objectid, st.dbid)
                         AS varchar(100)), 'AdHoc Statement') AS object_name, s.login_name,
             CASE  WHEN LEFT(s.program_name, 8) = 'SQLAgent' then
                        (SELECT 'SQLAgent Job: ' + b.name from msdb.dbo.sysjobs b WHERE (SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(s.PROGRAM_NAME,30,10))
                ELSE s.program_name
            END AS [program_name]                         , r.start_time AS request_start_time, r.last_wait_type, r.cpu_time, r.total_elapsed_time, r.logical_reads,
                         r.reads AS physical_reads, r.status AS request_status, r.wait_time, r.command, master.dbo.fn_varbintohexstr(r.plan_handle) AS plan_handle
                        FROM sys.dm_exec_sessions s
                            LEFT JOIN sys.dm_exec_requests r
                            ON r.session_id = s.session_id
                         OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
        Where  S.Session_ID In
            (
                 SELECT Blocking_Session_ID
                    FROM Sys.DM_Exec_Requests (READUNCOMMITTED)
                 WHERE Blocking_Session_ID <> 0
            )
    END
    IF (@ShowTempLog =1)
            BEGIN
            SELECT  ISNULL(cast(tst.session_id as varchar),'Internal') as SessionID,
            tdt.database_transaction_log_bytes_reserved/1024 AS [TlogKB],
            tat.transaction_id AS [Transacton ID],
            tat.name      AS [TRANSACTION Name],
            tat.transaction_begin_time AS [TRANSACTION BEGIN TIME],
            DATEDIFF(mi, tat.transaction_begin_time, GETDATE()) AS [Elapsed TIME (in MIN)],
            CASE tat.transaction_type
                WHEN 1 THEN 'Read/write'
                WHEN 2 THEN 'Read-only'
                WHEN 3 THEN 'System'
                WHEN 4 THEN 'Distributed'
                END AS [TRANSACTION Type],
            CASE tat.transaction_state
                WHEN 0 THEN 'The transaction has not been completely initialized yet.'
                WHEN 1 THEN 'The transaction has been initialized but has not started.'
                WHEN 2 THEN 'The transaction is active.'
                WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
                WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
                WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
                WHEN 6 THEN 'The transaction has been committed.'
                WHEN 7 THEN 'The transaction is being rolled back.'
                WHEN 8 THEN 'The transaction has been rolled back.'
                END AS [TRANSACTION Description],
            CAST  (SUBSTRING(t.text, (r.statement_start_offset/2)+1,
            ((CASE r.statement_end_offset
                WHEN -1 THEN DATALENGTH(t.text)
                ELSE r.statement_end_offset
            END - r.statement_start_offset)/2) + 1) as text) AS statement_text
        FROM sys.dm_tran_active_transactions tat
            INNER JOIN sys.dm_tran_database_transactions tdt
                on tat.transaction_id=tdt.transaction_id
            LEFT JOIN sys.dm_tran_session_transactions AS tst
                ON tdt.transaction_id = tst.transaction_id
            LEFT OUTER JOIN sys.dm_exec_requests AS r
                 ON tst.session_id = r.session_id
            OUTER APPLY sys.dm_exec_sql_text(r.plan_handle) AS t
        WHERE tdt.database_id=DB_ID('tempdb') and tdt.database_transaction_log_bytes_reserved > 0
        ORDER BY 2 DESC
    END
END     

You can call it simply with

  • exec sp_WhatIsRunning to get a list of running processes
  • exec sp_WhatIsRunning 1 to add the Execution Plan to the output
  • exec sp_WhatIsRunning 0,1 to show the list of running together with blocking/blocked processes
  • exec sp_WhatIsRunning 0,0,1 to show the list of running processes together with the open transactions list on the TempDb
  • exec sp_WhatIsRunning 1,1,1 to show all; running processes, blocked/blocking and TempDb active transactions

This is just a starting point, we created the sp this way because this is what we need for realtime monitoring, but the it can be expanded with additional fields and/or visualization options.

e come sempre alcune misure

Sebbene non sia mai stato un amante degli amplificatori in Classe D un po’ di tempo fa ho iniziato ad interessarmi dei moduli PowerSoft delle serie Digimod. l’idea era di utilizzare inizialmente un modulo Digimod 500 per un Subwoofer Home Theatre basato sull’altoparlante CIARE HS251, un 10” dall’ottimo rapporto qualità prezzo, e poi un modulo Digimod 1000 per un diffusore amplificato da impiegare anche come monitor, basato sul woofer 18Sound 12W500 in versione 4Ohm e Tromba 18Sound XR1064 pilotata da un driver RCF CD350. La scelta in questo caso è caduta su 18Sound per il fatto che il 12W500, nonostante l’elevata efficienza, non ha confronti in termini di estensione della risposta a parità di volume con altri modelli e/o marche, e perché la tromba è facilmente ruotabile di 90° per l’impiego come monitor e presenta una dispersione abbastanza ridotta su entrambe i piani per essere un componente “tradizionale”; ho scelto poi il  CD350 sinceramente per sperimentare cosa può essere in grado di fare un driver con bobina da 1,75” dal prezzo molto concorrenziale (69€ da www.rossinimusica.it).

Tornando ai moduli Digimod ho acquistato inizialmente il 500 da www.ggsound.it e successivamente i Digimod 1000 completi di Intergration Kit ed i cavi e gli accessori necessari alla programmazione tramite Armonia da laboratoriomusica.com di Vanis Dondi, dove ho trovato i prezzi migliori credo anche per gli altoparlanti 18Sound; Vanis inoltre è sempre stato molto gentile e disponibile sulle mie richieste di delucidazioni. Successivamente ho trovato altri 2 Digimod 1000 e due Digimod 1000NPS su Mercatino Musicale ad un prezzo molto vantaggioso.

I moduli permettono configurazioni molto flessibili in quanto praticamente tutti hanno a disposizione un connettore per collegare un modulo 1000NPS ed espandere cosi le possibilità di configurazione; il modulo DSP fornito con l’Integration Kit ha a disposizione una terza via sulle uscite 3 e 4 che permette di realizzare anche sistemi a 3 vie di notevole potenza, ad esempio con un 500 + 1000NPS oppure 1000+1000NPS con quest’ultimo ad esempio in bridge su 8Ohm.

Per quanto riguarda il loro impiego in campo professionale per quello che ne so, cercando un po’ qua e la nella rate, sono usati in diversi diffusori RCF oltre all’impiego in modo diffuso dei moduli IcePower della B&O; il DIGIMOD 1000 ad esempio è utilizzato nel TTL12-AS, mentre il TTS56-A usa 2 DIGIMOD 3000PFC.

Trattandosi naturalmente di moduli in classe D la potenza massima viene dichiarata nelle condizioni tipiche per questo tipo di configurazione, quindi con le specifiche EIAJ e all’ 1% di distorsione, come avviene anche per i finali di note marche; ma Powersoft in un documento reperibile online per questa linea “tradizionale” di moduli ha il pregio di elencare anche le potenze RMS erogabili dai moduli ed è a queste che farò riferimento nei miei test.

image

Notiamo quindi che per il più piccolo Digimod 500 si dichiara una potenza di 260W RMS con carico da 8Ohm e 450W RMS per 4Ohm, unitamente alla specifiche EIAJ un po’ più permissive; inoltre vengono riportati anche i limiti quando usato insieme ad un Digimod 1000NPS, al quale fornisce l’alimentazione.

Di seguito un paio di immagini del Digimod 500 montato sul dissipatore fornito insieme all’ Integration Kit, pronto per essere testato al banco.

20150604_193847

20150610_083146

Con il solito test 3s On e 15s Off a 100Hz il modulo in questione mostra ancora un’ onda pulita con 45.1V RMS con carico di 8Ohm, corrispondenti a 254W.

20150610_185227

I primi segnali di clipping arrivano a 46.4V corrispondenti a 270W

20150610_185354

L’onda è ancora molto “composta”, senza quel tipico taglio netto del clipping della maggior parte dei  finali tradizionali, e soprattutto molto simmetrico.

Passando a 4Ohm si nota che l’onda è ancora pulita a 41.1V RMS (l’immagine è un po’ mossa) corrispondenti a 422W RMS

20150610_190006

Mentre i primi segni del clipping si notano a circa 42.7V RMS, corrispondenti a 455W RMS, tra l’altro di nuovo con un principio di clipping molto simmetrico e abbastanza morbido; non sono in grado di misurarla ma con questa forma d’onda la distorsione è ancora molto bassa.

20150610_190046

Direi quindi un buon comportamento, considerando che si tratta di misure reali e non da laboratorio, quindi innanzitutto con tensione non stabilizzata e con cavo di alimentazione dell’ampli lungo circa 1,5m preso da un distributore di tensione che va alla presa a muro con un cavo da 3m , tutto con sezione di 2,5mm2.

A breve cercherò di pubblicare anche i test del modulo DIGIMOD 1000, unitamente a quelli con il 1000NPS ed in varie combinazioni; ad esempio, per simulare una tipico diffusore commerciale, una via che pilota un carico di 4Ohm (woofer) e l’altra che ne pilota uno da 8 o 16Ohm (Driver), con ad esempio una differenza di livello di 3/6dB tra le due vie che normalmente viene usata per compensare le differenze di efficienza unitamente all’equalizzazione.

Aggiornamento del 07/04/2017

In questi giorno sono riuscito a mettere un po’ al banco il DIGIMOD 1000, anche se al momento solo da solo e non accoppiato al modulo 1000NPS. Con il solito test ma con un periodo di ON un po’ più lungo del precedente, 4/5s contro 3s della precedente prova, ma sempre a 100Hz

Con un carico stereo da 8Ohm a 44V RMS (231W) per canale abbiamo ancora l’onda pulita nonostante il led del clipping sul modulo si sia già acceso: l’onda infine inizia a “piegarsi” poco oltre i 44V RMS (240W)

20170405_124610

Impostando invece uno dei canali con un livello di 3dB più basso  abbiamo l’onda ancora pulita a 44.3V RMS corrispondenti  a 245W, con l’altro canale che eroga poco più di 120W. Quindi ipotizzando di pilotare la classica configurazione MidWoofer+Driver tutto 8Ohm possiamo realizzare un diffusore/monitor da 300W RMS “reali” ed anche qualcosa di più, considerando che tra equalizzazione ed attenuazione di un driver da 1,75” la seconda via tipicamente erogherà da 1/2 ad 1/4 della potenza disponibile. Nonostante questo comunque consiglio di impostare il limiter della vie dedicata ai medioalti a circa 50W RMS che è anche la tipica potenza supportata da questo tipo di driver; per modelli invece con bobina da 2.5” / 3” tipicamente si viaggia tra i 90W e i 110W RMS.

Passando ai 2 canali a 4Ohm abbiamo l’onda pulita a 39,3V RMS corrispondenti a circa 386W RMS ed i primi segni di clipping a 40.3V RMS corrispondenti a circa 406W RMS; con questo test dopo circa 4s il limiter interno riduce la potenza RSM a circa 250W.

20170405_132746

20170405_133226

Impostando invece uno dei due canali con un guadagno a –3dB o –6dB rispetto all’altro i 40.3V RMS diventano puliti ed il clipping iniza ad apparire a circa 41V RMS (420W). Quindi nel caso in cui l’ipotetico due vie di cui sopra si ritrova con un MidWoofer da 4Ohm riusciamo a realizzare un sistema da 450W RMS reali con un driver da 1,75” e 500W nel caso di impiego di un componente con bobina da 2,5”/3”. Non ho provato la potenza in bridge su 8Ohm ma dal momento che abbiamo il dato in stereo su 4Ohm il conto è presto fatto.

Anche per il DIGIMOD 1000 quindi le specifiche sono confermate; a breve la prova de vari moduli combinati tra di loro.

Il finale Yamaha P7000S (review)

Pubblicato: 2 febbraio 2016 in Elettronica, Musica

E alcuni test…

Recentemente ho acquistato una coppia usata di finali Yamaha P7000s, in modo da pilotare 4 unità bassi, costruite con il woofer RCF L15P200AK-II; come ho fatto per altri finali in passato mi sono rivolto a Mercatino Musicale, dove li ho trovati in condizioni molto buone, ed ad un prezzo molto ragionevole, poco più di 700€ per entrambe. L’idea era di trovare una coppia di finali piùttosto che uno solo di maggiore potenza per avere maggiore flessibilità nella configurazione; li posso usare in stereo @8Ohm, o a ponte @4Ohm, ognuno che pilota una coppia di bassi. Inoltre, considerando che uso un Crest CC4000 sui mediobassi da 12”, sia a 8 che a 4 Ohm, posso provare cinfigurazioni differenti e ad esempio usare il CC4000 per pilotare i bassi in stereo @4Ohm e i due Yamaha sui 12”.

Anche per questo modello, come per il CC4000, ho letto numerosi commenti sia positivi che negativi sui vari forum; come al solito ho deciso con la mia testa e di provare. Uno sguardo agli schemi in rete ci dice che questo amplificatore ha:

  • un buon numero di transistor sullo stadio di uscita, 12 per canale; significa un buon fattore di smorzamento, meno potenza dissipata per transistor, ecc..
  • uno schema completamente a transistor per la sezione finale, con il tipico stadio di ingresso, filtri e “accessori” vari costruiti con integrati. Nella maggiore parte dei finali Pro lo stadio di ingresso della sezione finale è ad integrati; la serie P di Yamaha, come la serie CA di Crest, ha lo stadio finale completamente a transistor, con 1 solo condensatore sul percorso del segnale.
  • un interessante sistema di alimentazione (EEEngine) che sembra essere promettente in termini di potenza totale assorbita e dissipata, che si tradice in meno calore generato.

Un’ immagine dell’interno

P7000S Internal

Non sono ancora riuscito a trovare il tempo per effettuare dei test di ascolto e confrontarlo sia con il CA6 che con il CC4000, ma ho trovato un po’ di tempo per fare alcune prove al banco; ho usato come al solito il mio carico stereo da 8Ohm creato con 8 resistenze da 2Ohm 50W, che ha fronte dei 200W nominali per ramo è in grado di reggere 1000W con un “duty cicle” pari a 5 (1s ON, 5s OFF). Ho collegato il tutto ad un piccolo distributore di corrente a sua volta collegato alla presa di rete tramite una prolunga da 5m costruita con un cavo 3×2,5mm2, usando il cavo di alimentazione fornito, che trattandosi di uno 3×0,75mm2 sinceramente mi sembra un po’ striminzito e potrebbe mangiarsi qualche Watt (maggiori dettagli sulla review del CC4000). Magari ci torniamo in seguito.

Con il mio solito test da 3s on e 15s off @100Hz il P7000S clippa @675W/8Ohm, con il tester che segna 73,5V RMS, i led del clipping che iniziano ad illuminarsi e la forma d’onda come dall’immagine qui sotto.

100Hz full power

L’amplificatore quindi raggiunge pienamente le specifiche, che lo danno per 650W RMS nelle versioni per il mercato Europeo; le versioni EU (230V) infatti lasciano sul campo circa 50W rispetto alle altre, e dando un occhio allo schema questo è il risultato dell’utilizzo di un paio di induttori in serie all’alimentazione principale, il cui ruolo sinceramente non mi è molto chiaro, anche se su un forum ho letto che sembrerebbe trattarsi di una sorta di PFC, che normalmente è un po’ più complesso rispetto ad una semplice coppia di induttori.

Usando come riferimento un video visto in rete di un P7000S modificato, unitamente ad un check sullo schema che mi ha confermato che la loro rimozione avrebbe portato solo benefici (anche in termini di qualità probabilmente), mi sono deciso a scollegare i loro terminale sostituendoli con un ponticello di alcuni cm di cavo ed un paio di faston; le versioni non EU hanno un ponticello saldato direttamente sulla scheda ma il risultato è lo stesso.

Quindi l’ho provato di nuovo ed ho ottenuto circa 740W @8Ohm, con il tester che segna 77V RMS e i led del clip che iniziano a lampeggiare.

100Hz full power no coils

Come si vede l’onda è ancora “pulita”; sembra quindi che la rimozione delle bobine non solo regala qualche Watt in più (65W) ma sembra anche fornire un’alimentazione migliore ai moduli switching ed infine ai finali.

Ho ripetuto anche il test @50Hz ed il risultato è stato lo stesso, se non leggermente migliore.

50Hz full power no coils

Attualmente non ho a disposizione un numero di resistenze sufficiente per costruire un carico stereo da 4Ohm adeguato, quindi non riesco a provare amplificatori di questo taglio su quel carico senza il rischio di distruggere le resistenze, ma posso testare la configurazione a ponte @4Ohm con un minimo di margine; per questo amplificatore il datasheet riporta la potenza in bridge @4Ohm  (2Ohm stereo) solo per picchi di 20ms, ed il mio obiettivo era quello di avere un finale che configurato a ponte @4Ohm avesse le stesse caratteristiche del mio CA6 (adesso 1650W), con un minimo di margine; in questo modo quando sono utilizzati insieme forniscono almeno 3200/3300W e, cosa molto importante, senza spingere i finali al limite; attualmente con il CA6 che pilota due unità bassi e con 2 satelliti ottengo un buon bilanciamento globale, quindi con la configurazione finale da 4+4 mi viene garantito lo stesso bilanciamento, e un piccolo margine per “strafare” un po’.

Detto questo ho fatto alcune prove a ponte @4Ohm e alla fine ho deciso di fermarmi a circa 2350W RMS, 97V RMS; le due induttanza sono scollegate

4Ohm bridged

Questo è più che sufficiente per le mie esigenze,e la cosa positiva è che nessun circuir braker o altre forme di protezione/limitazione stavano intervenendo; mi preme solo ricordare che il CC4000 faceva scattare il suo circuit braker a circa 2100W @4Ohm a ponte, motivo per il quale avevo ridotto il ciclo ad 1s per potere raggiungere potenze superiori.

Come al solito ho fatto anche dei test a frequenza superiori per verificare l’assenza di artefatti dovuti ad una scarsa corrente di riposo e/o residui di alimentazione; questa volta inoltre ero ancora più curioso per il comportamento dell’EEEngine.

Questa è l’onda a 10KHz e 2.83V RMS

2.83V @10K

La stessa 10Kz a 80VPP (28,3V RMS, 100W/9Ohm)

20151122_163947_thumb2

Molto pulite entrambe; ho poi ripetuto lo stesso tests a 15KHz ma il risultato è stato lo stesso.

Aggiornamento dell’ 08/12/2015

Oggi ho sostituito il cavo di alimentazione con un pezzo di cavo da 3×2,5mm2, come si può vedere dalla foto del confronto con l’originale.

20151125_090105

I risultati alla fine sono rimasti gli stessi, con l’amplificatore che eroga 77,7V RMS (755W/8Ohm) ai primi segni del clipping, cosa che conferma che il P7000S, ed anche il suo fratello minore P5000S penso, abbia una sorta di “regolazione” dell’alimentazione in grado di reggere un minimo di “undervoltage”; la tensione sui connettori della scheda era circa 227V contro 222/223V rilevati con il cordone originale.

20151208_151946

Di seguito alcune letture prese dal distributore di alimentazione durante i test, giusto per avere un’idea del consumo di questo amplificatore.

A riposo, senza nessun’altra apparecchiatura collegata: 60VA

20151208_150243

100W RMS per canale @8Ohm, compresi circa 200VA usati da una lampadina, l’oscilloscopio, il pc ed il mixer; siamo quindi a circa 470VA totali.

20151208_151430

200W RMS @8Ohm entrambe i canali; circa 800VA

20151208_151615

Al clipping @8Ohm, sempre due canali funzionanti; poco più di 1900VA totali per circa 1500W sul carico.

20151208_151931

Italiano

And some tests…

Recently I bought a couple of second hand Yamaha P7000S in order to driver a total of 4 bass units, built on the RCF L15P200AK-II woofer; like i did for other amplifiers in the past I took a look on on the Italian Mercatino Musicale site and found them in very good condition and for a reasonable price, little more than 700€ both. I was looking for a couple of amplifiers over a single unit of more power in order to have better flexibility in the configuration; I can use them all in stereo @8Ohm or bridged @4Ohm on two bass unit each. Moreover, considering that I currently use a CC4000 to drive the 12” mid basses in both 8 and 4 Ohm setup I can also try different configurations and for example use the CC4000 to drive the 4 bass units in 4Ohm stereo and the Yamahas for the 12”.

Also for this model, like my CC4000, I read several different comments both positive and negative on some forums; as usual in the choice I used my head and decided to give it a chance. Looking and the schematics on the net once again I found and amplifier with:

  • a good number of output devices, you can see a total of 12 per channel; better damping factor, less power per device, and so on …
  • a full transistor schema from the input to the output of the power module, while as usual input, filters and other “accessory” units are IC based. On most amplifiers the input stage of the power module is IC based; the P series is just like the Crest CA all transistor based, and with 1 capacitor through the whole signal path
  • an interesting power supply technology (EEEngine) which seems to be promising in terms of total power consumption and dissipated (= wasted); this translates into less heat generated.

Here is a shot of the internals

P7000S Internal

I haven’t had yet the chance to do a listening test and compare it to both the CA6 and the CC4000,but found some time to put it under a small bench; as usual I used my 8 2Ohm 50W resistors to build up a stereo 8Ohm load of 200W, which is capable of handling up to 1000W with a duty cycle of 5 (1s on 5 off). I then connected a small power distributor to the wall plug with 5m of 3×2.5mm2 cable and powered the unit, which has a 2m supply cable, quite small in my opinion; it’s a 3×0.75mm2 unit and maybe could “eat” some watts (read my CC4000 review for details). Maybe I’ll come back later on this.

With the usual 3s on and 15s off @100Hz the P7000S clipped @675W/8Ohm, with the meter reading 73.5V RMS, the clip leds starting to light up and the wave figure like below

100Hz full power

The amplifier well met it’s specifications, which state 650W RMS for the EU version; yes the EU version (230V) seems to loose almost 50W compared to the other, and looking at the schematic this is due to a couple of inductors put in series on the main supply, which role sincerely is not so clear to me, even if on a forum i read that it should act like a PFC circuit, but PFC is something that is a little more complicated than a simple pair of inductors.

Supported by a video I saw on the net of a modded P7000S, and by a check on the schematic which confirmed me that their removal would produce only gains, I decided to disconnect the terminals of the coils and to put in place a jumper built with some cm of cable and a couple of faston; the non EU version have a jumper built on the board but it is the same.

I tested it again and got back around 740W 8Ohm, with the meter reading 77V RMS and the clip leds flashing lightly

100Hz full power no coils

As You can see the wave is still clean and this is very good; it seems that the removal of the coils not only give more power (65W) but also seems to present a better supply line to the switching modules and finally to the amps.

I then repeated the test @50Hz and the results were the same, if not slightly better (few mV more).

50Hz full power no coils

I currently do not have enough resistors to build  a proper 4Ohm load, so I cannot test such a high power unit without the risk of destroying the resistors, but I can test a 4Ohm bridge configuration with some safety margin; for this amplifier the sheet only report the bridge power for 4Ohm loads (2Ohm stereo) for 20ms peaks, and my objective was to have a unit which, when  bridged @4Ohm, just meet the RMS specs of my CA6 (currently 1650W) with some margin; so when used together they will deliver around 3200/3300W, and most important without pushing hard the amps to the limits; currently with the CA6 driving 2 bass units and with 2 satellites there is a very good sound balance, so with the whole 4+4 configuration the same balance will guaranteed, and also with a reasonable little margin to play a little harder when needed.

Given this I tried some tests with the bridged configuration @4Ohm and finally decided to stop at around 2350W RMS, that is 97V RMS; the two coils are still disconnected.

4Ohm bridged

This is more than enough form me, and the good thing is  that no breaker or other form of protection/limiting was kicking in; just remember that the CC4000 was triggering it’s circuit braker at around 2100W when bridged @4Ohm, so that I had to reduce the cycle to 1s on in order to be able to reach higher power levels.

As usual I also do some tests at higher frequencies to check for the absence of wave artifacts due to missconfigured idle current (higher distortion) or power supply residual; this time I was also curious about the behavior of the EEEngine.

This is the 10KHz wave at 2.83V RMS

2.83V @10K

And this is the same 10KHz wave at 80VPP (28.2RMS, 100W/8Ohm).

They are both clean; I then repeated the tests at 15Khz and the figures didn’t change, very clean the same.

I will order in the next days an additional resistors set in order to build a reliable 4Ohm load and will come back with the results under that load; moreover i think I will play around with the power chord.

Update on 08/12/2015

Today I replaced the power chord with a piece pf 3×2.5mmq cable, like You can see in this photo compared to the original.

20151125_090105

The results were almost the same, with the amplifier delivering 77.7V RMS @8Ohm (755W/8Ohm) at the onset of the clipping, confirming that the P7000S ,and also the P5000S I think, has a minimal sort of “regulation” for small undervoltage; the voltage at the board connectors was around 227V while with the original power chord it was around 222/223V.

20151208_151946

Here are some additional readings of this amplifier taken from the power box I use, just to get an idea of its power consumption

This is the at idle with no other equipment connected to the power box: 60VA

20151208_150243

This is at100W RMS @8Ohm both channels, with a total of additional 200VA used by a lamp, scope, pc and mixer; so around 470VA absorbed

20151208_151430

This is at 200W RMS @8Ohm both channels; around 800VA used

20151208_151615

And this is at full power @8Omh both channels: a total of around 1900VA for 1500W on the load

20151208_151931

a small review but at the moment without bench data…

Some months ago I decided to take an amplifier with higher specifications than the “wonderful” CA6, in order to fully kick my bass units, because when used outside, in bridge mode @4Ohm (~1600 Watts), the “small” CA6 appears to be a little undersized, even if it drives 4Ohm bridged without problems. Furthermore I’d like to not “overuse” a power amplifier, so that I carefully look at all the clip leds in order to have them light for few times during the events; I know, and already described, that the limiter circuits do a good job in keeping distortion at low levels when they’re on, but on the other hand there isn’t much more to obtain from an amplifier when it is already telling you that it reached its limit, that’s my point of view… I bought a second hand CC5500 in very good conditions so that it seems just came out of the box.

I read some very negative comments on the various forum .. “it’s crap”, “economical” and so on, but my impression was that many of them were driven by “fanaticism” for other brands, non technical/on the road opinions and assumptions: on the other hand the Crest Pro series is considered to be one of the best sounding line, so why not the CC5500 which has the same schematic as the Pro serie, and the Peavey CS series, with the CC and the CS having a traditional power supply instead of switching? You can also read very good opinions regarding the CS4080 which is CC5500 with higher supply rails and minimum 4Ohm load and, most important “The things I learned while designing the Crest 9200 carried over to your Peavey CS4080Hz. It’s mostly a Crest 9200 output stage with a linear transformer limited to 4 ohm/ch capability. That in turn morphed into the Crest CC5500 with a two ohm rating. Hence the similarity you noted. We would like to keep the two brands uniquely separated, but I’m not going to burn Hartley dollars reinventing technology. When the price point allows, the Crest gets more stuff inside”, forum words of an ex-Crest engineer… point…

In addition to the above I based my choice also on this review and this one  

Currently in this page You will not find bench data like for other units I own, basically for 3 reasons:

  1. my load resistors ( 4 x 2Ohm in series) are rated at 50W each for continuous drive, so 200W total, and a 5x overdrive capability for a duty cycle of 5s ( 5on and 5off). I already use a longer OFF cycle (10s)  and 2 fans blowing on the heat sink, however their life will be at risk with the CC5500, because they already “cried” with the CC4000.
  2. I always use  “real” home plugs in my tests, currently cabled with 1.5mm2 wires from the general switch having a 10A wall outlet, to which I attach a 3m extension (3×2.5mm2) going to the power distributor on the rack. This is far away from regulated bench supplies and almost reflect real usage scenario.
  3. The results of the CC4000 presented on this pages (for the point above) were misunderstood and interpreted on some forums (or from some people) as the amplifier not meeting its specs, and not as the result of the whole power supply line performance. As You can read here the CC4000 fully reached its 8Ohm specs on a bench supply but started suffering mains voltage drops on lower loads.

Dopo diversi anni di glorioso servizio alcuni mesi fa è giunta l’ora di “rottamare” le vecchie casse, destinando alla discarica la parte in legno, che dopo 20 anni iniziava a evidenziare problemi di vecchiaia, soprattutto quelle in truciolare per i bassi, che se non fosse stata per una struttura interna simil-matrix nell’ultimo periodo avrebbe avuto sicuramente problemi; per quanto riguarda gli altoparlanti, il CIARE HW380 è stato “ceduto” al miglior offerente mentre sono stati messi a riposo (momentaneamente) un vecchio PW322, che riporta ancora la scritta  M320-75… ed una tromba a direttività costante (T4439) con un profilo che si appoggia alla perfezione su un woofer da 12”.

Leggi il seguito di questo post »

Con SQL Server 2014 ed il Cumulative Update 2 della Service Pack 1 di SQL Server 2012 è stata introdotta l’opzione “TO URL” del comando BACKUP, che permette di memorizzare direttamente un file di backup sul blob storage di Azure. L’operazione è possibile anche con le versioni precedenti (2005, 2008, 2008R2) tramite il tool “SQL Server Backup to Windows Azure”, reso disponibile nei primi mesi del 2014.

Leggi il seguito di questo post »