Shared posts

19 Jun 07:07

This incredible magnetic fluid may be the future of biotechnology

by By Monica Nickelsburg

Ferrofluid on Vimeo

This dancing, Flubber-like substance may look like the stuff of science fiction. But it is very real and has some promising scientific applications.

Ferrofluid is composed of iron-containing particles in water or an organic solvent. Magnets are used to manipulate the shape and direction of the fluid. Over the last 50 years, the versatile liquid has found a variety of applications, from loud speakers to intelligent body armor, but new research suggests ferrofluid could also revolutionize medical science. Chris Suprock, an engineer from Suprock Technologies, recently developed...

More
16 Mar 11:24

Anatomy of a “goto fail” – Apple’s SSL bug explained, plus an unofficial patch for OS X!

by Paul Ducklin
Apple just patched an SSL/TLS bug in iOS - but the flaw is not yet fixed in OS X. Paul Ducklin comes to the rescue with explanations, mitigations, and even an unofficial patch! (For educational purposes only, you understand.)
06 Mar 07:27

Keeping Your PHP Code Well Documented - Bruno Škvorc

Introduction Pretty much every PHP developer writes comments along with the actual code. But the language itself doesn’t impose any rules on how to do so. You just have to wrap them around some specific tags and then you can write any content you want. So what exactly should be put in the comment blocks […]

Continue reading %Keeping Your PHP Code Well Documented% by %Jacek Barecki%

05 Mar 07:38

BBC Programme Pages: Content Driven Responsive Redesign (Nicolas Hoizey)

by Nicolas Hoizey
05 Mar 07:13

@emadb: I tell you a secret. When you have difficulties writing a test, the problem isn't in the test but in the code that you are trying to test.

I tell you a secret. When you have difficulties writing a test, the problem isn't in the test but in the code that you are trying to test.
05 Mar 07:00

@francoisz: Why “Simple” Websites Are Scientifically Better http://conversionxl.com/why-simple-websites-are-scientifically-better/ … #UX Surprising facts about e-commerce conversion after redesign

Why “Simple” Websites Are Scientifically Better http://conversionxl.com/why-simple-websites-are-scientifically-better/ … #UX Surprising facts about e-commerce conversion after redesign
04 Mar 22:17

January 2014 on internals@php

by Pascal MARTIN

Cet article est aussi disponible en français.

I’ve been doing a monthly digest of what happens on internals@ for more than a year now, each time in French. Every now and then, some people said it would be nice to have it in English too… So, after last month, here’s my second shot at this!

BTW, here’s the RSS feed of the posts I might write in English.


2014 started by a busy January with 963 messages, which is almost exactly twice the number of mails of the previous month.

As a graph representing the number of mails per month for the last three years, we’d get (the full history since 1998 is available here):

Number of mails on internals@ these last three years


On January 15, Ferenc Kovacs announced he would soon tag PHP 5.6-alpha1 — this version has been published a few days later, on January 24.

The release of this first alpha version means that (in theory) new RFC cannot be proposed for PHP 5.6 anymore. Julien Pauli answered saying that no RFC will be allowed to be merged (into PHP 5.6) once the beta versions phase has started. The first beta version could be published around mid-march.

Adam Harvey has started working on the documentation page Migrating from PHP 5.5.x to PHP 5.6.x.


Some features have been marked as deprecated when PHP 5.5 was released: the /e modifier for preg_replace(), the ext/mysql extension, … According to the release cycle, those deprecated features should be removed from PHP 5.6 (and/or be moved to PECL, for extensions like ext/mysql).

As quickly noted by Andrea Faulds, we can still find a lot of code that uses mysql_*() functions, and moving the corresponding extension to PECL might cause a fair share of problems. That being said, distributions will still be able to provide this extension. Also, many tutorials (and a few well-known software) still using functions that have been deprecated for several years (or functions for which the documentation explicitly said “do not use this”) is not a reason that should stop PHP from evolving.


As some proposals under discussions would have more impact than those landed with PHP 5.3/4/5, Adam Harvey asked if it wouldn’t be time to start thinking about a new major version of PHP — it’s an idea that’s already been spoken about a few time those last months, actually.

As posted by Julien Pauli, going further than just allowing BC-breaking changes, a new major version would also be a great occasion to do some cleaning-up — afterall, PHP 5.0 did introduce a new version of Zend Engine. Ferenc Kovacs noted, as he already said a couple of months ago, that there currently is no defined process about the creation of a new major version.

In order to facilitate the switch to this future version, and to avoid it taking more than 5 years as it did for PHP 5, an idea might be to use the FIG to synchronize a step-up in the PHP version required by the most commonly used frameworks.

Rasmus Lerdorf insisted on the fact that, in his opinion, PHP should remain a pragmatic language, oriented towards the web (the corresponding needs have evolved), loosely typed, and which caters to the skill-levels and platforms of a wide range of users. Unicode support would be a must-have, performances should not be forgotten, and PDO could use some attention. All this is less sexy than new features, but we should not forget that these points meet real needs. Julien Pauli answered with a few ideas he has, such as a threaded VM or enhancements and optimisations at its level.

Andrea Faulds continued with a subject about case-sensibility in PHP: wouldn’t a future major version be an occasion to make things a little more uniform?

In parallel, Rasmus Lerdorf answered on a thread about what some call inconsistency in functions names in PHP and the parameters (and their order) they expect: since the beginning, PHP has been a wrapper for dozens (hundreds now) of libraries. These functions are not specific to PHP: they are known by a great number of developers, not because we use PHP, but because we live in a world written in C — and as soon as we venture outside of the world of PHP and scripting-languages, we fell into that other world. Still, as answered by Larry Garfield, today, only a small number of PHP developers also know C or POSIX… Actually, C is probably the second language of only a very small number of PHP developers. Following this discussion, the skeleton of a new RFC has been set up: RFC: Use alias to provide both legacy and consistent names.

On another side, Pierre Joye started a third thread about PHP 6, where he noted it is important to think about the impact some changes might have in terms of adoption of a future version of the language (an idea that’s been talked about a few times is to avoid getting in the same kind of situation than Python 2 and Python 3).


As people in the community talk more and more about HHVM, zhifeng hu asked if it would be possible to include it in PHP’s code.

Pierre Joye quickly answered that, even if it seems interesting on several counts, there were reasons to not consider this idea for now: HHVM is controlled by a single entreprise, signing a CLA is required in order to be able to participate to its development, and it’s not really portable (it requires GCC). In addition, as noted by Andrea Faulds, HHVM is not a complete implementation of PHP’s features — especially, as answered by Sara Golemon, when it comes to extensions bundled or provided through PECL.

In fact, considering the current state of PHP and HHVM, this proposal could have come a bit in advance — like a year or two.


Sara Golemon has written the RFC: __debugInfo(). It’s goal is to expose debugging informations (already known internally) to user-space — by adding a new magic method called __debugInfo(). This proposal would allow to customize debug output.

Amongst the reactions, some noted that a name such as __dump() might be more explicit for PHP developers who don’t know how the engine works internally, and others remarked this feature should also be added to the Reflection API. It should also be noted that, with such a feature, var_dump() might no longer always tell the truth.


Kevin Ingwersen has revived a thread about the RFC: Named Parameters, written in September 2013 and which had not been discussed much those last weeks.

Many would like to see this kind of feature in PHP — even if others noted we’d have to write more code for function-calls. Actually, named-parameters would mostly help for functions that accept a large number of parameters.

Nikita Popov, author of that RFC, did a quick summary: generally speaking, the main questions all have an answer, and the implementation of this feature is ready. Still, it is required to have a look on all functions exposed by PHP to make sure their parameters definitions are correct (for example, they must have coherent names), and to make sure that parameters parsing works, everywhere, for those same internal functions. Those two points require a great deal of work, and chances are low it’ll be done before PHP 5.6’s feature freeze.


Philip Sturgeon has written the RFC: Array Of, which intends to enhance PHP’s type-hinting, to allow a function to specify it expects an array of elements that are all of a given type. For example:

function test(SplFileObject[] $files) {
  var_dump($files);
}

The firsts reactions seemed to show this idea interested some people — and the subject, with about 100 mails in one week, has been one of the most discussed ones on internals@ this month! It didn’t prevent a few hard reactions or ones underlining that this kind of feature (contrarily to other RFCs that passed in the last months) can already be implemented in PHP or doesn’t quite fit with a part of the language’s philosophy. An answer to some of these opinions has been posted here.

A question that’s been asked rapidly is if it would be possible to specify whether some of the array’s elements might be NULL (which could lead to errors), and with what kind of syntax. Of course, impact on performances should not be forgotten — but would also exist if that kind of verifications was done in user-space.

As a matter of fact, as noted by Julien Pauli a bit later in the conversation, this RFC might highlight the fact PHP lacks a notion of “typed array” — that would go farther than type-checking when passed as a parameter. Even if this RFC was not related to these points, some talked about type-hinting for scalar types and about Generics.

In parallel, Sara Golemon posted a summary of what HHVM accepts for typed-arrays and Generics — the goal being to reach a common syntax and to illustrate a few specific cases they met on their side.

Following this, Philip Sturgeon asked if there was some interest for Generics — which might have some influence on the syntax of Array Of.

By the way, it seems this thread once again highlighted the fact that type-hinting and its possible extensions is still quite a hot matter!


Yasuo Ohgaki has written the RFC: Multibyte Char Handling, in which he proposes to add several new functions to deal with strings using multi-bytes encodings.

Several approaches could be possible, actually: adding some new functions, using the current locale (which seems to be a bad idea), or even adding some kind of encoding parameters to existing functions, as it’s been done for htmlspecialchars().

As noted by Derick Rethans, instead of yet again adding new functions (that PHP developers will need to use when necessary), a better solution would be a real support of Unicode by PHP — like what was planned for PHP 6 several years ago!

Following this discussion, the RFC: Alternative implementation of mbstring using ICU has also been updated.


Anatol Belski announced discussions could begin on RFC: 64 bit platform improvements for string length and integer in zval, as the implementation was going well (there have been around 200 mails on that matter this month!).

Trying to summarize things in a few words: the objective here is to enhance support of 64 bits platforms by PHP (especially under Windows), and this should not have any impact on existing 32 bits platforms.

A non-negligible consequence is that it would be necessary to update all existing extensions to change some function calls (like zend_parse_parameters() and *printf()) and some macro usages. This would require between a few hours and a few days of work for each extension. But there is a real risk, as all extensions, including those developed by companies1 for their internal needs and not made public would have to be updated — and it’s quite probable not all of them will be before PHP 5.6 is released. Because of this, it might be a change too impacting for PHP 5.6.

Votes have been opened at the end of the month; which means results are to be expected for next month. Some first explanations about negative votes insisted on the too great impact of this change for PHP 5.6, and the fact it might be better suited for a future major version.

