Ad Widget

Collapse

House

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Italo Fernando Lopes
    Member
    • Feb 2011
    • 58

    #1

    House

    Senhores estou com problema na execução do Housekepeer .Porém após a execução o Zabbix me retorna a seguinte informação Database Is down.
    Entrei em contato com a equipe de DBA Oracle da empresa no qual acionou a Oracle e tivemos a informação abaixo.
    __________________________________________________ ______________
    Na verdade parece que o problema é o tamanho do mapa excluir. No caso do acidente de excluir é 2890144 bytes em uma linha, ou seja, uma linha de 2 MB de tamanho
    onde temos 481.690 ids diferentes na INLIST.
    Isso é demais para uma única linha no Oracle, mas estou surpreso isto dá ao ora-7445 aqui. O programa de teste que eu escrevi dá ou falha de segmentação
    ou ora-2108 (o que eu preciso para depurar mais).

    Em todo caso, eu aconselho a tentar reduzir o número de identificadores que são utilizados no comando delete. No caso de acidente, tivemos 481.690 ids diferentes na INLIST.
    Mas quando vemos a alocação de memória em Zabbix (ver DBadd_condition_alloc abaixo) vemos os desenvolvedores Zabbix assumiu max 950 ids que é substancialmente mais baixo.
    Então, você pode também verificar com o Zabbix desenvolvedores se fosse sempre a intenção de utilizar o software com tais inlists longo
    __________________________________________________ _______________

    Segue a sugestão da oracle para normalizar esse problema .
    A minha pergunta é :
    E viavel para o Zabbix 1.8.4?
    __________________________________________________ _________
    Name
    --------
    === ODM Data Collection ===

    === ODM Data Collection ===

    Generated SQL: delete from housekeeper where (housekeeperid in (27144,...

    in program:
    ***********


    char *sql = NULL;
    int sql_alloc = 512, sql_offset = 0;
    zbx_uint64_t *ids = NULL;
    int ids_alloc = 0, ids_num = 0;
    ...


    if (NULL != ids)
    {
    sql = zbx_malloc(sql, sql_alloc * sizeof(char));
    zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 32,
    "delete from housekeeper where");
    DBadd_condition_alloc(&sql, &sql_alloc, &sql_offset,
    "housekeeperid", ids, ids_num);

    DBexecute("%s", sql);

    zbx_free(sql);
    zbx_free(ids);
    }

    in include\commons.h:
    **************

    #define zbx_malloc(old, size) zbx_malloc2(__FILE__, __LINE__, old, size)

    void *zbx_malloc2(const char *filename, int line, void *old, size_t size);


    #ifdef HAVE___VA_ARGS__
    # define zbx_snprintf_alloc(str, alloc_len, offset, max_len, fmt, ...) \
    __zbx_zbx_snprintf_alloc(str, alloc_len, offset, max_len, ZBX_CONST_STRING(fmt), ##__VA_ARGS__)
    #else
    # define zbx_snprintf_alloc __zbx_zbx_snprintf_alloc
    #endif /* HAVE___VA_ARGS__ */
    void __zbx_zbx_snprintf_alloc(char **str, int *alloc_len, int *offset, int max_len, const char *fmt, ...);


    in libs\zxcommon\misc.c:
    ************************
    void *zbx_malloc2(const char *filename, int line, void *old, size_t size)
    {
    int max_attempts;
    void *ptr = NULL;

    /* Old pointer must be NULL */
    if (NULL != old)
    {
    zabbix_log(LOG_LEVEL_CRIT, "[file:%s,line:%d] zbx_malloc: allocating already allocated memory. "
    "Please report this to Zabbix developers.",
    filename, line);
    /* Exit if defined DEBUG. Ignore otherwise. */
    zbx_dbg_assert(0);
    }

    for (
    max_attempts = 10, size = MAX(size, 1);
    max_attempts > 0 && NULL == ptr;
    ptr = malloc(size), max_attempts--
    );

    if (NULL != ptr)
    return ptr;

    zabbix_log(LOG_LEVEL_CRIT, "[file:%s,line:%d] zbx_malloc: out of memory. Requested %lu bytes.", filename, line, size);
    exit(FAIL);

    /* Program will never reach this point. */
    return ptr;
    }

    in include\db.h:
    ****************

    void DBadd_condition_alloc(char **sql, int *sql_alloc, int *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num);


    in src\libs\zbxdbhigh\db.c:
    ******************************

    void DBadd_condition_alloc(char **sql, int *sql_alloc, int *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num)
    {
    #define MAX_EXPRESSIONS 950
    int i;

    if (0 == num)
    return;

    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, " ");
    if (num > MAX_EXPRESSIONS)
    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, "(");

    for (i = 0; i < num; i++)
    {
    if (0 == (i % MAX_EXPRESSIONS))
    {
    if (0 != i)
    {
    (*sql_offset)--;
    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 8, ") or ");
    }
    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 128, "%s in (",
    fieldname);
    }
    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 128, ZBX_FS_UI64 ",",
    values[i]);
    }

    (*sql_offset)--;
    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, ")");

    if (num > MAX_EXPRESSIONS)
    zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, ")");
    }


    limits.h from quad (64Bit linux):
    *************************************
    /* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
    # define UINT_MAX 4294967295U

    FileName
    ----------------


    FileComment
    ----------------------
  • zabbix_zen
    Senior Member
    • Jul 2009
    • 426

    #2
    Italo,
    este caso parece um pouco específico.

    Recomendo que traduza a Thread para inglês e faça a questão
    aqui

    Nada melhor que os desenvolvedores Zabbix para te ajudarem

    Comment

    Working...