Я когда-то прочитал запись в блоге на этом URL, отправленном 13 июля 2009: http://www.mysqlperformanceblog.com/2009/07/13/what_problems_will_i_have_migrating_into_the_cloud/
Вот выборка от Точки № 1: инструменты Most High Availability (как MMM или DRBD+Heartbeat) работают над принципалом наличия плавающего IP-адреса, который используется, чтобы приложение соединилось с текущим ведущим устройством. С EC2 Вы не можете сделать этого.
Теперь, если это верно в некоторой степени, Вам, вероятно, придется реализовать некоторое циклическое выравнивание нагрузки в Вашем приложении для Записей DB к Вашим серверам MySQL в установке MultiMaster. Вы многие должны сделать это только для избегания рискованных действий.
Необходимо выглядеть глубже то, как выравнивание нагрузки EC2 работает.
Вы используете выравнивание нагрузки EC2 на своих ведомых устройствах чтения? Проверьте, что нагрузки серверов на тех работают в качестве ведомого устройства, чтобы удостовериться, что выравнивание нагрузки на самом деле происходит.
dmesg
дисплеи, что находится в буфере ядра, тогда как logger
для syslogd
. Я думаю, хотите ли Вы распечатать вещи в буфер ядра, необходимо будет создать драйвер, который использует printk()
функция ядра. Если Вы просто хотите это в /var/log/messages
, затем с "нормальной" установкой я думаю, что Вы имеете, покончили logger
уже прекрасен.
Самый основной пример драйвера с printk()
был бы:
hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello world\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world\n");
}
Make-файл:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Затем:
$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
[7089996.746366] Hello world
http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 для больше...
На основе модуля Kyle выше:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)
{
char string[256];
count = count < 255 ? count : 255;
if(copy_from_user(string, buffer, count))
return -EFAULT;
string[count] = '\0';
printk(string);
return count;
}
static int __init printk_init(void)
{
struct proc_dir_entry *pk_file;
pk_file = create_proc_entry("printk", 0222, NULL);
if(pk_file == NULL)
return -ENOMEM;
pk_file->write_proc = pk_write;
pk_file->owner = THIS_MODULE;
return 0;
}
static void __exit printk_cleanup(void)
{
remove_proc_entry("printk", NULL);
}
module_init(printk_init);
module_exit(printk_cleanup);
MODULE_LICENSE("GPL");
Сделать printk от пространства пользователя:
echo "Hello" > /proc/printk
Вы можете как root записать в / dev / kmsg
для печати в буфер сообщений ядра:
fixnum:~# echo Some message > /dev/kmsg
fixnum:~# dmesg | tail -n1
[28078118.692242] Some message
Я тестировал это на своем сервере и встроенном Устройство Linux, и оно работает на обоих, поэтому я просто предполагаю, что оно работает практически везде.
@ Ответ Каландоа больше не работает для ядра +3.10. Объединил его код и пример кода, который я нашел здесь . Затем улучшилось качество кода ...
Код сохранен в printk_user.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)
{
char string[256];
count = count < 255 ? count : 255;
if(copy_from_user(string, buffer, count) != 0) {
return -EFAULT;
}
string[count] = '\0';
printk(string);
return count;
}
static const struct file_operations proc_fops = {
.owner = THIS_MODULE,
.write = write_proc,
};
static int proc_init(void) {
struct proc_dir_entry *proc_file;
proc_file = proc_create("printk_user", 0, NULL, &proc_fops);
if(proc_file == NULL) {
return -ENOMEM;
}
return 0;
}
static void proc_cleanup(void) {
remove_proc_entry("printk_user", NULL);
}
MODULE_LICENSE("GPL");
module_init(proc_init);
module_exit(proc_cleanup);
Сделать с использованием этого Makefile
TARGET = printk_user
obj-m := $(TARGET).o
KERNEL_VERSION=$(shell uname -r)
KDIR = /lib/modules/$(KERNEL_VERSION)/build
PWD = $(shell pwd)
printk:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
Мне просто нужны быстрые отладочные сообщения в демоне, написанные кем-то другим в кросс-совместимом ядре. Я столкнулся с ошибкой компиляции при попытке использовать printk
, так как
не мог быть включен. Вместо того чтобы чрезмерно бороться с этим (чтобы сделать это правильно), я обманул и использовал следующий ленивый, но функциональный 5-минутный обходной путь:
void dmesg( const char *tag, const char *msg, const int len )
{
const int TAG_LEN=3;
char buffer[128]={0};
memcpy( &buffer[0], tag, TAG_LEN );
memcpy( &buffer[TAG_LEN], msg, len );
int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
write( fd_kmsg, &buffer, TAG_LEN+len );
close( fd_kmsg );
}
void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }
Подумал, что я бы пошел дальше и включил полномасштабный пример чего-то, что люди могут просто скомпилировать и запустить для тех, кто не так хорошо разбирается в C, основываясь на ответе @BuvinJ
#include <stdio.h>
#include <string.h>
#include <fcntl.h> // open function
#include <unistd.h> // close function
#include "sys/syscall.h"
int main(); // Let's not worry about this for now
void dmesg( const char *tag, const char *msg, const int len )
{
const int TAG_LEN=3;
char buffer[128]={0};
memcpy( &buffer[0], tag, TAG_LEN );
memcpy( &buffer[TAG_LEN], msg, len );
int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
write( fd_kmsg, &buffer, TAG_LEN+len );
close( fd_kmsg );
}
void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }
int main(int argc, char **argv)
{
int getmysize = strlen(argv[1]);
printf("%d\n", getmysize);
printf("To be written: %s\nSize of argument: %d\n", argv[1], getmysize);
// dmesgWarn dmesgInfo or dmesgDebug
dmesgDebug(argv[1], getmysize);
};
Для запуска сохраните указанное выше как kmsg.c и gcc kmsg.c -o kmsg; sudo ./kmsg «строка, которую вы хотите добавить в / dev / kmsg»