Following this discussion on 64 bits enhancements, Anatol Belski created the RFC: Removal of dead SAPIs. As Julien Pauli posted, these old SAPI which, for some, date back from the 90s and are not used nor maintained anymore, could be removed.


Right on the first day of this month, Daniel Lowrey annouced the votes had ended on RFC: TLS Peer Verification. With 25 votes “for” and no vote “against”, here’s a security enhancement that will come with PHP 5.6. A few days later, he continued on that subject, with the new RFC: Improved TLS Defaults that complements the previous one.

Ondřej Hošek opened votes on the RFC: ldap_modify_batch, which meant to add a new function to the ldap extension. With 5 votes “for” and 0 vote “against”, it passed and the new function should make it to PHP >= 5.4.

Sara Golemon wrote the RFC: GMP Floating Point Support, by extracting a part of RFC: GMP number as PHP number which has been retired.

The RFC: Argument Unpacking had been submitted to votes at the end of last month. With 32 votes “for” et 2 votes “against”, it passed. This new feature, planned for PHP 5.6, complements RFC: Syntax for variadic functions which passed a few months ago.

Daniel Lowrey has started working on allowing a non-blocking mode for ext/pgsql. About that extension, Yasuo Ohgaki has implemented support for objects bigger than 2 GB (which landed with PostgreSQL 9.3).

Yasuo Ohgaki announced the end of the voting period for RFC: Use default_charset As Default Character Encoding: with 8 votes “for” et 1 vote “against”, it passed. He also indicated working of the RFC: Multibyte Char Handling and that he needed comments on that one.

Dmitry Stogov said he started working on a possible new memory manager for PHP. For now, his prototype only works on Linux (on a non-debug build of PHP), and it seems it could bring a 3% performance gain for Drupal and between 12% and 15% on a portion of code that does a lot of objects constructions.

Sara Golemon wrote the RFC: Module API Inspection, which would add two options to PHP’s command-line, allowing one to determine the version of zend modules accepted by PHP, and the version against which an extension has been compiled. Still, the implemented solution isn’t perfect, and it is possible it might not be accepted.

Andrea Faulds opened votes on RFC: Alphanumeric Decrement. With 21 votes “against” and no vote “for”, its has been unanimously rejected.

The voting period has begun on the RFC: Introduce session options - read_only, unsafe_lock, lazy_write and lazy_destroy. Following this, discussions on the subjects have re-started, and votes have been canceled, as the RFC will be updated.

Finally, right at the end of the month, Gordon Oheim opened votes on RFC: Automatic Property Initialization, which aims to facilitate properties’ initialization when we are writing a constructor, using a syntax like this:

// would assign properties and provide $z as a local variable
public function __construct($this->x, $this->y, $z)
{
    // do something with $z locally
}

We’ll see next month how things end up ;-)



internals@lists.php.net is the mailing-list of the developers of PHP; it is used to discuss the next evolutions of the language and to talk about enhancement suggestions or bug reports.
This mailing-list is public and anyone can subscribe from the page Mailing Lists, or read its archives using HTTP from php.internals or through the news server news://news.php.net/php.internals.



  1. It seems Yahoo might have about 500 PHP extensions PHP internally, according to this mail

04 Mar 21:38

Please, Stop Hashing Passwords Yourself - Brandon Savage

Any web developer writing PHP applications is eventually going to have to store user passwords. Most developers have at least learned that storing a password in plain-text isn’t secure, but for many of us, we still use insecure methods. The problem is, that if our web application is ever hacked, insecure password hashing algorithms will […]
04 Mar 21:29

The “nose in the keyboard” situation

by CommitStrip

04 Mar 08:13

How to monitor ALTER TABLE progress in MySQL

by Nilnandan Joshi

While working on a recent support issue as a Percona Support Engineer,  I got one question from a customer asking how to monitor ALTER TABLE progress. Actually, for MySQL 5.5 and prior versions, it’s quite difficult to ALTER the table in a running production environment especially for large tables (with millions records). Because it will rebuild and lock the table affecting the performance as well as our users. Therefore even if we start ALTER it’s really important to know when it will finish. Even while creating the index, ALTER TABLE will not rebuild the table if fast_index_creation is ON but still it might lock the table.

fast_index_creation feature was introduced in MySQL 5.5 and higher versions. Also available in MySQL 5.1 with the InnoDB Plugin

From MySQL 5.6 and later, “Online DDL” feature has been introduced, which is enhancing many other types of ALTER TABLE operations to avoid “copying the table” and “locking.” It  also allows SELECT, INSERT, UPDATE, and DELETE statements to run while the table is being altered. So in latest version, we can control the copy of file and locking by using ALGORITHM and LOCK options. But even in MySQL 5.6, there are some ALTER operations which still required table rebuild i.e ADD/DROP column, change data type, ADD/DROP primary key etc. You can check table here for more details.

Summary of Online Status for DDL Operations”  http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html

So in any case, if required, we can check the ALTER TABLE progress with below solutions. 

One of the solutions is to use the Percona Toolkit utility, pt-online-schema-change which will ALTER the table without locking it for long time and show the progress. i.e

nilnandan@Dell-XPS:~$ pt-online-schema-change --alter "ADD COLUMN phone INT" u=root,p=root,D=nil,t=nil_test --execute
No slaves found. See --recursion-method if host Dell-XPS has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `nil`.`nil_test`...
Creating new table...
Created new table nil._nil_test_new OK.
Altering new table...
Altered `nil`.`_nil_test_new` OK.
2014-02-07T12:20:54 Creating triggers...
2014-02-07T12:20:54 Created triggers OK.
2014-02-07T12:20:54 Copying approximately 12583349 rows...
Copying `nil`.`nil_test`: 29% 01:12 remain
Copying `nil`.`nil_test`: 60% 00:38 remain
Copying `nil`.`nil_test`: 91% 00:08 remain
2014-02-07T12:22:33 Copied rows OK.
2014-02-07T12:22:33 Swapping tables...
2014-02-07T12:22:33 Swapped original and new tables OK.
2014-02-07T12:22:33 Dropping old table...
2014-02-07T12:22:33 Dropped old table `nil`.`_nil_test_old` OK.
2014-02-07T12:22:33 Dropping triggers...
2014-02-07T12:22:33 Dropped triggers OK.
Successfully altered `nil`.`nil_test`.
nilnandan@Dell-XPS:~$

While using pt-online-schema-change, many times I get questions such as: “What will happen to those data changes (INSERT/UPDATE/DELETE) which are performing during the ALTER TABLE?”

Here, I would like to explain briefly about it. While running pt-online-schema-change, if we will check data dir,

root@Dell-XPS:/var/lib/mysql/nil# ll
total 830524
drwx------ 2 mysql mysql 4096 Feb 7 12:20 ./
drwxr-xr-x 5 mysql mysql 4096 Feb 7 12:05 ../
-rw-rw---- 1 mysql mysql 65 Jan 31 12:12 db.opt
-rw-rw---- 1 mysql mysql 8616 Feb 7 12:06 nil_test.frm
-rw-rw---- 1 mysql mysql 822083584 Feb 7 12:18 nil_test.ibd
-rw-rw---- 1 mysql mysql 8648 Feb 7 12:20 _nil_test_new.frm
-rw-rw---- 1 mysql mysql 28311552 Feb 7 12:20 _nil_test_new.ibd
-rw-rw---- 1 mysql mysql 944 Feb 7 12:20 nil_test.TRG
-rw-rw---- 1 mysql mysql 40 Feb 7 12:20 pt_osc_nil_nil_test_del.TRN
-rw-rw---- 1 mysql mysql 40 Feb 7 12:20 pt_osc_nil_nil_test_ins.TRN
-rw-rw---- 1 mysql mysql 40 Feb 7 12:20 pt_osc_nil_nil_test_upd.TRN

We can see that it will create triggers (separate trigger for INSERT, UPDATE and DELETE) on the original table to update corresponding rows to the new table( _nil_test_new). So any modifications happened to the data in original tables during the copy, will be reflected in the new table.

NOTE: This tool will not work if any triggers are already defined on the table.

But what if we don’t want to use pt-online-schema-change and run regular ALTER TABLE on mysql prompt? After some research I found many ways to calculate the progress of ALTER TABLE specially with innodb_file_per_table is ON. (innodb_file_per_table is ON by default in MySQL 5.6.)

  • Calculate the progress by checking the size of temporary tablespace. 

With innodb_file_per_table=1,when we are running ALTER TABLE, innodb creates a temporary tablespace within the same data directory with random name starting from #sql ending with .ibd like #sql-1c80_27.ibd. i.e

root@Dell-XPS:/var/lib/mysql/nil# ll                    
...
-rw-rw---- 1 mysql mysql 8682 Feb 7 13:33 nil_test.frm
-rw-rw---- 1 mysql mysql 335544320 Feb 7 13:34 nil_test.ibd
-rw-rw---- 1 mysql mysql 8716 Feb 7 13:35 #sql-1c80_27.frm
-rw-rw---- 1 mysql mysql 23068672 Feb 7 13:35 #sql-1c80_27.ibd

While altering table, innodb reads original ibd file like nil_test.ibd and writes new pages to #sql-1c80_27.ibd. So with file size of nil_test.ibd and temporary #sql-1c80_27.ibd , we can check the ALTER TABLE progress with something like, 

#!/bin/bash
while true
do
A=`du -m '#sql'*'.ibd' 2>/dev/null|cut -f 1`;
# if $A -lt 0 ;
if [[ -z "$A" ]] ;
then
echo "Done";
exit 0 ;
fi
TABLENAME='nil_test';
TT=$TABLENAME.ibd;
B=`du -m $TT |cut -f 1`;
echo "ALTER TABLE $TABLENAME...$A MB written to tmp tablespace out of $B MB";
sleep 10
done

When we run ALTER on mysql, we can simply run this script in data dir and check the progress like,

mysql> ALTER TABLE nil_test ADD COLUMN phone int;
Query OK, 7582912 rows affected (58.54 sec)
Records: 7582912 Duplicates: 0 Warnings: 0
root@Dell-XPS:/var/lib/mysql/nil# ./alter_table_monitor.sh
ALTER TABLE nil_test...23 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...73 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...121 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...173 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...225 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...277 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...333 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...381 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...433 MB written in tmp file out of 485 MB
ALTER TABLE nil_test...481 MB written in tmp file out of 485 MB
Done
root@Dell-XPS:/var/lib/mysql/nil#

There are couple of things which we need to consider while using this script.

  1. We have to change script with $TABLENAME as per your requirement. It will work for only one ALTER TABLE.
  2. Script should run from database dir (i.e /var/lib/mysql/nil)
  3. This calculations are an approximation, because new table can be a bit different in size. For example, deleted rows or fragmentation can cause accuracy problems. 

I would like to mention here that we cannot check the progress of every ALTER TABLE with the above formula. For example, with fast_index_creation, It will create the table without any secondary indexes, then adding the secondary indexes after the data is loaded so it will not create temp tablespace (.ibd file) while creating secondary index. This process is very interesting, let me explain here.

