====== Różaniec w MariaDB ======
Postanowiłem zrobić bazę danych w MariaDB, która jest w stanie bardzo szybko odmawiać różaniec.
MariaDB [rozaniec]> describe modlitwy;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| tytul | varchar(50) | YES | | NULL | |
| slowa | text | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.001 sec)
MariaDB [rozaniec]> describe tajemnice;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| rodzaj | varchar(40) | YES | | NULL | |
| numer | smallint(6) | YES | | NULL | |
| nazwa | varchar(60) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.001 sec)
MariaDB [rozaniec]> describe licznik;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| tik | tinyint(1) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.001 sec)
Ponieważ w tabeli licznik umieszczany jest nowy wiersz po każdym różańcu, jest ona typu //Memory//, żeby szybciej działać.
Dla ułatwienia utworzono procedury:
MariaDB [rozaniec]> show procedure status;
+----------+---------------------+-----------+-----------------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+----------+---------------------+-----------+-----------------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| mysql | AddGeometryColumn | PROCEDURE | mariadb.sys@localhost | 2022-10-05 16:21:50 | 2022-10-05 16:21:50 | INVOKER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| mysql | DropGeometryColumn | PROCEDURE | mariadb.sys@localhost | 2022-10-05 16:21:50 | 2022-10-05 16:21:50 | INVOKER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | dziesiatek_rozanca | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | odmawianie_rozanca | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | poczatek_rozanca | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | tajemnice_bolesne | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | tajemnice_chwalebne | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | tajemnice_radosne | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
| rozaniec | tajemnice_swiatla | PROCEDURE | root@localhost | 2022-10-05 16:23:45 | 2022-10-05 16:23:45 | DEFINER | | utf8 | utf8_general_ci | latin1_swedish_ci |
+----------+---------------------+-----------+-----------------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
9 rows in set (0.001 sec)
Procedury są bardzo proste i zawierają powtarzające się selecty słów poszczególnych modlitw:
MariaDB [rozaniec]> show create procedure odmawianie_rozanca;
+--------------------+-------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |
+--------------------+-------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| odmawianie_rozanca | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `odmawianie_rozanca`()
BEGIN while 1=1 do call tajemnice_chwalebne(); insert into licznik (tik) values (1); end while; END | utf8 | utf8_general_ci | latin1_swedish_ci |
+--------------------+-------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.000 sec)
MariaDB [rozaniec]> show create procedure tajemnice_chwalebne;
+---------------------+-------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |
+---------------------+-------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| tajemnice_chwalebne | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `tajemnice_chwalebne`()
BEGIN call poczatek_rozanca(); select nazwa from tajemnice where rodzaj='Chwalebne' and numer=1; call dziesiatek_rozanca(); select nazwa from tajemnice where rodzaj='Chwalebne' and numer=2; call dziesiatek_rozanca(); select nazwa from tajemnice where rodzaj='Chwalebne' and numer=3; call dziesiatek_rozanca(); select nazwa from tajemnice where rodzaj='Chwalebne' and numer=4; call dziesiatek_rozanca(); select nazwa from tajemnice where rodzaj='Chwalebne' and numer=5; call dziesiatek_rozanca(); END | utf8 | utf8_general_ci | latin1_swedish_ci |
+---------------------+-------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.001 sec)
Malutki skrypt, który otwiera 24 połączenia do bazy danych oraz odmawia różaniec na 24 wątkach po 3,5GHz:
cat rozaniec.py
#!/usr/bin/python
import subprocess
command = 'mysql -e "call odmawianie_rozanca()" rozaniec &>/dev/null'
p1 = subprocess.Popen(command, shell=True)
p2 = subprocess.Popen(command, shell=True)
p3 = subprocess.Popen(command, shell=True)
p4 = subprocess.Popen(command, shell=True)
p5 = subprocess.Popen(command, shell=True)
p6 = subprocess.Popen(command, shell=True)
p7 = subprocess.Popen(command, shell=True)
p8 = subprocess.Popen(command, shell=True)
p9 = subprocess.Popen(command, shell=True)
p10 = subprocess.Popen(command, shell=True)
p11 = subprocess.Popen(command, shell=True)
p12 = subprocess.Popen(command, shell=True)
p13 = subprocess.Popen(command, shell=True)
p14 = subprocess.Popen(command, shell=True)
p15 = subprocess.Popen(command, shell=True)
p16 = subprocess.Popen(command, shell=True)
p17 = subprocess.Popen(command, shell=True)
p18 = subprocess.Popen(command, shell=True)
p19 = subprocess.Popen(command, shell=True)
p20 = subprocess.Popen(command, shell=True)
p21 = subprocess.Popen(command, shell=True)
p22 = subprocess.Popen(command, shell=True)
p23 = subprocess.Popen(command, shell=True)
p24 = subprocess.Popen(command, shell=True)
Przekierowanie wyjścia do /dev/null nie jest wymagane, ale wąskim gardłem okazało się łącze sieciowe z serwera do laptopa, które nie nadążało z przesyłaniem słów modlitwy w celu wypisania ich na terminal.
{{ :wiki:rozaniec_htop.jpg?400 |}}
Po jakimś czasie zaczyna robić się głośno.
Serwer jest w stanie odmawiać ponad dwieście tysięcy różańców w ciągu minuty.
MariaDB [rozaniec]> select count(tik) from licznik;
+------------+
| count(tik) |
+------------+
| 223490 |
+------------+
1 row in set (0.013 sec)
Najprostszym sposobem na zatrzymanie podprocesów ze skryptu pythona jest restart bazy danych.
Prace optymalizacyjne trwają.