When we add secondary index with ‘fast_index_creation‘, it will only create #sql***.frm file to update table structure but not temporary .ibd file. It will do some file sorts and then add directly index to original table.ibd file. so when you monitors those files, initially you didn’t see that file size increasing, but after some time (after files sorts) file size starts increasing till the end of ALTER TABLE. i.e

Initially, you’ll see

root@Dell-XPS:/var/lib/mysql/nil# ll
total 409644
drwx------ 2 mysql mysql 4096 Feb 12 10:50 ./
drwxr-xr-x 5 mysql mysql 4096 Feb 12 10:10 ../
-rwxr-xr-x 1 root root 306 Feb 7 13:35 alter_table_monitor.sh*
-rw-rw---- 1 mysql mysql 65 Jan 31 12:12 db.opt
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:26 nil_test.frm
-rw-rw---- 1 mysql mysql 419430400 Feb 12 10:50 nil_test.ibd
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:50 #sql-671_25.frm
...
root@Dell-XPS:/var/lib/mysql/nil# ll
total 409644
drwx------ 2 mysql mysql 4096 Feb 12 10:50 ./
drwxr-xr-x 5 mysql mysql 4096 Feb 12 10:10 ../
-rwxr-xr-x 1 root root 306 Feb 7 13:35 alter_table_monitor.sh*
-rw-rw---- 1 mysql mysql 65 Jan 31 12:12 db.opt
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:26 nil_test.frm
-rw-rw---- 1 mysql mysql 419430400 Feb 12 10:50 nil_test.ibd
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:50 #sql-671_25.frm

Then suddenly .ibd file size starts increasing…till end.

root@Dell-XPS:/var/lib/mysql/nil# ll
total 417836
drwx------ 2 mysql mysql 4096 Feb 12 10:50 ./
drwxr-xr-x 5 mysql mysql 4096 Feb 12 10:10 ../
-rwxr-xr-x 1 root root 306 Feb 7 13:35 alter_table_monitor.sh*
-rw-rw---- 1 mysql mysql 65 Jan 31 12:12 db.opt
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:26 nil_test.frm
-rw-rw---- 1 mysql mysql 427819008 Feb 12 10:50 nil_test.ibd
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:50 #sql-671_25.frm
....
root@Dell-XPS:/var/lib/mysql/nil# ll
total 487456
drwx------ 2 mysql mysql 4096 Feb 12 10:51 ./
drwxr-xr-x 5 mysql mysql 4096 Feb 12 10:10 ../
-rwxr-xr-x 1 root root 306 Feb 7 13:35 alter_table_monitor.sh*
-rw-rw---- 1 mysql mysql 65 Jan 31 12:12 db.opt
-rw-rw---- 1 mysql mysql 8750 Feb 12 10:50 nil_test.frm
-rw-rw---- 1 mysql mysql 499122176 Feb 12 10:51 nil_test.ibd
root@Nil-Dell-XPS:/var/lib/mysql/nil#

This will happen if there is only one secondary index. If there are multiple secondary indexes then for each index, process will pause, do file sorts and then add index so the number of pauses in file size increases, will be equal to number of secondary indexes.

  • Calculate the progress by checking the records in information_schema.GLOBAL_TEMPORARY_TABLES 

When the ALTER TABLE is running, we can also check GLOBAL_TEMPORARY_TABLES in information_schema and it will give you records count which are inserted in temporary table. i.e

mysql> select * from GLOBAL_TEMPORARY_TABLES \G;
*************************** 1. row ***************************
SESSION_ID: 38
TABLE_SCHEMA: nil
TABLE_NAME: #sql-1c80_27
ENGINE: InnoDB
NAME: #sql-696_26
TABLE_ROWS: 623711
AVG_ROW_LENGTH: 42
DATA_LENGTH: 26787840
INDEX_LENGTH: 0
CREATE_TIME: 2014-02-11 10:37:34
UPDATE_TIME: NULL
1 row in set (0.00 sec)
.......
mysql> select * from GLOBAL_TEMPORARY_TABLES \G;
*************************** 1. row ***************************
SESSION_ID: 38
TABLE_SCHEMA: nil
TABLE_NAME: #sql-1c80_27
ENGINE: InnoDB
NAME: #sql-696_26
TABLE_ROWS: 7017408
AVG_ROW_LENGTH: 42
DATA_LENGTH: 299663360
INDEX_LENGTH: 0
CREATE_TIME: 2014-02-11 10:37:34
UPDATE_TIME: NULL
1 row in set (0.01 sec)

  •  Calculate the progress by checking the Handler_read_rnd_next status variable (global counters).  

While running ALTER TABLE, we can also check the handler_read_rnd_next status variable by “SHOW GLOBAL STATUS LIKE ‘Handler_read_rnd%’ OR mysqladmin extended. Check this 2008 post titled “How to estimate query completion time in MySQL” by Baron Schwartz. He describes it very well.

NOTE: This won’t need innodb_file_per_table = ON  but we can use this option only when there are no other parallel transactions running.

So normally in any case, it will become really difficult to find the ALTER TABLE progress unless MySQL itself will provide some feature like MariaDB is providing progress in “SHOW PROCESSLIST”  https://mariadb.com/kb/en/show-processlist/

I’ve installed MariaDB 5.5 locally and tried to check, along with “SHOW PROCESSLIST”, you can also check progress by running query against information_schema.processlist table. But I observed that progress time is different in both the output.  It looks like information_schema.processlist table gives accurate progress for ALTER TABLE.

[root@percona-pxc3 nil]# mysql -uroot -proot -e "select ID, USER, HOST, DB, TIME, STATE, INFO, STAGE, MAX_STAGE, PROGRESS from information_schema.processlist where ID = 2; show processlist"
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
| ID | USER | HOST | DB | TIME | STATE | INFO | STAGE | MAX_STAGE | PROGRESS |
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
| 2 | root | localhost | nil | 3 | copy to tmp table | ALTER TABLE nil_test ADD COLUMN phone1 int | 1 | 2 | 4.279 |
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
| 2 | root | localhost | nil | Query | 3 | copy to tmp table | ALTER TABLE nil_test ADD COLUMN phone1 int | 2.140 |
| 29 | root | localhost | NULL | Query | 0 | NULL | show processlist | 0.000 |
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
[root@percona-pxc3 nil]#
...............
...........
[root@percona-pxc3 nil]# mysql -uroot -proot -e "select ID, USER, HOST, DB, TIME, STATE, INFO, STAGE, MAX_STAGE, PROGRESS from information_schema.processlist where ID = 2; show processlist"
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
| ID | USER | HOST | DB | TIME | STATE | INFO | STAGE | MAX_STAGE | PROGRESS |
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
| 2 | root | localhost | nil | 25 | copy to tmp table | ALTER TABLE nil_test ADD COLUMN phone1 int | 1 | 2 | 45.613 |
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
| 2 | root | localhost | nil | Query | 25 | copy to tmp table | ALTER TABLE nil_test ADD COLUMN phone1 int | 22.807 |
| 34 | root | localhost | NULL | Query | 0 | NULL | show processlist | 0.000 |
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
[root@percona-pxc3 nil]#
..............
.........
[root@percona-pxc3 nil]# mysql -uroot -proot -e "select ID, USER, HOST, DB, TIME, STATE, INFO, STAGE, MAX_STAGE, PROGRESS from information_schema.processlist where ID = 2; show processlist"
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
| ID | USER | HOST | DB | TIME | STATE | INFO | STAGE | MAX_STAGE | PROGRESS |
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
| 2 | root | localhost | nil | 54 | copy to tmp table | ALTER TABLE nil_test ADD COLUMN phone1 int | 1 | 2 | 98.300 |
+----+------+-----------+------+------+-------------------+--------------------------------------------+-------+-----------+----------+
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
| 2 | root | localhost | nil | Query | 54 | copy to tmp table | ALTER TABLE nil_test ADD COLUMN phone1 int | 49.157 |
| 39 | root | localhost | NULL | Query | 0 | NULL | show processlist | 0.000 |
+----+------+-----------+------+---------+------+-------------------+--------------------------------------------+----------+
[root@percona-pxc3 nil]#
[root@percona-pxc3 nil]# mysql -uroot -proot -e "select ID, USER, HOST, DB, TIME, STATE, INFO, STAGE, MAX_STAGE, PROGRESS from information_schema.processlist where ID = 2; show processlist"
+----+------+-----------+------+------+-------+------+-------+-----------+----------+
| ID | USER | HOST | DB | TIME | STATE | INFO | STAGE | MAX_STAGE | PROGRESS |
+----+------+-----------+------+------+-------+------+-------+-----------+----------+
| 2 | root | localhost | nil | 0 | | NULL | 0 | 0 | 0.000 |
+----+------+-----------+------+------+-------+------+-------+-----------+----------+
+----+------+-----------+------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------+------+---------+------+-------+------------------+----------+
| 2 | root | localhost | nil | Sleep | 1 | | NULL | 0.000 |
| 40 | root | localhost | NULL | Query | 0 | NULL | show processlist | 0.000 |
+----+------+-----------+------+---------+------+-------+------------------+----------+
[root@percona-pxc3 nil]#

Conclusion: As we know, some ALTER TABLE can cause problems like server hang or crash. So whenever we are planning to run it on productions servers, it has to be well planned. As MySQL doesn’t provide a “progress bar,” we can use the above explained methods to check progress. If anyone knows of any other method aside from the above then please share in the comments and I would glad to add it in this post.

The post How to monitor ALTER TABLE progress in MySQL appeared first on MySQL Performance Blog.


PlanetMySQL Voting: Vote UP / Vote DOWN
03 Mar 00:01

BYOD : le nouveau champ de bataille pour la valeur du DSI

La diplomatie et le compromis ne peuvent pas l'emporter pour la pertinence du DSI. L'entité informatique doit adopter l'innovation et une approche centrée sur les utilisateurs vis-à-vis de la technologie si elle veut survivre.
02 Mar 23:44

Windows 8 : une interface pensée pour les utilisateurs occasionnels ?

Pourquoi l’interface de Windows 8 divise-t-elle autant les utilisateurs ? Un salarié de Microsoft, Jacob Miller, avance des explications et décrit comment l’éditeur serait parvenu à un compromis destiné à séduire d’abord les utilisateurs peu avertis.
02 Mar 23:24

HTTP/2 : une évolution importante du protocole du web, notamment pour les mobiles

Le protocole HTTP a 20 ans. On a récemment parlé de son évolution HTTP/2 avec la possibilité de chiffrer systématiquement les échanges sur le web, mais cela va bien au-delà et pourrait constituer une évolution importante, notamment pour les mobiles.
02 Mar 23:10

Qui dirige Internet ? Les explications de l'ICANN

Alors que sa filiation au gouvernement américain est de plus en plus critiquée, l'ICANN propose une infographie pour savoir qui dirige Internet dans le monde.

Surnommé le "réseau des réseaux", Internet est né de la rencontre entre le réseau ARPANET (voulu par la DARPA) et plusieurs autres concepts identiques (réseau CYCLADES, projet RAND, NPL...). Aujourd'hui, la connexion à ce vaste système se fait pour le grand public via les fournisseurs d'accès. 

Il existe toutefois une multitude d'intervenants qui participent à la gestion du réseau des réseaux. Ensemble, ils s'occupent d'Internet : ils font du conseil, se chargent des opérations, produisent des normes, élaborent des politiques, éduquent ou effectuent des recherches. C'est parce que le net mobilise une pléthore d'acteurs que l'ICANN a mis en ligne une infographie expliquant "qui dirige Internet".

"Internet est en soi un réseau d'ordinateurs répartis à l'échelle mondiale comprenant de nombreux réseaux autonomes volontairement interconnectés", explique la société pour l'attribution des noms de domaine et des numéros sur Internet (ICANN, en anglais), elle-même partie prenante de l'évolution du réseau.

"De même, sa direction relève d'un réseau pluripartite décentralisé et international de groupes autonomes interconnectés provenant de la société civile, le secteur privé, les gouvernements, les communautés académiques et scientifiques ainsi que des organisations nationales et internationales", ajoute-t-elle.

"Ils travaillent en coopération selon leurs fonctions respectives pour créer des politiques et des normes partagées entretenant l'interopérabilité mondiale d'Internet pour le bien public".

Outre l'ICANN, interviennent l'IAB (Internet Architecture Board), l'IETF (Internet Engineering Task Force), l'IGF (forum sur la gouvernance d'Internet), l'IRTF (Internet Research Task Force), l'ISOC (Internet Society), les registres Internet régionaux, le W3C (World Wide Web Consortium)... et d'autres encore, que vous retrouverez dans l'infographie, avec des explications et une légende pour chaque acteur.

L'ICANN précise que l'infographie est surtout destinée à fournir une "vue d'ensemble" de la situation et qu'elle ne prétend pas être absolument exhaustive. L'infographie est publiée selon le contrat Creative Commons BY-SA.

02 Mar 15:36

OpenKnit : un métier à tisser open-source

by Auré

Probablement inspirés par le succès des imprimantes 3D, Mar Canet et Varvara Guljajeva sont à l’origine du projet OpenKnit qui n’est autre qu’un métier à tisser dont les plans de constructions sont en libre accès et devrait permettre à quiconque de fabriquer leur propre machine.

L’OpenKnit est donc une machine qui (pour un coût inférieur à 550 €) devrait permettre à ses utilisateurs de concevoir leurs vêtements en entrant simplement leurs instructions dans un contrôleur Arduino. Créer, partager ou télécharger des vêtements imaginés par d’autres deviendrait alors un jeu enfant en particulier grâce à l’utilisation de fichiers .STL (un format également utilisé pour l’impression 3D). À noter que pour le modèle actuel, il vous faudra patienter une heure pour obtenir un pull.

Bien que les vêtements obtenus manquent de finesse et que le métier à tisser nécessite d’avoir un peu de place chez soi, le projet OpenKnit laisse présager un bel avenir et est décrit comme une solution alternative à la production de masse par ses concepteurs.

Nous noterons enfin qu’OpenKnit est basé sur le modèle open-source RepRap.

openknit
Lire la suite..

02 Mar 15:26

Vincent Bernat: TCP TIME-WAIT & les serveurs Linux à fort trafic

En bref : n’activez pas net.ipv4.tcp_tw_recycle !

La documentation du noyau Linux n’est pas très prolixe sur les effets de net.ipv4.tcp_tw_recycle :

Active le reyclage rapide des connexions dans l’état TIME-WAIT. La valeur par défaut est 0. Elle ne doit pas être changé sans en aviser vos experts techniques.

Son petit frère, net.ipv4.tcp_tw_reuse, est à peine mieux documenté :

Autoriser la réutilisation des connexions dans l’état TIME-WAIT pour les nouvelles connexions quand cela ne pose pas de problème du point de vue du protocole. La valeur par défaut est 0. Elle ne doit pas être changé sans en aviser vos experts techniques.

Le manque de documentation à ce sujet a conduit à l’apparition de très nombreux guides conseillant d’activer ces deux paramètres afin de se débarasser des entrées dans l’état TIME-WAIT. Toutefois, comme indiqué dans la page de manuel tcp(7), l’option net.ipv4.tcp_tw_recycle peut s’avérer problématique car elle présente des difficultés à gérer correctement des clients derrière une même IP. Ce problème est particulièrement difficile à diagnostiquer quand il survient :

Active le recyclage rapide des connexions dans l’état TIME-WAIT. Activer cette option n’est pas recommandé car elle cause des problèmes avec la translation d’adresses (NAT).

Dans l’espoir de renverser la tendance, je fournis ici une explication plus détaillée sur le fonctionnement de l’état TIME-WAIT dans Linux.

xkcd illustration

À noter que malgré la présence de ipv4 dans le nom des options, celles-ci s’appliquent également à IPv6. Gardez de plus à l’esprit que nous nous intéressons à la pile TCP de Linux qui n’a quasiment aucun lien avec le suivi de connexions de Netfilter1.

À propos de l’état TIME-WAIT

Commençons d’abord par comprendre comment fonctionne l’état TIME-WAIT et les problèmes qu’il peut poser. Regardons le diagramme d’état TCP ci-dessous2 :

Diagramme d'état TCP

Seul l’hôte fermant la connexion en premier se retrouve dans l’état TIME-WAIT. L’autre pair suit un chemin qui conduit généralement à la libération complète et rapide de la connexion.

La commande ss -tan permet d’observer l’état de toutes les connexions sur le système :

$ ss -tan | head -5
LISTEN     0  511             *:80              *:*     
SYN-RECV   0  0     192.0.2.145:80    203.0.113.5:35449
SYN-RECV   0  0     192.0.2.145:80   203.0.113.27:53599
ESTAB      0  0     192.0.2.145:80   203.0.113.27:33605
TIME-WAIT  0  0     192.0.2.145:80   203.0.113.47:50685

Mission

L’état TIME-WAIT a deux buts :

  • Le premier est d’empêcher les segments en retard d’être acceptés dans une connexion utilisant le même quadruplet (adresse source, port source, adresse cible, port cible). La RFC 1337 explique en détail ce qui peut arriver si l’état TIME-WAIT ne joue pas son rôle. Voici un exemple de ce qui peut être évité si l’état TIME-WAIT n’est pas raccourci :

Segments dupliqués acceptés dans une autre connexion

  • Le second but est d’assurer que l’hôte distant a bien fermé la connexion. Lorsque que le dernier ACK est perdu, l’hôte distant reste dans l’état LAST-ACK3. Si l’état TIME-WAIT n’existait pas, une connexion vers cet hôte pourrait être tentée. Le segment SYN peut alors être accueilli avec un RST. La nouvelle connexion se termine alors avec une erreur :

Dernier ACK perdu

La RFC 793 demande à ce que l’état TIME-WAIT dure au moins deux fois le MSL. Sur Linux, cette durée n’est pas configurable. Elle est définie dans include/net/tcp.h et vaut une minute :

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
                                  * state, about 60 seconds     */

Il y a eu des propositions pour rendre ce paramètre configurable mais celles-ci ont été rejetées en raison de la nécessité de conserver le bon fonctionnement de l’état TIME-WAIT.

Problèmes

Voyons maintenant pourquoi cet état peut devenir ennuyeux sur un serveur gérant de nombreuses connexions. Il y a trois aspects à considérer :

  • l’entrée prise dans la table des connexions et empêchant de nouvelles connexions,
  • la mémoire occupée par la socket dans le noyau,
  • l’usage CPU additionnel.

Le résultat de la commande ss -tan state time-wait | wc -l n’est pas un problème en soi !

Table des connexions

Une connexion dans l’état TIME-WAIT est gardée pendant une minute dans la table des connexions. Cela signifie qu’une connexion avec le même quadruplet (adresse source, port source, adresse destination, port destination) ne peut pas exister.

Pour un serveur web, l’adresse destination et le port destination sont constants. Si ce serveur se situe en plus derrière un répartiteur de charge L7, l’adresse IP source est également constante. Linux alloue par défaut les ports pour les connexions sortantes dans un intervalle d’environ 30 000 ports (cela se règle en modifiant net.ipv4.ip_local_port_range). Chaque minute, au plus 30 000 connexions peuvent donc être établies vers le serveur web, soit environ 500 connexions par seconde.

Si l’état TIME-WAIT se situe côté client, une telle situation se détecte facilement. L’appel à connect() retourne EADDRNOTAVAIL et l’application va journaliser l’erreur. Côté serveur, la situation est plus complexe à décéler. Dans le doute, il convient de savoir mesurer s’il y a saturation des quadruplets disponibles :

$ ss -tan 'sport = :80' | awk '{print $(NF)" "$(NF-1)}' | \
>     sed 's/:[^ ]*//g' | sort | uniq -c
    696 10.24.2.30 10.33.1.64
   1881 10.24.2.30 10.33.1.65
   5314 10.24.2.30 10.33.1.66
   5293 10.24.2.30 10.33.1.67
   3387 10.24.2.30 10.33.1.68
   2663 10.24.2.30 10.33.1.69
   1129 10.24.2.30 10.33.1.70
  10536 10.24.2.30 10.33.1.73

La solution à ces problèmes est d’utiliser plus de quadruplets4. Il y a plusieurs solutions (par ordre de difficulté) :

  • utiliser plus de ports clients en modifiant net.ipv4.ip_local_port_range,
  • utiliser plus de ports serveurs en configurant le serveur web pour écouter sur des ports supplémentaires (81, 82, 83, …),
  • utiliser plus d’IP clients en configurant des IP supplémentaires sur le répartiteur de charge et en les utilisant l’une après l’autre,
  • utiliser plus d’IP serveurs en configurant des IP supplémentaires sur le serveur web5.

Une dernière solution est de modifier net.ipv4.tcp_tw_reuse et net.ipv4.tcp_tw_recycle. Patientez encore un peu, nous y arriverons plus tard.

Mémoire

Avec beaucoup de connexions à gérer, garder des entrées inactives pendant une minute occupe de la mémoire. Par exemple, si un serveur gère 10 000 connexions par seconde, il peut y avoir en permanence 600 000 entrées TIME-WAIT. Quelle quantité de mémoire cela représente-t’il ? Pas tant que ça.

Tout d’abord, côté applicatif, une connexion en TIME-WAIT n’existe plus. Elle a été fermée. Dans le noyau, une connexion dans l’état TIME-WAIT est matérialisée à trois endroits pour trois usages différents :

  1. La table de hachage des connexions, appelée la « table des connexions TCP établies » (bien qu’elle contienne des connexions dans un autre état), permet de localiser une connexion existante lors, par exemple, de la réception d’un nouveau segment.

    Chaque entrée de cette table pointe sur deux listes : une liste des connexions dans l’état TIME-WAIT et une liste des connexions dans un autre état. La taille de cette table dépend de la quantité de mémoire sur le système et est indiquée lors du démarrage :

    $ dmesg | grep "TCP established hash table"
    [    0.169348] TCP established hash table entries: 65536 (order: 8, 1048576 bytes)
    

    Il est possible de spécifier soi-même la taille avec le paramètre thash_entries.

    Chaque élément de la liste des connexions dans l’état TIME-WAIT est de type struct tcp_timewait_sock, tandis que les élements de l’autre liste sont de type struct tcp_sock6 :

    struct tcp_timewait_sock {
        struct inet_timewait_sock tw_sk;
        u32    tw_rcv_nxt;
        u32    tw_snd_nxt;
        u32    tw_rcv_wnd;
        u32    tw_ts_offset;
        u32    tw_ts_recent;
        long   tw_ts_recent_stamp;
    };
    
    struct inet_timewait_sock {
        struct sock_common  __tw_common;
    
        int                     tw_timeout;
        volatile unsigned char  tw_substate;
        unsigned char           tw_rcv_wscale;
        __be16 tw_sport;
        unsigned int tw_ipv6only     : 1,
                     tw_transparent  : 1,
                     tw_pad          : 6,
                     tw_tos          : 8,
                     tw_ipv6_offset  : 16;
        unsigned long            tw_ttd;
        struct inet_bind_bucket *tw_tb;
        struct hlist_node        tw_death_node;
    };
    
  2. Un ensemble de listes de connexions appelé le « couloir de la mort ». Il est utilisé pour expirer les connexions dans l’état TIME-WAIT. Les connexions sont ordonnées suivant la date d’expiration.

    Ces connexions utilisent le même espace mémoire que pour les entrées dans la table de hachage décrite au point précédent. Il s’agit du membre struct hlist_node tw_death_node.

  3. Une table de hachage des ports locaux utilisés permet de déterminer ou de trouver rapidement un port local pour une nouvelle connexion. La taille de cette table est la même que la table de hachage des connexions :

    $ dmesg | grep "TCP bind hash table"
    [    0.169962] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
    

    Chaque élément est de type struct inet_bind_socket qui correspond à un port local. Une connexion dans l’état TIME-WAIT vers un serveur web correspond au port local 80 et partage donc son entrée avec les autres connexions du même type. D’un autre côté, chaque connexion sortante utilise un port local aléatoire et ne partage donc généralement pas son entrée.

Chaque connexion (entrante ou sortante) a donc besoin d’un struct tcp_timewait_sock De plus, chaque connexion sortante est attachée à un struct inet_bind_socket dédié.

La taille d’un struct tcp_timewait_sock est de 168 octets tandis qu’un struct inet_bind_socket occupe 48 octets :

$ sudo apt-get install linux-image-$(uname -r)-dbg
[...]
$ gdb /usr/lib/debug/boot/vmlinux-$(uname -r)
(gdb) print sizeof(struct tcp_timewait_sock)
 $1 = 168
(gdb) print sizeof(struct tcp_sock)
 $2 = 1776
(gdb) print sizeof(struct inet_bind_bucket)
 $3 = 48

Ainsi, 40 000 connexions entrantes dans l’état TIME-WAIT occupent environ 10 Mo alors que 40 000 connexions sortantes occupent en plus 2,5 Mo. L’utilitaire slabtop permet de confirmer ce calcul. Voyez ce qui est indiqué pour un serveur avec 50 000 connexions dans l’état TIME-WAIT dont 45 000 connexions sortantes :

$ sudo slabtop -o | grep -E '(^  OBJS|tw_sock_TCP|tcp_bind_bucket)'
  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 50955  49725  97%    0.25K   3397       15     13588K tw_sock_TCP            
 44840  36556  81%    0.06K    760       59      3040K tcp_bind_bucket

Il n’y a rien à modifier ici : la mémoire occupée par les connexions dans l’état TIME-WAIT est très faible. Si votre serveur doit gérer des milliers de nouvelles connexions par seconde, la mémoire nécessaire pour pouvoir pousser efficacement les données rend la présence des connexions dans l’état TIME-WAIT négligeable.

CPU

Coté CPU, la recherche d’un port local de libre est effectué par la fonction inet_csk_get_port() qui emploie un verrou et utilise la table de hachage des ports locaux jusqu’à trouver un port libre. Un très grand nombre d’entrées dans cette table n’impacte généralement pas les performances car si les connexions sont relativement homogènes, cette fonction parcourt les ports locaux de manière séquentielle et retourne donc rapidement un résultat.

Autres solutions

Arrivé à ce point, si vous pensez toujours avoir un problème avec l’état TIME-WAIT, il existe trois autres solutions :

  • désactiver le socket lingering,
  • net.ipv4.tcp_tw_reuse,
  • net.ipv4.tcp_tw_recycle.

Socket lingering

Lorsque close() est appelé, les octets restants dans le noyau seront envoyées en tâche de fond et la connexion terminera dans l’état TIME-WAIT. L’application récupère immédiatement la main avec la certitude que les données finiront par être livrées.

Toutefois, une application peut désactiver ce comportement (connu sous le nom socket lingering). Il y a deux possibilités :

  1. La première est de désactiver entièrement le mécanisme. Les données restantes seront perdues et la connexion est terminée par l’envoi d’un segment RST. L’hôte distant détectera alors une erreur. La connexion ne passera pas par l’état TIME-WAIT.

  2. La seconde est d’attendre un certain temps que les données soient livrées et seulement ensuite de casser la connexion comme dans le point précédent. L’appel à close() est alors bloquant jusqu’à ce que les données soient livrées ou que le délai défini soit écoulé. Il est possible d’éviter ce bloquage en passant la connexion en mode non bloquant. Le processus s’effectue alors en tâche de fond. Si les données sont livrées avec succès, la connexion passera dans l’état TIME-WAIT. Dans le cas contraire, un segment RST sera envoyé et les données seront perdues.

Dans les deux cas, désactiver le socket lingering n’est pas une solution universelle. Certaines applications telles que HAProxy ou Nginx peuvent employer sous certaines conditions une telle technique mais cela n’est pas systématique.

net.ipv4.tcp_tw_reuse

L’état TIME-WAIT permet d’éviter que des segments en retard ne soient acceptés dans une connexion différente. Toutefois, sous certaines conditions, il est possible de différencier de manière certaine les segments d’une connexion précédente des segments d’une connexion actuelle.

La RFC 1323 introduit un ensemble d’extensions pour améliorer les performances de TCP. Parmi celles-ci, on trouve l’horodatage sous forme de deux marqueurs : l’un correspond à l’horloge de l’expéditeur et l’autre au marqueur le plus récent reçu par ce dernier.

En activant net.ipv4.tcp_tw_reuse, Linux va réutiliser une connexion dans l’état TIME-WAIT pour une nouvelle connexion sortante à condition que la date soit strictement plus grande que la dernière date utilisée pour l’ancienne connexion (ce qui correspond le plus souvent à une seconde de différence).

Est-ce sûr ? Le premier but de l’état TIME-WAIT est d’éviter que des segments dupliqués soient acceptés dans une connexion différente. L’usage de l’horodatage permet d’éviter ce problème car les segments en question arriveront avec un marqueur trop vieux et seront ignorés.

Le second but est de s’assurer que l’hôte distant ne se trouve pas dans l’état LAST-ACK suite à la perte du dernier segment ACK. L’hôte distant retransmet le segment FIN jusqu’à ce qu’une des conditions suivantes se réalise :

  1. expiration de l’état
  2. réception du segment ACK attendu
  3. réception d’un segment RST

Dans tous les cas, la connexion est ensuite détruite. Si les segments FIN ainsi envoyés sont reçus alors que l’état TIME-WAIT existe toujours, le ACK attendu sera retransmis.

Lorsque l’état TIME-WAIT est remplacé par une nouvelle connexion, l’horodatage garantit que le segment SYN de la nouvelle connexion sera ignoré et qu’un nouveau segment FIN sera renvoyé. Ce segment FIN arrivant pour une connexion désormais dans l’état SYN-SENT, il recevra en réponse un segment RST qui permettra de sortir de l’état LAST-ACK. Le segment SYN initialement ignoré sera retransmis au bout d’une seconde (car il n’a pas eu de réponse) et la connexion sera alors établie sans erreur apparente en dehors du délai d’une seconde :

Dernier ACK perdu et réutilisation du TIME-WAIT

À noter que chaque connexion ainsi réutilisée implique l’incrément du compteur TWRecycled (malgré son nom).

net.ipv4.tcp_tw_recycle

Ce mécanisme s’appuie également sur l’horodatage des segments mais influence à la fois les connexions entrantes et les connexions sortantes ce qui est utile quand les états TIME-WAIT s’accumulent côté serveur7.

L’état TIME-WAIT va expirer plus tôt : il sera supprimé après écoulement du délai de retransmission (RTO) qui est calculé à partir du RTT et de sa variance. Les valeurs en question peuvent être obtenues pour les connexions en cours avec la commande ss :

$ ss --info  sport = :2112 dport = :4057
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port   
ESTAB      0      1831936   10.47.0.113:2112          10.65.1.42:4057    
         cubic wscale:7,7 rto:564 rtt:352.5/4 ato:40 cwnd:386 ssthresh:200 send 4.5Mbps rcv_space:5792

Afin de garantir les mêmes propriétés fournies par l’état TIME-WAIT tout en gardant cet état moins longtemps, quand une connexion atteint l’état TIME-WAIT, le dernier horodatage observé est enregistré dans une structure dédiée avec l’IP de l’hôte distant concerné. Linux ignorera alors pendant une minute tout segment provenant d’un hôte connu mais dont l’horodatage est en contradiction avec la valeur mémorisée :

if (tmp_opt.saw_tstamp &&
    tcp_death_row.sysctl_tw_recycle &&
    (dst = inet_csk_route_req(sk, &fl4, req, want_cookie)) != NULL &&
    fl4.daddr == saddr &&
    (peer = rt_get_peer((struct rtable *)dst, fl4.daddr)) != NULL) {
        inet_peer_refcheck(peer);
        if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL &&
            (s32)(peer->tcp_ts - req->ts_recent) >
                                        TCP_PAWS_WINDOW) {
                NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
                goto drop_and_release;
        }
}

Lorsque plusieurs hôtes partagent une même IP (courant avec du NAT), cette condition les empêchent de pouvoir se connecter car ils n’utilisent pas la même horloge pour l’horodatage. Dans le doute, il est donc préférable de ne pas activer cette option car elle conduit à des problèmes difficiles à détecter et difficile à diagnostiquer.

L’état LAST-ACK est géré de la même façon que dans le cas de net.ipv4.tcp_tw_recycle.

Résumé

La solution universelle est d’augmenter le nombre de combinaisons possibles pour les quadruplets en utilisant, par exemple, plusieurs ports côté serveur.

Côté serveur, ne pas activer net.ipv4.tcp_tw_recycle à moins d’être sûr de ne jamais avoir à interagir avec des machines se partageant la même IP. Activer net.ipv4.tcp_tw_reuse est sans effet sur les connexions entrantes.

Côté client, activer net.ipv4.tcp_tw_reuse est une solution quasiment fiable. Activer en plus net.ipv4.tcp_tw_recycle est alors quasi-inutile.

Pour terminer, voici une citation de W. Richard Stevens issue de Unix Network Programming:

L’état TIME_WAIT est notre ami et est là pour nous aider (i.e., permettre aux segments dupliqués d’expirer en transit). Plutôt que de tenter de supprimer cet état, nous devons le comprendre.


  1. Notamment, les paramètres tels que net.netfilter.nf_conntrack_tcp_timeout_time_wait n’ont absolument aucune infuence sur la gestion des connexions dans l’état TIME-WAIT

  2. Ce diagramme est disponible sous la licence LaTeX Project Public License 1.3. Le fichier original est disponible sur cette page

  3. Dans l’état LAST-ACK, une connexion retransmet régulièrement le dernier segment FIN jusqu’à recevoir le segment ACK attendu. Il est donc normalement peu probable de rester très longtemps dans cet état. 

  4. Côté client, les noyaux plus anciens doivent également trouver un tuple local disponible (adresse source, port source) pour chaque connexion sortante. Augmenter les paramètres côté serveur n’a donc pas d’effet. Un noyau Linux 3.2 est toutefois assez récent pour partager un même tuple local vers différentes destinations. Merci à Willy Tarreau pour son point de vue sur la question. 

  5. La dernière solution peut sembler un peu stupide par rapport à l’utilisation de ports supplémentaires mais certains serveurs ne permettent pas d’écouter sur plusieurs ports. L’avant-dernière solution est plus économique en nombre d’IP consommées. 

  6. L’utilisation d’une structure dédiée pour les connexions dans l’état TIME-WAIT remonte au noyau Linux 2.6.14. 

  7. Quand un serveur ferme la connexion en premier, la connexion atteint l’état TIME-WAIT de son côté alors que le client considère que le quadruplet en question est disponible pour une nouvelle connexion. 

01 Mar 16:28

How Modern Light Bulbs Work [Science Video]

by Geeks are Sexy

The science behind modern light bulb technologies.

[Minute Physics]

01 Mar 16:28

Why is Glass Transparent? [Science Video]

by Geeks are Sexy

If you look through your glasses, binoculars or a window, you see the world on the other side. How is it that something so solid can be so invisible? Mark Miodownik melts the scientific secret behind amorphous solids.

[TED Ed | Via LS]

01 Mar 10:11

Facebook : le service email @facebook.com fait un gros flop

Utilisez-vous les adresses email @facebook.com ? Non... vous n'êtes pas les seuls. Le projet Facebook Messages dévoilé en novembre 2010 et dont on se demandait à l'époque s'il n'avait pas l'étoffe d'un Gmail killer a fait un flop. Facebook concède que la plupart des utilisateurs n'ont porté aucun intérêt à une adresse en @facebook.com et annonce le retrait de ce service email.

Facebook-MessagesLes utilisateurs concernés sont prévenus que lorsqu'un email sera envoyé à une adresse @facebook.com, il n'ira plus dans la vue Messages Facebook mais sera redirigé vers l'adresse email principale du compte. Le cas échéant, les utilisateurs peuvent désactiver cette fonctionnalité de transfert qui est activée par défaut.

Une porte-parole de Facebook a précisé que cette étape de transition est prévue pour durer quelques semaines. Désormais, le réseau social explique vouloir se concentrer sur l'amélioration de son service de messagerie sur mobile.

Avec son service email, l'ambition de Facebook était de proposer une boîte de réception unique afin que les utilisateurs envoient et reçoivent des emails et messages, tout en prenant en compte n'importe quel système de messagerie externe au réseau social.

Le service a néanmoins essentiellement mis l'accent sur les messages Facebook et n'a que peu évolué au fil du temps. Presque comme à l'accoutumée, Facebook n'a pas échappé à la polémique lorsqu'il a donné l'impression de vouloir imposer son système @facebook.com.

28 Feb 07:39

Soyons chauvins !

by vidberg

096_sochi2

Vous pouvez me suivre sur twitter , sur facebook et sur google


_VIGNETTE _VIGNETTEb _VIGNETTEc

28 Feb 07:37

Update

I have a bunch of things open right now.
24 Feb 23:55

Gmail : un bouton pour se désinscrire des newsletters

by Pierre

Envie de vous désinscrire d’une newsletter ? Gmail va bientôt faciliter la chose. En effet, à la fin du mois, un bouton de désabonnement fera son apparition sur les mails des sites marchands.

Logo-de-Gmail-par-Google

Lire la suite..

24 Feb 23:41

Légalité des liens hypertextes : d'importantes nuances à apporter

L'arrêt Svensson, sur la légalité des liens hypertextes, est beaucoup plus nuancé que ce que sa conclusion laissait penser. La création d'un lien hypertexte menant vers un contenu protégé est légal, mais seulement selon les circonstances.

Ce jeudi matin, nous rapportions que la CJUE avait jugé conforme à la directive de 2001 sur les droits d'auteur la création de liens hypertextes sans l'autorisation de l'auteur du contenu visé, en prévenant qu'il faudrait attendre de connaître le contenu de la décision pour en mesurer la portée. Or la lecture de l'arrêt Svensson, qui a depuis été publié, oblige à modérer fortement l'enthousiasme.

En effet, contrairement à ce que nous avions (trop) anticipé, la CJUE ne dit pas qu'un lien hypertexte n'est pas en lui-même constitutif d'une "mise à disposition" de l'oeuvre. Elle dit même expressément l'inverse, ce qui est une surprise :

Le fait de fournir, sur un site Internet, des liens cliquables vers des œuvres protégées publiées sans aucune restriction d’accès sur un autre site, offre aux utilisateurs du premier site un accès direct auxdites œuvres. (...)

Or, ainsi qu’il ressort de l’article 3, paragraphe 1, de la directive 2001/29, pour qu’il y ait «acte de communication», il suffit, notamment, qu’une œuvre soit mise à la disposition d’un public de sorte que les personnes qui le composent puissent y avoir accès sans qu’il soit déterminant qu’elles utilisent ou non cette possibilité (voir, par analogie, arrêt du 7 décembre 2006, SGAE, C‑306/05, Rec. p. I‑11519, point 43).

Il s’ensuit que, dans des circonstances telles que celles de l’affaire au principal, le fait de fournir des liens cliquables vers des œuvres protégées doit être qualifié de «mise à disposition» et, par conséquent, d’«acte de communication», au sens de ladite disposition.

Si l'on s'en tient à ce raisonnement, il y a donc bien un droit exclusif à autoriser la création d'un lien hypertexte vers son oeuvre, au nom de la "mise à disposition". En France, ce droit exclusif de mise à disposition n'est pas reconnu à l'auteur, mais à certains titulaires de droits voisins. Par exemple, les producteurs de disques ont un droit exclusif de "mise à la disposition du public par la vente, l'échange ou le louage". Même chose pour les producteurs de vidéos et les chaînes de télévision.

La CJUE reconnaît par ailleurs que la création d'un lien hypertexte constitue un acte de communication au public, qui est cette fois un droit exclusif reconnu également à l'auteur. Mais selon la jurisprudence de la CJUE, il ne faut demander l'autorisation que si la communication s'adresse à un public qui n'était pas déjà visé par une communication précédemment autorisée. 

Or sur ce point :

En l’occurrence, il doit être constaté que la mise à disposition des œuvres concernées au moyen d’un lien cliquable, telle celle au principal, ne conduit pas à communiquer les œuvres en question à un public nouveau.

En effet, le public ciblé par la communication initiale était l’ensemble des visiteurs potentiels du site concerné, car, sachant que l’accès aux œuvres sur ce site n’était soumis à aucune mesure restrictive, tous les internautes pouvaient donc y avoir accès librement.

Dans ces conditions, il y a lieu de constater que, lorsque l’ensemble des utilisateurs d’un autre site auxquels les œuvres en cause ont été communiquées au moyen d’un lien cliquable pouvaient directement accéder à ces œuvres sur le site sur lequel celles-ci ont été communiquées initialement, sans intervention du gérant de cet autre site, les utilisateurs du site géré par ce dernier doivent être considérés comme des destinataires potentiels de la communication initiale et donc comme faisant partie du public pris en compte par les titulaires du droit d’auteur lorsque ces derniers ont autorisé la communication initiale.

Dès lors, faute de public nouveau, l’autorisation des titulaires du droit d’auteur ne s’impose pas à une communication au public telle que celle au principal.

C'est uniquement "dans l’hypothèse où un lien cliquable permet aux utilisateurs du site sur lequel ce lien se trouve de contourner des mesures de restriction prises par le site où se trouve l’œuvre protégée afin d’en restreindre l’accès par le public à ses seuls abonnés et, ainsi, constitue une intervention sans laquelle lesdits utilisateurs ne pourraient pas bénéficier des œuvres diffusées, (qu'il) y a lieu de considérer l’ensemble de ces utilisateurs comme un public nouveau, qui n’a pas été pris en compte par les titulaires du droit d’auteur lorsqu’ils ont autorisé la communication initiale de sorte que l’autorisation des titulaires s’impose à une telle communication au public".

En résumé et sauf erreur d'interprétation de notre part :

  • L'autorisation des producteurs de musique, films, séries TV, émissions TV et autres contenus diffusés par les chaînes de télévision est théoriquement requise pour tout lien menant à leurs contenus, s'il y a "vente, échange ou louage" du lien. Ce pourrait être le cas d'un lien présent sur un site payant.
  • Mais l'autorisation de l'auteur n'est requise que dans le cas où le lien hypertexte permet de communiquer à des internautes un contenu auxquels ils n'auraient pas pu accéder autrement.
24 Feb 23:39

La loi anti-Amazon qui rend les livres plus chers sera soumise à Bruxelles

Aurélie Filippetti a indiqué ce mercredi matin que la loi sur la vente à distance des livres, qui obligera Amazon à faire payer l'intégralité du prix des livres et à imposer des frais de port, sera d'abord soumise à la Commission Européenne avant promulgation.

Aurélie Filippetti était ce matin l'invitée de Jean-Jacques Bourdin sur RMC et BFM TV. L'occasion pour la ministre de la culture de revenir sur la fiscalité des géants du web, et de s'attaquer une nouvelle fois à la concurrence déloyale qu'Amazon ferait aux libraires traditionnels avec ses frais de port gratuits sur les livres.

Un peu perdue dans la navette parlementaire (elle disait que le texte n'avait pas encore été examiné au Sénat alors qu'il a été voté par la chambre haute en début d'année, et doit retourner à l'Assemblée Nationale pour une seconde lecture), Aurélie Filippetti a fait savoir que le texte ne serait pas applicable immédiatement après son adoption au Parlement.

Alors que le Sénat avait pris soin d'ajouter un délai d'application de trois mois après promulgation, pour laisser le temps aux librairies en ligne de s'adapter à la nouvelle législation, la ministre de la Culture a indiqué ce mercredi matin que le texte devra être soumis pour approbation à la Commission européenne. A notre connaissance ce point n'avait jamais été soulevé lors des débats parlementaires, et ne figure pas dans aucun des rapports soumis au Parlement, ni celui de l'Assemblée Nationale, ni celui du Sénat.

Alors que Jean-Jacques Bourdin en concluait que le texte ne serait pas applicable avant plusieurs années, Aurélie Filippetti a souri et reconnu au moins "plusieurs mois" de délai. Sauf si la Commission juge le dispositif contraire aux textes européens, et demande à la France de renoncer à promulguer la loi.

Rappelons qu'en l'état des discussions, le projet de loi sur la vente à distance des livres prévoit que les sites internet devront afficher le prix fort sur les livres, égale à 100 % du prix fixé par l'éditeur, alors que les librairies physiques pourront toujours afficher un prix réduit de 5 %. Les marchands en ligne auront l'obligation d'imposer des frais de port (même s'il s'agit d'un centime seulement) et pourront, au moment du calcul de ces frais de port, déduire au maximum ce qui aurait été accordé par la remise des 5 %.

Concrètement, l'internaute qui achète un livre en librairie physique le paiera donc au minimum 5 % moins cher que s'il l'achète sur Internet, où il devra payer l'intégralité du prix plus, éventuellement, le résidu de frais de port.

24 Feb 23:26

Intro to MySQL Information Schema

by Noel Herrick

Databases store information, right? Well, what if they could store information about your information so you could query it? Good news! Most database engines such as MySQL implement Information Schema, or a set of views that describe your tables and columns. If you’ve ever used a language like Java or C#, you might be familiar with reflection: the ability to read an object’s metadata. This enables you to do meta-programming, or writing logic about the program itself.

The idea of Information Schema is like reflection: they are views in your database that you can use in your programs or scripts when you need to know what the schema looks like or check the health of the instance. Unlike Show Processlist or Desc Table commands, the results are in tabular format.

I’m going to tour through six important views, and I’ll point you to some others at the end. Let’s get started.

Information_Schema.Tables

Let’s begin at the beginning, with the tables that make up your database. This view has the basic items like table name, the storage engine, and the collation (the way the table sorts text). There’s a column called table_catalog that I want to call out, mostly because any field in these views named *_catalog is useless – it’s always “def”. The database name is in the *_schema columns.

A great use of this view is querying to see what the biggest tables are:

Select
   Concat(table_schema, '.', table_name) As "Name"
  ,Concat(Round(table_rows / 1000000, 2), 'M') As "Rows"
  ,Concat(Round(data_length / ( 1024 * 1024 * 1024 ), 2), 'G') As "Row Size"
  ,Concat(Round(index_length / ( 1024 * 1024 * 1024 ), 2), 'G') As "Index Size"
  ,Concat(Round(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') As "Total"
  ,Round(index_length / data_length, 2) "Row / Index Ratio"
From information_schema.TABLES
Order By data_length + index_length DESC
Limit 10;

This gets the top 10 tables by size (thanks to Peter Zaitsev)

Another clever use is finding tables that are using the wrong collation or storage engine:

mysql> Select Table_Name
    -> From Information_Schema.Tables
    -> Where Engine <> 'innodb' and Table_Schema = 'employees';
+------------+
| Table_Name |
+------------+
| offender   |
+------------+
1 row in set (0.00 sec)

Documentation

Information_Schema.Columns

What would a table be without columns? This next view lists out the columns with their data types, character sets, position in the table, etc. An example use would be a migration script that would select from this view to see if the column has already been created, and if it has, move on to the next migration. You can also use view to search for a column name:

mysql> Select Table_Name, Column_Name From Information_schema.Columns
    -> Where Column_Name Like '%name%' And Table_Schema = 'employees';
+-------------+-------------+
| Table_Name  | Column_Name |
+-------------+-------------+
| departments | dept_name   |
| employees   | first_name  |
| employees   | last_name   |
| form        | Name        |
+-------------+-------------+
4 rows in set (0.02 sec)

Documentation

Information_Schema.Referential_Constraints

This shows you foreign keys (I hope foreign keys aren’t an alien concept… get it?) This table allows you to see the relationships between tables, which will in turn help you understand the schema as a whole.

mysql> Select
    ->    Table_Name
    ->   ,Constraint_Name
    ->   ,Referenced_Table_Name Ref_Tbl
    ->   ,Unique_Constraint_Name As Ref_Cnstr
    -> From Information_schema.Referential_Constraints
    -> Where Constraint_Schema = 'employees';
+--------------+---------------------+-------------+-----------+
| Table_Name   | Constraint_Name     | Ref_Tbl     | Ref_Cnstr |
+--------------+---------------------+-------------+-----------+
| dept_emp     | dept_emp_ibfk_1     | employees   | PRIMARY   |
| dept_emp     | dept_emp_ibfk_2     | departments | PRIMARY   |
| dept_manager | dept_manager_ibfk_1 | employees   | PRIMARY   |
| dept_manager | dept_manager_ibfk_2 | departments | PRIMARY   |
| salaries     | salaries_ibfk_1     | employees   | PRIMARY   |
| titles       | titles_ibfk_1       | employees   | PRIMARY   |
+--------------+---------------------+-------------+-----------+
6 rows in set (0.00 sec)

This is the output from running on the employees sample database. While all the foreign keys reference the primary key of another table, you can also reference any unique constraint (a primary key is just a not-null unique constraint).

Documentation

Information_Schema.Key_Column_Usage

While the name sounds like it deals with indexes, it doesn’t. The main purpose of this table is to show those columns that make up the primary, unique, and foreign key constraints in the system. While not super useful by itself, it can be combined with other views to help you script out things such as dropping and restoring foreign keys (say you wanted to load a big table, but didn’t want each row to be verified, so you drop the FKs then add them when the table is finished loading).

Select
    CONCAT('ALTER TABLE ', table_name, ' ADD CONSTRAINT ', constraint_name,
	' FOREIGN KEY (', ReferencingColumns,
    ') REFERENCES ', referenced_table_name, '(', ReferencedColumns, ')',
    ' ON DELETE ', delete_rule, ' ON UPDATE ', update_rule, ';')
    AS CreateStatement,
    CONCAT('ALTER TABLE ', table_name, ' DROP FOREIGN KEY ', constraint_name, ';')
    AS DropStatement
From
(
Select
     kcu.constraint_name
    ,kcu.table_name
    ,kcu.referenced_table_name
    ,GROUP_CONCAT(DISTINCT CONCAT('`',referenced_column_name,'`')  ORDER BY ordinal_position)
		As ReferencedColumns
    ,GROUP_CONCAT(DISTINCT CONCAT('`',column_name,'`') ORDER BY ordinal_position)
		As ReferencingColumns
    ,rc.update_rule
    ,rc.delete_rule
From Information_schema.key_column_usage kcu
Join Information_schema.referential_constraints rc
    On rc.constraint_schema = kcu.table_schema
    And rc.constraint_name = kcu.constraint_name
    And rc.table_name = kcu.table_name
Where
    kcu.table_schema='employees'
	And
	kcu.table_name='titles'
Group By
     kcu.constraint_name
    ,kcu.table_name
    ,kcu.referenced_table_name
    ,rc.update_rule
    ,rc.delete_rule
) AS Q

Documentation

Information_Schema.Processlist

You’re probably familiar with Show Processlist, the command that has been used in anger many times by DBAs who are troubleshooting production slowness or query timeouts. This is roughly the same information, but presented in a nice tabular format.

mysql> Select User, Command, Time From Information_schema.processlist;
+------+---------+------+
| User | Command | Time |
+------+---------+------+
| root | Sleep   |   86 |
| root | Sleep   |  439 |
| root | Query   |    0 |
+------+---------+------+
3 rows in set (0.01 sec)

Documentation

Information_Schema.InnoDb_Lock_Waits

This is a lifesaver: it can show you exactly who’s gumming up the works in your system. I’ve used this query many times to help troubleshoot issues and get them resolved:

Select
   r.trx_id waiting_trx_id
  ,r.trx_mysql_thread_id waiting_thread
  ,r.trx_query waiting_query
  ,b.trx_id blocking_trx_id
  ,b.trx_mysql_thread_id blocking_thread
  ,b.trx_query blocking_query
From information_schema.innodb_lock_waits w
Join information_schema.innodb_trx b On b.trx_id = w.blocking_trx_id
Join information_schema.innodb_trx r On r.trx_id = w.requesting_trx_id;

Nice, huh? That script comes from here (http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-information-schema-examples.html). It’s not a very useful view by itself. The only thing it can tell you is whether there are a bunch of waiting queries. However, combined with Information_Schema.InnoDb_Trx, you can quickly discover what queries are destroying your system.

InnoDb_Lock_Waits
InnoDb_Trx

Other views

While that wasn’t an extensive review, it does introduce you to the idea and how to use the views to make your life easier. Read the docs and get creative in the ways you combine them. They can give you sight where previously you were blind.

Some other tables I’d look at are Information_Schema.Statistics, which shows the index columns along with their cardinality, and Information_Schema.InnoDb_Buffer_Pool_Stats, which dives into statistics on the InnoDB buffer pool.

If you’ve made it this far, you should go ahead and subscribe to my MySQL Simplified newsletter.

Want to hear more about what I’ve learned about MySQL? You can subscribe below and I’ll send you updates on a new book I’m writing that helps you find the goodies in MySQL. If you sign-up, I’ll also send out stuff on MySQL like tips and tutorials.

Email

Your Name

 No spam


References

Information Schema

InnoDB-Specific Information Schema


PlanetMySQL Voting: Vote UP / Vote DOWN
24 Feb 23:03

crowd42 : Astuce : désactiver la mise en cache des copies de paquets par APT

by crowd42

Quand vous installez ou désinstaller un paquet avec apt-get ou aptitude sur Debian et Ubuntu (ou toute autre distribution basée sur Debian), une copie est faite du paquet et sauvegardé dans /var/cache/apt/archive. Au bout de quelques mois vous risquez de vous retrouver avec un répertoire qui contient plusieurs Go de .deb.

Il existe plusieurs commandes pour vider le répertoire cache de tous ces paquets, de la plus bourrin à la plus “élégante“. Commençons par la dernière :

sudo apt-get autoclean

Cette ligne de commande supprimera toutes copies des anciennes versions des paquets dans /var/cache/apt/archives et qui ne sont plus présents dans les dépôts  et ne gardera que celles qui sont à jour.

sudo apt-get clean

Contrairement à autoclean, clean va supprimer tous les paquets du répertoire /var/cache/apt/archives. Personnellement c’est celle-là que je préfère et que j’utilise.

sudo rm -rf /var/cache/apt/archives

Sans doute la plus bourrin. Même si elle fonctionne. je la déconseille surtout aux gens un peu distraits, on est jamais à l’abri avec rm.

Si vous souhaitez empêcher APT de faire des copies des paquets dans var/cache/apt/archives, créez ce nouveau fichier :

sudo vim /etc/apt/apt.conf.d/02nocache

Ensuite, ajoutez ces deux lignes :

Dir::Cache "";
Dir::Cache::archives "";

Et c’est tout. Enjoy it ;)

Cet article Astuce : désactiver la mise en cache des copies de paquets par APT est apparu en premier sur crowd42.

Gravatar de crowd42
Original post of crowd42.Votez pour ce billet sur Planet Libre.

23 Feb 10:16

En bref : Galileo achève avec succès sa validation en orbite

Lorsqu'elle sera pleinement opérationnelle, la constellation Galileo comptera 30 satellites positionnés à 23.222 kilomètres d’altitude. © OHBLorsqu'elle sera pleinement opérationnelle, la constellation Galileo comptera 30 satellites positionnés à 23.222 kilomètres d’altitude. © OHB

En bref : Galileo achève avec succès sa validation en orbite - 1 Photo

Les quatre satellites de Galileo dits de développement et de validation en orbite (IOV, In-Orbit Validation) ont rempli leur tâche. Lancés par paires depuis le Centre spatial de Kourou en octobre 2011 et en octobre 2012, ils ont validé les segments sol et spatial de la constellation Galileo. Après avoir réussi à faire fonctionner la constellation en mars 2013, en effectuant les premières mesures de géolocalisation, avec un signal d’une précision de 10 à 15 mètres, l’Agence spatiale européenne annonce que la phase de validation en orbite s’achève avec succès. Cette phase consistait à s’assurer que les performances du système avec quatre satellites correspondent bien aux spécifications du cahier des charges lorsque la constellation sera déployée et complètement opérationnelle.

Pour s’assurer de ce bon fonctionnement en matière de localisation, de précision et de rapidité, l’Esa a fait parcourir quelque 10.000 kilomètres à des véhicules d’essai et mis à contribution un certain nombre de piétons. Résultat : après plusieurs mois d’utilisation, il ressort que la précision actuelle de positionnement en bifréquence de Galileo est en moyenne de huit mètres en horizontal et de neuf mètres en vertical, à 95 % de fiabilité. Quant à la précision des horloges atomiques, elle est de l’ordre de la nanoseconde.

Autre bonne surprise, le service de recherche et de sauvetage de Galileo du programme international Cospas-Sarsat. En tout, 77 % des lieux de détresse simulés ont été localisés à moins de 2 km, et 95 % à moins de 5 km. Toutes les alertes ont été détectées et transmises au centre de contrôle en une minute et demie, alors qu'il était prévu de le faire dans un délai de dix minutes maximum. Au fur et à mesure des lancements de satellites Galileo, la constellation proposera progressivement plusieurs niveaux de services (cinq en tout) à l'accès ouvert ou bien plus ou moins restreint. Pour cela, les satellites émettront chacun dix signaux différents : six sont prévus pour des applications civiles, deux pour des applications commerciales et deux pour des services étatiques.


Sur le même sujet

22 Feb 14:18

Transfusion : des plaquettes fabriquées à partir de cellules souches

Les plaquettes (au centre) sont présentes dans le sang avec les globules rouges (à gauche) et les globules blancs (à droite). On pourra probablement bientôt les produire artificiellement et en grande quantité afin de les utiliser pour une transfusion. © Wikimedia Commons, DPLes plaquettes (au centre) sont présentes dans le sang avec les globules rouges (à gauche) et les globules blancs (à droite). On pourra probablement bientôt les produire artificiellement et en grande quantité afin de les utiliser pour une transfusion. © Wikimedia Commons, DP

Transfusion : des plaquettes fabriquées à partir de cellules souches - 2 Photos

Petits éléments dépourvus de noyau, les plaquettes, ou thrombocytes, circulent dans le sang à côté des globules blancs et des globules rouges. Leur rôle est primordial pour l’intégrité des vaisseaux sanguins. En cas de lésion, elles se collent sur la paroi blessée et s’agrègent afin de colmater rapidement la brèche. Les personnes en manque de ces précieuses plaquettes courent donc un risque majeur d’hémorragie et doivent se faire transfuser régulièrement. C’est le cas par exemple des individus atteints de leucémie ou des malades qui subissent un traitement lourd par chimiothérapie.

Pour faire face à ce besoin, diverses associations appellent souvent la population aux dons du sang. Cependant, contrairement aux globules rouges qui peuvent être gardés au frais plusieurs semaines, les plaquettes sont plus fragiles et ne se conservent pas plus de cinq jours. D’autre part, avec le vieillissement de la population, les besoins en plaquettes risquent de se renforcer. Les scientifiques sont donc à la recherche de solutions alternatives pour apporter des plaquettes aux malades qui n’en fabriquent pas suffisamment. Une équipe japonaise de l’université de Kyoto vient de faire une avancée dans ce sens. Elle a en effet réussi à fabriquer rapidement de grandes quantités de plaquettes à partir de cellules souches, celles à l’origine de toutes les cellules du corps. Sa stratégie, présentée dans la revue Cell Stem Celldevrait permettre de mieux subvenir aux attentes de la population.

Les plaquettes (platelets en anglais) sont des éléments du sang qui ne possèdent pas de noyau. Elles sont formées par fragmentation des mégacaryocytes, de grandes cellules contenues dans la moelle osseuse.
Les plaquettes (platelets en anglais) sont des éléments du sang qui ne possèdent pas de noyau. Elles sont formées par fragmentation des mégacaryocytes, de grandes cellules contenues dans la moelle osseuse. © BruceBlaus, Wikimedia Commons, cc by 3.0

Ces dernières années, la recherche sur les cellules souches a fait d’énormes progrès, en particulier depuis la découverte des cellules souches pluripotentes induites (CSPi), des cellules souches fabriquées à partir de cellules déjà différenciées, des cellules de la peau par exemple. Récemment, les chercheurs japonais ont réussi à fabriquer des plaquettes à partir de CSPi, mais leur méthode n’était pas assez performante pour en produire suffisamment pour une transfusion.

L’équipe s’est donc à nouveau penchée sur la question afin de mettre au point une tactique plus efficace. Après plusieurs mois de travail intense, tous ces efforts ont fini par payer. La technique consiste à stimuler l’activité de trois gènes particuliers des CSPi pour forcer leur différenciation en précurseurs des mégacaryocytes, des cellules géantes à l’origine des plaquettes. En réprimant ensuite les trois mêmes gènes, les chercheurs ont induit leur maturation en mégacaryocytes puis en plaquettes. D’après les résultats, il est ainsi possible d’obtenir un très grand nombre de plaquettes en seulement cinq jours ! D’autre part, les précurseurs des mégacaryocytes peuvent se conserver en culture pendant plusieurs mois et constituent ainsi une source stable de plaquettes sanguines.

Pour tester la fonctionnalité des plaquettes artificielles, les auteurs les ont injectées dans une souris souffrant d’hémorragies internes. Expérience réussie : les plaquettes se sont agrégées sur les plaies et ont correctement colmaté les brèches. « Je pense que nous sommes très proches d’une utilisation chez l’Homme », indique Denisa Wagner, chercheuse à l’université Harvard à Boston (États-Unis). Cependant, de nombreuses études restent à faire, notamment pour améliorer la qualité des plaquettes artificielles. « Elles fonctionnent correctement mais pas aussi bien que les vraies », explique Nicolas Pineault, un biologiste aux Canadian Blood Services à Ottawa (Canada). Les scientifiques japonais ont donc encore du travail avant les essais cliniques qu’ils aimeraient démarrer d’ici deux à trois ans.


Sur le même sujet

15 Feb 14:58

alterlibriste : La tendance Nest, révélatrice d'une incapacité à utiliser la technologie

by alterlibriste

Dans le dernier 56Kast que j’avais présenté dernièrement, Erwan Cario analyse de manière assez intéressante le dernier achat de Google, et non des moindre en termes financiers, à savoir Nest, dont il est impossible de ne pas avoir entendu parlé ces dernières semaines.

Le propos est celui donné dans son papier du 16 janvier, à savoir qu’un tel investissement pour des thermostats, ça semble un peu démesuré alors qu’on peut trouver des thermostats pour à peine quelques dizaines d’Euros. Sauf que ces thermostats sont top branchés aux États-Unis (vous avez dit geek ?) parce qu’ils sont beaux, simples à utiliser et en plus ils apprennent tout seul : ils détectent votre présence et en fonction de ce que vous lui dites (un peu plus/moins chaud), ils apprennent vos habitudes et vous permettent d’économiser de l’énergie (vous avez dit greenwashing ?) en fonctionnant de façon optimum pour ne chauffer que lorsque vous en avez besoin.
Certes. Sur le coup, je me dis c’est bien sympa comme fonctionnalité.
Le détail un peu chagrinant, c’est qu’il est connecté en permanence (vous savez, l’internet des objets) et du coup Google qui savait déjà où vous vous déplaciez hors de chez vous (grâce à votre agenda, vos calculs d’itinéraires et bien sûr votre géolocalisation) va maintenant savoir ce que vous faites chez vous, quand vous dormez, combien vous êtes, si vous recevez et même si vous vous levez la nuit.
Là, un peu bête que je suis, je me demande pourquoi ce thermostat a besoin d’être connecté en permanence ; mais c’est juste parce que je suis un improbable démuni de smartphone, car mais c’est bien sûr, c’est pour pouvoir règler votre thermostat à distance au cas où vous ne rentreriez pas à l’heure ou que vous voudriez faire chauffer la maison avant d’arriver (donc il n’est pas si intelligent que ça ce thermostat).

Et finalement, je me suis dit : moi, mon thermostat, je le règle pour chaque jour selon mes habitudes et souhaits et que manuellement, je peux le mettre en température haute ou basse et l’augmenter ou le baisser un peu si j’en ai envie.
Ah oui mais il y a au moins 5 boutons et c’est un peu compliqué.
Donc bah oui, c’est tellement plus simple de confier sa vie privée que d’apprendre à utiliser un petit appareil électronique.

Gravatar de alterlibriste
Original post of alterlibriste.Votez pour ce billet sur Planet Libre.

Articles similaires

08 Feb 10:40

Why is the Solar System Flat? [Science Video]

by Geeks are Sexy

A quick explanation of why our solar system is flat.

[Minute Physics]